Showing preview only (1,364K chars total). Download the full file or copy to clipboard to get everything.
Repository: tsl0922/ttyd
Branch: main
Commit: 647d55ad865f
Files: 55
Total size: 1.3 MB
Directory structure:
gitextract_90qmtrh_/
├── .clang-format
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── support-request.md
│ └── workflows/
│ ├── backend.yml
│ ├── docker.yml
│ ├── frontend.yml
│ └── release.yml
├── .gitignore
├── CMakeLists.txt
├── Dockerfile
├── Dockerfile.alpine
├── LICENSE
├── README.md
├── app.rc.in
├── cmake/
│ └── GetGitVersion.cmake
├── html/
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .prettierrc.js
│ ├── .yarn/
│ │ └── patches/
│ │ └── zmodem.js-npm-0.1.10-e5537fa2ed.patch
│ ├── .yarnrc.yml
│ ├── README.md
│ ├── gulpfile.js
│ ├── package.json
│ ├── src/
│ │ ├── components/
│ │ │ ├── app.tsx
│ │ │ ├── modal/
│ │ │ │ ├── index.tsx
│ │ │ │ └── modal.scss
│ │ │ └── terminal/
│ │ │ ├── index.tsx
│ │ │ └── xterm/
│ │ │ ├── addons/
│ │ │ │ ├── overlay.ts
│ │ │ │ └── zmodem.ts
│ │ │ └── index.ts
│ │ ├── index.tsx
│ │ ├── style/
│ │ │ └── index.scss
│ │ └── template.html
│ ├── tsconfig.json
│ └── webpack.config.js
├── man/
│ ├── README.md
│ ├── ttyd.1
│ └── ttyd.man.md
├── scripts/
│ └── cross-build.sh
├── snap/
│ └── snapcraft.yaml
└── src/
├── compat.h
├── html.h
├── http.c
├── protocol.c
├── pty.c
├── pty.h
├── server.c
├── server.h
├── utils.c
└── utils.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
BasedOnStyle: Google
Language: Cpp
ColumnLimit: 120
IndentWidth: 2
TabWidth: 2
UseTab: Never
================================================
FILE: .gitattributes
================================================
src/html.h linguist-generated
================================================
FILE: .github/FUNDING.yml
================================================
github: tsl0922
patreon: tsl0922
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment:**
- OS: [e.g. macOS 10.15.2]
- Browser: [e.g. Chrome 79.0.3945.130]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/support-request.md
================================================
---
name: Support Request
about: Support request or question
title: ''
labels: question
assignees: ''
---
Describe your problem or question here.
================================================
FILE: .github/workflows/backend.yml
================================================
name: backend
on:
push:
paths:
- ".github/workflows/backend.yml"
- "CMakeLists.txt"
- "src/*"
- "scripts/*"
pull_request:
paths:
- ".github/workflows/backend.yml"
- "CMakeLists.txt"
- "src/*"
- "scripts/*"
workflow_call:
jobs:
msvc:
runs-on: windows-latest
env:
VCPKG_ROOT: ${{ github.workspace }}/vcpkg
VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg.exe
VCPKG_TRIPLET: x64-windows-static
TOOLCHAIN_FILE: ${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake
steps:
- uses: actions/checkout@v6
- name: Checkout vcpkg
uses: actions/checkout@v6
with:
repository: microsoft/vcpkg
path: vcpkg
- name: Bootstrap vcpkg
shell: pwsh
run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.bat
- name: Install dependencies
shell: pwsh
run: |
$env:VCPKG_ROOT = "${{ env.VCPKG_ROOT }}"
${{ env.VCPKG_EXE }} install --triplet ${{ env.VCPKG_TRIPLET }} libwebsockets libuv json-c zlib openssl getopt-win32
- name: Build with MSVC
shell: pwsh
run: |
$env:VCPKG_ROOT = "${{ env.VCPKG_ROOT }}"
cmake -S . -B build -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE="${{ env.TOOLCHAIN_FILE }}" -DVCPKG_TARGET_TRIPLET=${{ env.VCPKG_TRIPLET }}
cmake --build build --config Release
- uses: actions/upload-artifact@v7
with:
name: ttyd.msvc
path: build/Release/ttyd.exe
cross:
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
target: [i686, x86_64, arm, armhf, aarch64, mips, mipsel, mips64, mips64el, ppc64, ppc64le, s390x, win32]
steps:
- uses: actions/checkout@v6
- name: Install packages
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential cmake curl file libtool
- name: Cross build (${{ matrix.target }})
env:
BUILD_TARGET: ${{ matrix.target }}
run: ./scripts/cross-build.sh
- uses: actions/upload-artifact@v7
with:
name: ttyd.${{ matrix.target }}
path: build/ttyd*
================================================
FILE: .github/workflows/docker.yml
================================================
name: docker
on:
push:
branches: main
tags: ["*"]
jobs:
build:
runs-on: ubuntu-24.04
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout@v6
- name: Install packages
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential cmake curl file libtool
- name: Cross build multi-arch binary
run: |
mkdir dist
for arch in amd64 armv7 arm64 s390x; do
env BUILD_TARGET=$arch ./scripts/cross-build.sh
[ "$arch" = "armv7" ] && arch="arm"
mkdir -p dist/$arch && cp build/ttyd dist/$arch/ttyd
done
- uses: docker/setup-qemu-action@v4
- uses: docker/setup-buildx-action@v4
- uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_HUB_USER }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Determine docker tags
id: docker_tag
run: |
case $GITHUB_REF in
refs/tags/*)
TAG_NAME=${GITHUB_REF#refs/tags/}
echo "DOCKER_TAG=tsl0922/ttyd:${TAG_NAME}" >> $GITHUB_ENV
echo "ALPINE_TAG=tsl0922/ttyd:${TAG_NAME}-alpine" >> $GITHUB_ENV
;;
*)
echo "DOCKER_TAG=tsl0922/ttyd:latest" >> $GITHUB_ENV
echo "ALPINE_TAG=tsl0922/ttyd:alpine" >> $GITHUB_ENV
esac
- name: build/push docker image
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/s390x
push: true
tags: |
${{ env.DOCKER_TAG }}
ghcr.io/${{ env.DOCKER_TAG }}
- name: build/push docker image (alpine)
uses: docker/build-push-action@v7
with:
context: .
file: ./Dockerfile.alpine
platforms: linux/amd64,linux/arm/v7,linux/arm64,linux/s390x
push: true
tags: |
${{ env.ALPINE_TAG }}
ghcr.io/${{ env.ALPINE_TAG }}
================================================
FILE: .github/workflows/frontend.yml
================================================
name: frontend
on:
push:
paths:
- ".github/workflows/frontend.yml"
- "html/*"
pull_request:
paths:
- ".github/workflows/frontend.yml"
- "html/*"
jobs:
build:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 18
- name: Run yarn install, check and build
run: |
corepack enable
corepack prepare yarn@stable --activate
yarn install
yarn run check
yarn run build
working-directory: html
================================================
FILE: .github/workflows/release.yml
================================================
name: release
on:
push:
tags: ["*"]
jobs:
build:
uses: ./.github/workflows/backend.yml
publish:
needs: [build]
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: Check version bump
run: |
TAG=$(git describe --tags --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8)
VERSION=$(grep project CMakeLists.txt| awk '{print $3}')
if [ "$TAG" != "$VERSION" ]; then
echo "=== Version in CMakeLists.txt and git tag does not match!"
echo "=== Git Tag: $TAG, Version: $VERSION"
exit 1
fi
- uses: actions/download-artifact@v8
- run: |
mkdir build
for file in ttyd.*/*; do
target=$(echo $file | awk -F/ '{print $1}')
[[ $file == *.exe ]] && target="$target.exe"
mv $file build/$target
done
pushd build; sha256sum ttyd.* > SHA256SUMS; popd
- uses: ncipollo/release-action@v1
with:
artifacts: build/*
allowUpdates: true
draft: true
================================================
FILE: .gitignore
================================================
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
# Cmake files
CMakeCache.txt
CMakeFiles
CMakeScripts
cmake_install.cmake
install_manifest.txt
CTestTestfile.cmake
build
# Clion files
.idea/
# VSCode files
.vscode/
# Project files
!init.d
================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required(VERSION 3.12.0)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
project(ttyd VERSION 1.7.7 LANGUAGES C)
set(TTYD_VERSION "${PROJECT_VERSION}")
include(GetGitVersion)
get_git_version(GIT_VERSION SEM_VER)
get_git_head(GIT_COMMIT)
if("${SEM_VER}" VERSION_GREATER "${TTYD_VERSION}")
set(TTYD_VERSION "${SEM_VER}")
endif()
if(NOT "${GIT_COMMIT}" STREQUAL "")
set(TTYD_VERSION "${TTYD_VERSION}-${GIT_COMMIT}")
endif()
if(NOT MSVC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE")
if(CMAKE_VERSION VERSION_LESS "3.1")
if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
else()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
endif()
else()
set(CMAKE_C_STANDARD 99)
endif()
else()
# MSVC: suppress common warnings for C99 code
add_compile_options(/W3 /wd4996 /wd4267 /wd4244)
add_compile_definitions(_CRT_SECURE_NO_WARNINGS _GNU_SOURCE)
endif()
set(SOURCE_FILES src/utils.c src/pty.c src/protocol.c src/http.c src/server.c)
include(FindPackageHandleStandardArgs)
find_path(LIBUV_INCLUDE_DIR NAMES uv.h)
find_library(LIBUV_LIBRARY NAMES uv libuv)
find_package_handle_standard_args(LIBUV REQUIRED_VARS LIBUV_LIBRARY LIBUV_INCLUDE_DIR)
mark_as_advanced(LIBUV_INCLUDE_DIR LIBUV_LIBRARY)
if(LIBUV_FOUND)
SET(LIBUV_INCLUDE_DIRS "${LIBUV_INCLUDE_DIR}")
SET(LIBUV_LIBRARIES "${LIBUV_LIBRARY}")
endif()
find_path(JSON-C_INCLUDE_DIR NAMES json.h PATH_SUFFIXES json-c)
find_library(JSON-C_LIBRARY NAMES json-c)
find_package_handle_standard_args(JSON-C REQUIRED_VARS JSON-C_LIBRARY JSON-C_INCLUDE_DIR)
mark_as_advanced(JSON-C_INCLUDE_DIR JSON-C_LIBRARY)
if(JSON-C_FOUND)
SET(JSON-C_INCLUDE_DIRS "${JSON-C_INCLUDE_DIR}")
SET(JSON-C_LIBRARIES "${JSON-C_LIBRARY}")
endif()
find_package(ZLIB REQUIRED)
find_package(Libwebsockets 3.2.0 REQUIRED)
set(INCLUDE_DIRS ${ZLIB_INCLUDE_DIR} ${LIBWEBSOCKETS_INCLUDE_DIRS} ${JSON-C_INCLUDE_DIRS} ${LIBUV_INCLUDE_DIRS})
if(MSVC)
# vcpkg's LIBWEBSOCKETS_LIBRARIES lists both 'websockets' and 'websockets_shared'
# but only one target exists per triplet, so resolve the correct one.
if(TARGET websockets_shared)
set(LINK_LIBS ${ZLIB_LIBRARIES} websockets_shared ${JSON-C_LIBRARIES} ${LIBUV_LIBRARIES})
elseif(TARGET websockets)
set(LINK_LIBS ${ZLIB_LIBRARIES} websockets ${JSON-C_LIBRARIES} ${LIBUV_LIBRARIES})
endif()
else()
set(LINK_LIBS ${ZLIB_LIBRARIES} ${LIBWEBSOCKETS_LIBRARIES} ${JSON-C_LIBRARIES} ${LIBUV_LIBRARIES})
endif()
set (CMAKE_REQUIRED_INCLUDES ${INCLUDE_DIRS})
include(CheckSymbolExists)
check_symbol_exists(LWS_WITH_LIBUV "lws_config.h" LWS_WITH_LIBUV)
check_symbol_exists(LWS_OPENSSL_SUPPORT "lws_config.h" LWS_OPENSSL_ENABLED)
check_symbol_exists(LWS_WITH_MBEDTLS "lws_config.h" LWS_MBEDTLS_ENABLED)
if(NOT LWS_WITH_LIBUV)
message(FATAL_ERROR "libwebsockets was not build with libuv support (-DLWS_WITH_LIBUV=ON)")
endif()
if(LWS_OPENSSL_ENABLED AND NOT LWS_MBEDTLS_ENABLED)
find_package(OpenSSL REQUIRED)
list(APPEND INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
list(APPEND LINK_LIBS ${OPENSSL_LIBRARIES})
endif()
if(WIN32)
# libuv static requires dbghelp for MiniDumpWriteDump/Sym* APIs
list(APPEND LINK_LIBS shell32 ws2_32 dbghelp)
if(MSVC)
find_package(getopt CONFIG)
if(getopt_FOUND)
if(TARGET getopt::getopt_shared)
list(APPEND LINK_LIBS getopt::getopt_shared)
elseif(TARGET getopt::getopt_static)
list(APPEND LINK_LIBS getopt::getopt_static)
endif()
endif()
endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/app.rc.in ${CMAKE_CURRENT_BINARY_DIR}/app.rc @ONLY)
list(APPEND SOURCE_FILES ${CMAKE_CURRENT_BINARY_DIR}/app.rc)
else()
find_library(LIBUTIL NAMES util)
if(LIBUTIL)
list(APPEND LINK_LIBS util)
endif()
endif()
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${LINK_LIBS})
target_compile_definitions(${PROJECT_NAME} PUBLIC
TTYD_VERSION="${TTYD_VERSION}"
$<$<PLATFORM_ID:Windows>:_WIN32_WINNT=0xa00 WINVER=0xa00>
)
include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT prog)
install(FILES man/ttyd.1 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" COMPONENT doc)
================================================
FILE: Dockerfile
================================================
FROM ubuntu:24.04
ARG TARGETARCH
# Dependencies
RUN apt-get update && apt-get install -y --no-install-recommends tini && rm -rf /var/lib/apt/lists/*
# Application
COPY ./dist/${TARGETARCH}/ttyd /usr/bin/ttyd
EXPOSE 7681
WORKDIR /root
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["ttyd", "-W", "bash"]
================================================
FILE: Dockerfile.alpine
================================================
FROM alpine
ARG TARGETARCH
# Dependencies
RUN apk add --no-cache bash tini
# Application
COPY ./dist/${TARGETARCH}/ttyd /usr/bin/ttyd
EXPOSE 7681
WORKDIR /root
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["ttyd", "-W", "bash"]
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2016-2026 Shuanglei Tao <tsl0922@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================


[](https://github.com/tsl0922/ttyd/releases)
[](https://hub.docker.com/r/tsl0922/ttyd)
[](https://repology.org/project/ttyd/versions)

# ttyd - Share your terminal over the web
ttyd is a simple command-line tool for sharing terminal over the web.

# Features
- Built on top of [libuv](https://libuv.org) and [WebGL2](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) for speed
- Fully-featured terminal with [CJK](https://en.wikipedia.org/wiki/CJK_characters) and IME support
- [ZMODEM](https://en.wikipedia.org/wiki/ZMODEM) ([lrzsz](https://ohse.de/uwe/software/lrzsz.html)) / [trzsz](https://trzsz.github.io) file transfer support
- [Sixel](https://en.wikipedia.org/wiki/Sixel) image output support ([img2sixel](https://saitoha.github.io/libsixel) / [lsix](https://github.com/hackerb9/lsix))
- SSL support based on [OpenSSL](https://www.openssl.org) / [Mbed TLS](https://github.com/Mbed-TLS/mbedtls)
- Run any custom command with options
- Basic authentication support and many other custom options
- Cross platform: macOS, Linux, FreeBSD/OpenBSD, [OpenWrt](https://openwrt.org), Windows
# Installation
## Install on macOS
- Install with [Homebrew](http://brew.sh): `brew install ttyd`
- Install with [MacPorts](https://www.macports.org): `sudo port install ttyd`
## Install on Linux
- Install on Debian/Ubuntu: `sudo apt install ttyd`
- Install the snap: `sudo snap install ttyd --classic`
- Install on OpenWrt: `opkg install ttyd`
- Install on Gentoo: clone the [repo](https://bitbucket.org/mgpagano/ttyd/src/master) and follow the directions [here](https://wiki.gentoo.org/wiki/Custom_repository#Creating_a_local_repository).
- Install with [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) : `brew install ttyd`
- Precompiled static binaries: download from the [releases](https://github.com/tsl0922/ttyd/releases) page
## Install on Windows
- Binary version (recommended): download from the [releases](https://github.com/tsl0922/ttyd/releases) page
- Install with [WinGet](https://github.com/microsoft/winget-cli): `winget install tsl0922.ttyd`
- Install with [Scoop](https://scoop.sh/#/apps?q=ttyd&s=2&d=1&o=true): `scoop install ttyd`
- [Compile on Windows](https://github.com/tsl0922/ttyd/wiki/Compile-on-Windows)
# Usage
## Command-line Options
```
USAGE:
ttyd [options] <command> [<arguments...>]
OPTIONS:
-p, --port Port to listen (default: 7681, use `0` for random port)
-i, --interface Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)
-U, --socket-owner User owner of the UNIX domain socket file, when enabled (eg: user:group)
-c, --credential Credential for basic authentication (format: username:password)
-H, --auth-header HTTP Header name for auth proxy, this will configure ttyd to let a HTTP reverse proxy handle authentication
-u, --uid User id to run with
-g, --gid Group id to run with
-s, --signal Signal to send to the command when exit it (default: 1, SIGHUP)
-w, --cwd Working directory to be set for the child program
-a, --url-arg Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)
-W, --writable Allow clients to write to the TTY (readonly by default)
-t, --client-option Send option to client (format: key=value), repeat to add more options
-T, --terminal-type Terminal type to report, default: xterm-256color
-O, --check-origin Do not allow websocket connection from different origin
-m, --max-clients Maximum clients to support (default: 0, no limit)
-o, --once Accept only one client and exit on disconnection
-q, --exit-no-conn Exit on all clients disconnection
-B, --browser Open terminal with the default system browser
-I, --index Custom index.html path
-b, --base-path Expected base path for requests coming from a reverse proxy (eg: /mounted/here, max length: 128)
-P, --ping-interval Websocket ping interval(sec) (default: 5)
-6, --ipv6 Enable IPv6 support
-S, --ssl Enable SSL
-C, --ssl-cert SSL certificate file path
-K, --ssl-key SSL key file path
-A, --ssl-ca SSL CA file path for client certificate verification
-d, --debug Set log level (default: 7)
-v, --version Print the version and exit
-h, --help Print this text and exit
```
Read the example usage on the [wiki](https://github.com/tsl0922/ttyd/wiki/Example-Usage).
## Browser Support
Modern browsers, See [Browser Support](https://github.com/xtermjs/xterm.js#browser-support).
## Alternatives
* [Wetty](https://github.com/krishnasrinivas/wetty): [Node](https://nodejs.org) based web terminal (SSH/login)
* [GoTTY](https://github.com/yudai/gotty): [Go](https://golang.org) based web terminal
================================================
FILE: app.rc.in
================================================
#include <winver.h>
#define VERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0
#define VERSION_STR "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.0\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VERSION
PRODUCTVERSION VERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS__WINDOWS32
FILETYPE VFT_DLL
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "FileDescription", "ttyd\0"
VALUE "ProductName", "ttyd\0"
VALUE "ProductVersion", VERSION_STR
VALUE "FileVersion", VERSION_STR
VALUE "InternalName", "ttyd\0"
VALUE "OriginalFilename", "ttyd.exe\0"
VALUE "LegalCopyright", "Copyright (C) 2016-2026 Shuanglei Tao\0"
VALUE "Comment", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
================================================
FILE: cmake/GetGitVersion.cmake
================================================
find_package(Git)
function(get_git_version var1 var2)
if(GIT_EXECUTABLE)
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --tags --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
RESULT_VARIABLE status
OUTPUT_VARIABLE GIT_VERSION
)
if (${status})
set(GIT_VERSION "0.0.0")
else()
string(STRIP ${GIT_VERSION} GIT_VERSION)
string(REGEX REPLACE "-[0-9]+-g" "-" GIT_VERSION ${GIT_VERSION})
endif()
else()
set(GIT_VERSION "0.0.0")
endif()
string(REGEX MATCH "^[0-9]+.[0-9]+.[0-9]+" SEM_VER "${GIT_VERSION}")
message("-- Git Tag: ${GIT_VERSION}, Sem Ver: ${SEM_VER}")
set(${var1} ${GIT_VERSION} PARENT_SCOPE)
set(${var2} ${SEM_VER} PARENT_SCOPE)
endfunction()
function(get_git_head var1)
if(GIT_EXECUTABLE)
execute_process(
COMMAND ${GIT_EXECUTABLE} --git-dir ${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse --short HEAD
RESULT_VARIABLE status
OUTPUT_VARIABLE GIT_COMMIT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if(${status})
set(GIT_COMMIT "unknown")
endif()
message("-- Git Commit: ${GIT_COMMIT}")
set(${var1} ${GIT_COMMIT} PARENT_SCOPE)
endif()
endfunction()
================================================
FILE: html/.editorconfig
================================================
root = true
[*]
charset = utf-8
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[{*.json, *.scss}]
indent_size = 2
[*.md]
trim_trailing_whitespace = false
================================================
FILE: html/.eslintignore
================================================
dist/
================================================
FILE: html/.eslintrc.json
================================================
{
"extends": "./node_modules/gts/",
"overrides": [
{
"files": ["**/*.ts", "**/*.tsx"],
"parserOptions": {
"jsxPragma": "h"
},
"rules": {
"@typescript-eslint/no-duplicate-enum-values": "off"
}
},
{
"files": ["gulpfile.js", "webpack.config.js"],
"rules": {
"node/no-unpublished-require": "off"
}
}
]
}
================================================
FILE: html/.gitignore
================================================
node_modules
dist
*.log
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
================================================
FILE: html/.prettierrc.js
================================================
module.exports = {
...require('gts/.prettierrc.json'),
"bracketSpacing": true,
"tabWidth": 4,
"printWidth": 120,
}
================================================
FILE: html/.yarn/patches/zmodem.js-npm-0.1.10-e5537fa2ed.patch
================================================
diff --git a/src/zsession.js b/src/zsession.js
index 5f0b8f9d8afa6fba0acd6dd0477afa186f7aad9a..c7ea98e0f08c97d63d321f784a5dd8bf66888743 100644
--- a/src/zsession.js
+++ b/src/zsession.js
@@ -548,20 +548,17 @@ Zmodem.Session.Receive = class ZmodemReceiveSession extends Zmodem.Session {
if (this._got_ZFIN) {
if (this._input_buffer.length < 2) return;
- //if it’s OO, then set this._bytes_after_OO
- if (Zmodem.ZMLIB.find_subarray(this._input_buffer, OVER_AND_OUT) === 0) {
+ if (Zmodem.ZMLIB.find_subarray(this._input_buffer, OVER_AND_OUT) !== 0) {
+ console.warn( "PROTOCOL: Only thing after ZFIN should be “OO” (79,79), not: " + this._input_buffer.join() );
+ }
- //This doubles as an indication that the session has ended.
- //We need to set this right away so that handlers like
- //"session_end" will have access to it.
- this._bytes_after_OO = _trim_OO(this._bytes_being_consumed.slice(0));
- this._on_session_end();
+ //This doubles as an indication that the session has ended.
+ //We need to set this right away so that handlers like
+ //"session_end" will have access to it.
+ this._bytes_after_OO = _trim_OO(this._bytes_being_consumed.slice(0));
+ this._on_session_end();
- return;
- }
- else {
- throw( "PROTOCOL: Only thing after ZFIN should be “OO” (79,79), not: " + this._input_buffer.join() );
- }
+ return;
}
var parsed;
================================================
FILE: html/.yarnrc.yml
================================================
nodeLinker: node-modules
================================================
FILE: html/README.md
================================================
## Prerequisites
> **NOTE:** yarn v2 is required.
Install [Yarn](https://yarnpkg.com/getting-started/install), and run: `yarn install`.
## Development
1. Start ttyd: `ttyd bash`
2. Start the dev server: `yarn run start`
## Publish
Run `yarn run build`, this will compile the inlined html to `../src/html.h`.
================================================
FILE: html/gulpfile.js
================================================
const { src, dest, task, series } = require('gulp');
const clean = require('gulp-clean');
const gzip = require('gulp-gzip');
const inlineSource = require('gulp-inline-source');
const rename = require('gulp-rename');
const through2 = require('through2');
const genHeader = (size, buf, len) => {
let idx = 0;
let data = 'unsigned char index_html[] = {\n ';
for (const value of buf) {
idx++;
const current = value < 0 ? value + 256 : value;
data += '0x';
data += (current >>> 4).toString(16);
data += (current & 0xf).toString(16);
if (idx === len) {
data += '\n';
} else {
data += idx % 12 === 0 ? ',\n ' : ', ';
}
}
data += '};\n';
data += `unsigned int index_html_len = ${len};\n`;
data += `unsigned int index_html_size = ${size};\n`;
return data;
};
let fileSize = 0;
task('clean', () => {
return src('dist', { read: false, allowEmpty: true }).pipe(clean());
});
task('inline', () => {
const options = {
compress: false,
};
return src('dist/index.html').pipe(inlineSource(options)).pipe(rename('inline.html')).pipe(dest('dist/'));
});
task(
'default',
series('inline', () => {
return src('dist/inline.html')
.pipe(
through2.obj((file, enc, cb) => {
fileSize = file.contents.length;
return cb(null, file);
})
)
.pipe(gzip())
.pipe(
through2.obj((file, enc, cb) => {
const buf = file.contents;
file.contents = Buffer.from(genHeader(fileSize, buf, buf.length));
return cb(null, file);
})
)
.pipe(rename('html.h'))
.pipe(dest('../src/'));
})
);
================================================
FILE: html/package.json
================================================
{
"private": true,
"name": "ttyd",
"version": "1.0.0",
"description": "Share your terminal over the web",
"repository": {
"url": "git@github.com:tsl0922/ttyd.git",
"type": "git"
},
"author": "Shuanglei Tao <tsl0922@gmail.com>",
"license": "MIT",
"scripts": {
"prestart": "gulp clean",
"start": "NODE_ENV=development && webpack serve",
"build": "NODE_ENV=production webpack && gulp",
"inline": "NODE_ENV=production webpack && gulp inline",
"check": "gts check",
"fix": "gts fix"
},
"engines": {
"node": ">=12"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^7.1.1",
"copy-webpack-plugin": "^12.0.2",
"css-loader": "^6.10.0",
"css-minimizer-webpack-plugin": "^6.0.0",
"eslint": "^8.57.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^5.1.3",
"eslint-webpack-plugin": "^4.0.1",
"gts": "^5.2.0",
"gulp": "^4.0.2",
"gulp-clean": "^0.4.0",
"gulp-gzip": "^1.4.2",
"gulp-inline-source": "^4.0.0",
"gulp-rename": "^2.0.0",
"html-webpack-plugin": "^5.6.0",
"mini-css-extract-plugin": "^2.8.1",
"sass": "^1.71.1",
"sass-loader": "^14.1.1",
"scssfmt": "^1.0.7",
"style-loader": "^3.3.4",
"terser-webpack-plugin": "^5.3.10",
"through2": "^4.0.2",
"ts-loader": "^9.5.1",
"typescript": "^5.3.3",
"util": "^0.12.5",
"webpack": "^5.90.3",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.2",
"webpack-merge": "^5.10.0"
},
"dependencies": {
"@xterm/addon-canvas": "^0.7.0",
"@xterm/addon-clipboard": "^0.1.0",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-image": "^0.8.0",
"@xterm/addon-unicode11": "^0.8.0",
"@xterm/addon-web-links": "^0.11.0",
"@xterm/addon-webgl": "^0.18.0",
"@xterm/xterm": "^5.5.0",
"decko": "^1.2.0",
"file-saver": "^2.0.5",
"preact": "^10.19.6",
"trzsz": "^1.1.5",
"whatwg-fetch": "^3.6.20",
"zmodem.js": "^0.1.10"
},
"resolutions": {
"zmodem.js@^0.1.10": "patch:zmodem.js@npm%3A0.1.10#./.yarn/patches/zmodem.js-npm-0.1.10-e5537fa2ed.patch"
},
"packageManager": "yarn@3.6.3"
}
================================================
FILE: html/src/components/app.tsx
================================================
import { h, Component } from 'preact';
import { Terminal } from './terminal';
import type { ITerminalOptions, ITheme } from '@xterm/xterm';
import type { ClientOptions, FlowControl } from './terminal/xterm';
const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
const path = window.location.pathname.replace(/[/]+$/, '');
const wsUrl = [protocol, '//', window.location.host, path, '/ws', window.location.search].join('');
const tokenUrl = [window.location.protocol, '//', window.location.host, path, '/token'].join('');
const clientOptions = {
rendererType: 'webgl',
disableLeaveAlert: false,
disableResizeOverlay: false,
enableZmodem: false,
enableTrzsz: false,
enableSixel: false,
closeOnDisconnect: false,
isWindows: false,
unicodeVersion: '11',
} as ClientOptions;
const termOptions = {
fontSize: 13,
fontFamily: 'Consolas,Liberation Mono,Menlo,Courier,monospace',
theme: {
foreground: '#d2d2d2',
background: '#2b2b2b',
cursor: '#adadad',
black: '#000000',
red: '#d81e00',
green: '#5ea702',
yellow: '#cfae00',
blue: '#427ab3',
magenta: '#89658e',
cyan: '#00a7aa',
white: '#dbded8',
brightBlack: '#686a66',
brightRed: '#f54235',
brightGreen: '#99e343',
brightYellow: '#fdeb61',
brightBlue: '#84b0d8',
brightMagenta: '#bc94b7',
brightCyan: '#37e6e8',
brightWhite: '#f1f1f0',
} as ITheme,
allowProposedApi: true,
} as ITerminalOptions;
const flowControl = {
limit: 100000,
highWater: 10,
lowWater: 4,
} as FlowControl;
export class App extends Component {
render() {
return (
<Terminal
id="terminal-container"
wsUrl={wsUrl}
tokenUrl={tokenUrl}
clientOptions={clientOptions}
termOptions={termOptions}
flowControl={flowControl}
/>
);
}
}
================================================
FILE: html/src/components/modal/index.tsx
================================================
import { h, Component, ComponentChildren } from 'preact';
import './modal.scss';
interface Props {
show: boolean;
children: ComponentChildren;
}
export class Modal extends Component<Props> {
constructor(props: Props) {
super(props);
}
render({ show, children }: Props) {
return (
show && (
<div className="modal">
<div className="modal-background" />
<div className="modal-content">
<div className="box">{children}</div>
</div>
</div>
)
);
}
}
================================================
FILE: html/src/components/modal/modal.scss
================================================
.modal {
bottom: 0;
left: 0;
right: 0;
top: 0;
align-items: center;
display: flex;
overflow: hidden;
position: fixed;
z-index: 40;
}
.modal-background {
bottom: 0;
left: 0;
position: absolute;
right: 0;
top: 0;
background-color: #4a4a4acc;
}
.modal-content {
margin: 0 20px;
max-height: calc(100vh - 160px);
overflow: auto;
position: relative;
width: 100%;
.box {
background-color: #fff;
color: #4a4a4a;
display: block;
padding: 1.25rem;
}
header {
font-weight: bold;
text-align: center;
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px solid #ddd;
}
.file-input {
height: .01em;
left: 0;
outline: none;
position: absolute;
top: 0;
width: .01em;
}
.file-cta {
cursor: pointer;
background-color: #f5f5f5;
color: #6200ee;
outline: none;
align-items: center;
box-shadow: none;
display: inline-flex;
height: 2.25em;
justify-content: flex-start;
line-height: 1.5;
position: relative;
vertical-align: top;
border-color: #dbdbdb;
border-radius: 3px;
font-size: 1em;
font-weight: 500;
padding: calc(.375em - 1px) 1em;
white-space: nowrap;
}
}
@media print, screen and (min-width: 769px) {
.modal-content {
margin: 0 auto;
max-height: calc(100vh - 40px);
width: 640px;
}
}
================================================
FILE: html/src/components/terminal/index.tsx
================================================
import { bind } from 'decko';
import { Component, h } from 'preact';
import { Xterm, XtermOptions } from './xterm';
import '@xterm/xterm/css/xterm.css';
import { Modal } from '../modal';
interface Props extends XtermOptions {
id: string;
}
interface State {
modal: boolean;
}
export class Terminal extends Component<Props, State> {
private container: HTMLElement;
private xterm: Xterm;
constructor(props: Props) {
super();
this.xterm = new Xterm(props, this.showModal);
}
async componentDidMount() {
await this.xterm.refreshToken();
this.xterm.open(this.container);
this.xterm.connect();
}
componentWillUnmount() {
this.xterm.dispose();
}
render({ id }: Props, { modal }: State) {
return (
<div id={id} ref={c => (this.container = c as HTMLElement)}>
<Modal show={modal}>
<label class="file-label">
<input onChange={this.sendFile} class="file-input" type="file" multiple />
<span class="file-cta">Choose files…</span>
</label>
</Modal>
</div>
);
}
@bind
showModal() {
this.setState({ modal: true });
}
@bind
sendFile(event: Event) {
this.setState({ modal: false });
const files = (event.target as HTMLInputElement).files;
if (files) this.xterm.sendFile(files);
}
}
================================================
FILE: html/src/components/terminal/xterm/addons/overlay.ts
================================================
// ported from hterm.Terminal.prototype.showOverlay
// https://chromium.googlesource.com/apps/libapps/+/master/hterm/js/hterm_terminal.js
import { bind } from 'decko';
import { ITerminalAddon, Terminal } from '@xterm/xterm';
export class OverlayAddon implements ITerminalAddon {
private terminal: Terminal;
private overlayNode: HTMLElement;
private overlayTimeout?: number;
constructor() {
this.overlayNode = document.createElement('div');
this.overlayNode.style.cssText = `border-radius: 15px;
font-size: xx-large;
opacity: 0.75;
padding: 0.2em 0.5em 0.2em 0.5em;
position: absolute;
-webkit-user-select: none;
-webkit-transition: opacity 180ms ease-in;
-moz-user-select: none;
-moz-transition: opacity 180ms ease-in;`;
this.overlayNode.addEventListener(
'mousedown',
e => {
e.preventDefault();
e.stopPropagation();
},
true
);
}
activate(terminal: Terminal): void {
this.terminal = terminal;
}
dispose(): void {}
@bind
showOverlay(msg: string, timeout?: number): void {
const { terminal, overlayNode } = this;
if (!terminal.element) return;
overlayNode.style.color = '#101010';
overlayNode.style.backgroundColor = '#f0f0f0';
overlayNode.textContent = msg;
overlayNode.style.opacity = '0.75';
if (!overlayNode.parentNode) {
terminal.element.appendChild(overlayNode);
}
const divSize = terminal.element.getBoundingClientRect();
const overlaySize = overlayNode.getBoundingClientRect();
overlayNode.style.top = (divSize.height - overlaySize.height) / 2 + 'px';
overlayNode.style.left = (divSize.width - overlaySize.width) / 2 + 'px';
if (this.overlayTimeout) clearTimeout(this.overlayTimeout);
if (!timeout) return;
this.overlayTimeout = window.setTimeout(() => {
overlayNode.style.opacity = '0';
this.overlayTimeout = window.setTimeout(() => {
if (overlayNode.parentNode) {
overlayNode.parentNode.removeChild(overlayNode);
}
this.overlayTimeout = undefined;
overlayNode.style.opacity = '0.75';
}, 200);
}, timeout || 1500);
}
}
================================================
FILE: html/src/components/terminal/xterm/addons/zmodem.ts
================================================
import { bind } from 'decko';
import { saveAs } from 'file-saver';
import { IDisposable, ITerminalAddon, Terminal } from '@xterm/xterm';
import * as Zmodem from 'zmodem.js/src/zmodem_browser';
import { TrzszFilter } from 'trzsz';
export interface ZmodeOptions {
zmodem: boolean;
trzsz: boolean;
windows: boolean;
trzszDragInitTimeout: number;
onSend: () => void;
sender: (data: string | Uint8Array) => void;
writer: (data: string | Uint8Array) => void;
}
export class ZmodemAddon implements ITerminalAddon {
private disposables: IDisposable[] = [];
private terminal: Terminal;
private sentry: Zmodem.Sentry;
private session: Zmodem.Session;
private denier: () => void;
private trzszFilter: TrzszFilter;
constructor(private options: ZmodeOptions) {}
activate(terminal: Terminal) {
this.terminal = terminal;
if (this.options.zmodem) this.zmodemInit();
if (this.options.trzsz) this.trzszInit();
}
dispose() {
for (const d of this.disposables) {
d.dispose();
}
this.disposables.length = 0;
}
consume(data: ArrayBuffer) {
try {
if (this.options.trzsz) {
this.trzszFilter.processServerOutput(data);
} else {
this.sentry.consume(data);
}
} catch (e) {
console.error('[ttyd] zmodem consume: ', e);
this.reset();
}
}
@bind
private reset() {
this.terminal.options.disableStdin = false;
this.terminal.focus();
}
private addDisposableListener(target: EventTarget, type: string, listener: EventListener) {
target.addEventListener(type, listener);
this.disposables.push({ dispose: () => target.removeEventListener(type, listener) });
}
@bind
private trzszInit() {
const { terminal } = this;
const { sender, writer, zmodem } = this.options;
this.trzszFilter = new TrzszFilter({
writeToTerminal: data => {
if (!this.trzszFilter.isTransferringFiles() && zmodem) {
this.sentry.consume(data);
} else {
writer(typeof data === 'string' ? data : new Uint8Array(data as ArrayBuffer));
}
},
sendToServer: data => sender(data),
terminalColumns: terminal.cols,
isWindowsShell: this.options.windows,
dragInitTimeout: this.options.trzszDragInitTimeout,
});
const element = terminal.element as EventTarget;
this.addDisposableListener(element, 'dragover', event => event.preventDefault());
this.addDisposableListener(element, 'drop', event => {
event.preventDefault();
this.trzszFilter
.uploadFiles((event as DragEvent).dataTransfer?.items as DataTransferItemList)
.then(() => console.log('[ttyd] upload success'))
.catch(err => console.log('[ttyd] upload failed: ' + err));
});
this.disposables.push(terminal.onResize(size => this.trzszFilter.setTerminalColumns(size.cols)));
}
@bind
private zmodemInit() {
const { sender, writer } = this.options;
const { terminal, reset, zmodemDetect } = this;
this.session = null;
this.sentry = new Zmodem.Sentry({
to_terminal: octets => writer(new Uint8Array(octets)),
sender: octets => sender(new Uint8Array(octets)),
on_retract: () => reset(),
on_detect: detection => zmodemDetect(detection),
});
this.disposables.push(
terminal.onKey(e => {
const event = e.domEvent;
if (event.ctrlKey && event.key === 'c') {
if (this.denier) this.denier();
}
})
);
}
@bind
private zmodemDetect(detection: Zmodem.Detection): void {
const { terminal, receiveFile } = this;
terminal.options.disableStdin = true;
this.denier = () => detection.deny();
this.session = detection.confirm();
this.session.on('session_end', () => this.reset());
if (this.session.type === 'send') {
this.options.onSend();
} else {
receiveFile();
}
}
@bind
public sendFile(files: FileList) {
const { session, writeProgress } = this;
Zmodem.Browser.send_files(session, files, {
on_progress: (_, offer) => writeProgress(offer),
})
.then(() => session.close())
.catch(() => this.reset());
}
@bind
private receiveFile() {
const { session, writeProgress } = this;
session.on('offer', offer => {
offer.on('input', () => writeProgress(offer));
offer
.accept()
.then(payloads => {
const blob = new Blob(payloads, { type: 'application/octet-stream' });
saveAs(blob, offer.get_details().name);
})
.catch(() => this.reset());
});
session.start();
}
@bind
private writeProgress(offer: Zmodem.Offer) {
const { bytesHuman } = this;
const file = offer.get_details();
const name = file.name;
const size = file.size;
const offset = offer.get_offset();
const percent = ((100 * offset) / size).toFixed(2);
this.options.writer(`${name} ${percent}% ${bytesHuman(offset, 2)}/${bytesHuman(size, 2)}\r`);
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
private bytesHuman(bytes: any, precision: number): string {
if (!/^([-+])?|(\.\d+)(\d+(\.\d+)?|(\d+\.)|Infinity)$/.test(bytes)) {
return '-';
}
if (bytes === 0) return '0';
if (typeof precision === 'undefined') precision = 1;
const units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];
const num = Math.floor(Math.log(bytes) / Math.log(1024));
const value = (bytes / Math.pow(1024, Math.floor(num))).toFixed(precision);
return `${value} ${units[num]}`;
}
}
================================================
FILE: html/src/components/terminal/xterm/index.ts
================================================
import { bind } from 'decko';
import type { IDisposable, ITerminalOptions } from '@xterm/xterm';
import { Terminal } from '@xterm/xterm';
import { CanvasAddon } from '@xterm/addon-canvas';
import { ClipboardAddon } from '@xterm/addon-clipboard';
import { WebglAddon } from '@xterm/addon-webgl';
import { FitAddon } from '@xterm/addon-fit';
import { WebLinksAddon } from '@xterm/addon-web-links';
import { ImageAddon } from '@xterm/addon-image';
import { Unicode11Addon } from '@xterm/addon-unicode11';
import { OverlayAddon } from './addons/overlay';
import { ZmodemAddon } from './addons/zmodem';
import '@xterm/xterm/css/xterm.css';
interface TtydTerminal extends Terminal {
fit(): void;
}
declare global {
interface Window {
term: TtydTerminal;
}
}
enum Command {
// server side
OUTPUT = '0',
SET_WINDOW_TITLE = '1',
SET_PREFERENCES = '2',
// client side
INPUT = '0',
RESIZE_TERMINAL = '1',
PAUSE = '2',
RESUME = '3',
}
type Preferences = ITerminalOptions & ClientOptions;
export type RendererType = 'dom' | 'canvas' | 'webgl';
export interface ClientOptions {
rendererType: RendererType;
disableLeaveAlert: boolean;
disableResizeOverlay: boolean;
enableZmodem: boolean;
enableTrzsz: boolean;
enableSixel: boolean;
titleFixed?: string;
isWindows: boolean;
trzszDragInitTimeout: number;
unicodeVersion: string;
closeOnDisconnect: boolean;
}
export interface FlowControl {
limit: number;
highWater: number;
lowWater: number;
}
export interface XtermOptions {
wsUrl: string;
tokenUrl: string;
flowControl: FlowControl;
clientOptions: ClientOptions;
termOptions: ITerminalOptions;
}
function toDisposable(f: () => void): IDisposable {
return { dispose: f };
}
function addEventListener(target: EventTarget, type: string, listener: EventListener): IDisposable {
target.addEventListener(type, listener);
return toDisposable(() => target.removeEventListener(type, listener));
}
export class Xterm {
private disposables: IDisposable[] = [];
private textEncoder = new TextEncoder();
private textDecoder = new TextDecoder();
private written = 0;
private pending = 0;
private terminal: Terminal;
private fitAddon = new FitAddon();
private overlayAddon = new OverlayAddon();
private clipboardAddon = new ClipboardAddon();
private webLinksAddon = new WebLinksAddon();
private webglAddon?: WebglAddon;
private canvasAddon?: CanvasAddon;
private zmodemAddon?: ZmodemAddon;
private socket?: WebSocket;
private token: string;
private opened = false;
private title?: string;
private titleFixed?: string;
private resizeOverlay = true;
private reconnect = true;
private doReconnect = true;
private closeOnDisconnect = false;
private writeFunc = (data: ArrayBuffer) => this.writeData(new Uint8Array(data));
constructor(
private options: XtermOptions,
private sendCb: () => void
) {}
dispose() {
for (const d of this.disposables) {
d.dispose();
}
this.disposables.length = 0;
}
@bind
private register<T extends IDisposable>(d: T): T {
this.disposables.push(d);
return d;
}
@bind
public sendFile(files: FileList) {
this.zmodemAddon?.sendFile(files);
}
@bind
public async refreshToken() {
try {
const resp = await fetch(this.options.tokenUrl);
if (resp.ok) {
const json = await resp.json();
this.token = json.token;
}
} catch (e) {
console.error(`[ttyd] fetch ${this.options.tokenUrl}: `, e);
}
}
@bind
private onWindowUnload(event: BeforeUnloadEvent) {
event.preventDefault();
if (this.socket?.readyState === WebSocket.OPEN) {
const message = 'Close terminal? this will also terminate the command.';
event.returnValue = message;
return message;
}
return undefined;
}
@bind
public open(parent: HTMLElement) {
this.terminal = new Terminal(this.options.termOptions);
const { terminal, fitAddon, overlayAddon, clipboardAddon, webLinksAddon } = this;
window.term = terminal as TtydTerminal;
window.term.fit = () => {
this.fitAddon.fit();
};
terminal.loadAddon(fitAddon);
terminal.loadAddon(overlayAddon);
terminal.loadAddon(clipboardAddon);
terminal.loadAddon(webLinksAddon);
terminal.open(parent);
fitAddon.fit();
}
@bind
private initListeners() {
const { terminal, fitAddon, overlayAddon, register, sendData } = this;
register(
terminal.onTitleChange(data => {
if (data && data !== '' && !this.titleFixed) {
document.title = data + ' | ' + this.title;
}
})
);
register(terminal.onData(data => sendData(data)));
register(terminal.onBinary(data => sendData(Uint8Array.from(data, v => v.charCodeAt(0)))));
register(
terminal.onResize(({ cols, rows }) => {
const msg = JSON.stringify({ columns: cols, rows: rows });
this.socket?.send(this.textEncoder.encode(Command.RESIZE_TERMINAL + msg));
if (this.resizeOverlay) overlayAddon.showOverlay(`${cols}x${rows}`, 300);
})
);
register(
terminal.onSelectionChange(() => {
if (this.terminal.getSelection() === '') return;
try {
document.execCommand('copy');
} catch (e) {
return;
}
this.overlayAddon?.showOverlay('\u2702', 200);
})
);
register(addEventListener(window, 'resize', () => fitAddon.fit()));
register(addEventListener(window, 'beforeunload', this.onWindowUnload));
}
@bind
public writeData(data: string | Uint8Array) {
const { terminal, textEncoder } = this;
const { limit, highWater, lowWater } = this.options.flowControl;
this.written += data.length;
if (this.written > limit) {
terminal.write(data, () => {
this.pending = Math.max(this.pending - 1, 0);
if (this.pending < lowWater) {
this.socket?.send(textEncoder.encode(Command.RESUME));
}
});
this.pending++;
this.written = 0;
if (this.pending > highWater) {
this.socket?.send(textEncoder.encode(Command.PAUSE));
}
} else {
terminal.write(data);
}
}
@bind
public sendData(data: string | Uint8Array) {
const { socket, textEncoder } = this;
if (socket?.readyState !== WebSocket.OPEN) return;
if (typeof data === 'string') {
const payload = new Uint8Array(data.length * 3 + 1);
payload[0] = Command.INPUT.charCodeAt(0);
const stats = textEncoder.encodeInto(data, payload.subarray(1));
socket.send(payload.subarray(0, (stats.written as number) + 1));
} else {
const payload = new Uint8Array(data.length + 1);
payload[0] = Command.INPUT.charCodeAt(0);
payload.set(data, 1);
socket.send(payload);
}
}
@bind
public connect() {
this.socket = new WebSocket(this.options.wsUrl, ['tty']);
const { socket, register } = this;
socket.binaryType = 'arraybuffer';
register(addEventListener(socket, 'open', this.onSocketOpen));
register(addEventListener(socket, 'message', this.onSocketData as EventListener));
register(addEventListener(socket, 'close', this.onSocketClose as EventListener));
register(addEventListener(socket, 'error', () => (this.doReconnect = false)));
}
@bind
private onSocketOpen() {
console.log('[ttyd] websocket connection opened');
const { textEncoder, terminal, overlayAddon } = this;
const msg = JSON.stringify({ AuthToken: this.token, columns: terminal.cols, rows: terminal.rows });
this.socket?.send(textEncoder.encode(msg));
if (this.opened) {
terminal.reset();
terminal.options.disableStdin = false;
overlayAddon.showOverlay('Reconnected', 300);
} else {
this.opened = true;
}
this.doReconnect = this.reconnect;
this.initListeners();
terminal.focus();
}
@bind
private onSocketClose(event: CloseEvent) {
console.log(`[ttyd] websocket connection closed with code: ${event.code}`);
const { refreshToken, connect, doReconnect, overlayAddon } = this;
overlayAddon.showOverlay('Connection Closed');
this.dispose();
// 1000: CLOSE_NORMAL
if (event.code !== 1000 && doReconnect) {
overlayAddon.showOverlay('Reconnecting...');
refreshToken().then(connect);
} else if (this.closeOnDisconnect) {
window.close();
} else {
const { terminal } = this;
const keyDispose = terminal.onKey(e => {
const event = e.domEvent;
if (event.key === 'Enter') {
keyDispose.dispose();
overlayAddon.showOverlay('Reconnecting...');
refreshToken().then(connect);
}
});
overlayAddon.showOverlay('Press ⏎ to Reconnect');
}
}
@bind
private parseOptsFromUrlQuery(query: string): Preferences {
const { terminal } = this;
const { clientOptions } = this.options;
const prefs = {} as Preferences;
const queryObj = Array.from(new URLSearchParams(query) as unknown as Iterable<[string, string]>);
for (const [k, queryVal] of queryObj) {
let v = clientOptions[k];
if (v === undefined) v = terminal.options[k];
switch (typeof v) {
case 'boolean':
prefs[k] = queryVal === 'true' || queryVal === '1';
break;
case 'number':
case 'bigint':
prefs[k] = Number.parseInt(queryVal, 10);
break;
case 'string':
prefs[k] = queryVal;
break;
case 'object':
prefs[k] = JSON.parse(queryVal);
break;
default:
console.warn(`[ttyd] maybe unknown option: ${k}=${queryVal}, treating as string`);
prefs[k] = queryVal;
break;
}
}
return prefs;
}
@bind
private onSocketData(event: MessageEvent) {
const { textDecoder } = this;
const rawData = event.data as ArrayBuffer;
const cmd = String.fromCharCode(new Uint8Array(rawData)[0]);
const data = rawData.slice(1);
switch (cmd) {
case Command.OUTPUT:
this.writeFunc(data);
break;
case Command.SET_WINDOW_TITLE:
this.title = textDecoder.decode(data);
document.title = this.title;
break;
case Command.SET_PREFERENCES:
this.applyPreferences({
...this.options.clientOptions,
...JSON.parse(textDecoder.decode(data)),
...this.parseOptsFromUrlQuery(window.location.search),
} as Preferences);
break;
default:
console.warn(`[ttyd] unknown command: ${cmd}`);
break;
}
}
@bind
private applyPreferences(prefs: Preferences) {
const { terminal, fitAddon, register } = this;
if (prefs.enableZmodem || prefs.enableTrzsz) {
this.zmodemAddon = new ZmodemAddon({
zmodem: prefs.enableZmodem,
trzsz: prefs.enableTrzsz,
windows: prefs.isWindows,
trzszDragInitTimeout: prefs.trzszDragInitTimeout,
onSend: this.sendCb,
sender: this.sendData,
writer: this.writeData,
});
this.writeFunc = data => this.zmodemAddon?.consume(data);
terminal.loadAddon(register(this.zmodemAddon));
}
for (const [key, value] of Object.entries(prefs)) {
switch (key) {
case 'rendererType':
this.setRendererType(value);
break;
case 'disableLeaveAlert':
if (value) {
window.removeEventListener('beforeunload', this.onWindowUnload);
console.log('[ttyd] Leave site alert disabled');
}
break;
case 'disableResizeOverlay':
if (value) {
console.log('[ttyd] Resize overlay disabled');
this.resizeOverlay = false;
}
break;
case 'disableReconnect':
if (value) {
console.log('[ttyd] Reconnect disabled');
this.reconnect = false;
this.doReconnect = false;
}
break;
case 'enableZmodem':
if (value) console.log('[ttyd] Zmodem enabled');
break;
case 'enableTrzsz':
if (value) console.log('[ttyd] trzsz enabled');
break;
case 'trzszDragInitTimeout':
if (value) console.log(`[ttyd] trzsz drag init timeout: ${value}`);
break;
case 'enableSixel':
if (value) {
terminal.loadAddon(register(new ImageAddon()));
console.log('[ttyd] Sixel enabled');
}
break;
case 'closeOnDisconnect':
if (value) {
console.log('[ttyd] close on disconnect enabled (Reconnect disabled)');
this.closeOnDisconnect = true;
this.reconnect = false;
this.doReconnect = false;
}
break;
case 'titleFixed':
if (!value || value === '') return;
console.log(`[ttyd] setting fixed title: ${value}`);
this.titleFixed = value;
document.title = value;
break;
case 'isWindows':
if (value) console.log('[ttyd] is windows');
break;
case 'unicodeVersion':
switch (value) {
case 6:
case '6':
console.log('[ttyd] setting Unicode version: 6');
break;
case 11:
case '11':
default:
console.log('[ttyd] setting Unicode version: 11');
terminal.loadAddon(new Unicode11Addon());
terminal.unicode.activeVersion = '11';
break;
}
break;
default:
console.log(`[ttyd] option: ${key}=${JSON.stringify(value)}`);
if (terminal.options[key] instanceof Object) {
terminal.options[key] = Object.assign({}, terminal.options[key], value);
} else {
terminal.options[key] = value;
}
if (key.indexOf('font') === 0) fitAddon.fit();
break;
}
}
}
@bind
private setRendererType(value: RendererType) {
const { terminal } = this;
const disposeCanvasRenderer = () => {
try {
this.canvasAddon?.dispose();
} catch {
// ignore
}
this.canvasAddon = undefined;
};
const disposeWebglRenderer = () => {
try {
this.webglAddon?.dispose();
} catch {
// ignore
}
this.webglAddon = undefined;
};
const enableCanvasRenderer = () => {
if (this.canvasAddon) return;
this.canvasAddon = new CanvasAddon();
disposeWebglRenderer();
try {
this.terminal.loadAddon(this.canvasAddon);
console.log('[ttyd] canvas renderer loaded');
} catch (e) {
console.log('[ttyd] canvas renderer could not be loaded, falling back to dom renderer', e);
disposeCanvasRenderer();
}
};
const enableWebglRenderer = () => {
if (this.webglAddon) return;
this.webglAddon = new WebglAddon();
disposeCanvasRenderer();
try {
this.webglAddon.onContextLoss(() => {
this.webglAddon?.dispose();
});
terminal.loadAddon(this.webglAddon);
console.log('[ttyd] WebGL renderer loaded');
} catch (e) {
console.log('[ttyd] WebGL renderer could not be loaded, falling back to canvas renderer', e);
disposeWebglRenderer();
enableCanvasRenderer();
}
};
switch (value) {
case 'canvas':
enableCanvasRenderer();
break;
case 'webgl':
enableWebglRenderer();
break;
case 'dom':
disposeWebglRenderer();
disposeCanvasRenderer();
console.log('[ttyd] dom renderer loaded');
break;
default:
break;
}
}
}
================================================
FILE: html/src/index.tsx
================================================
if (process.env.NODE_ENV === 'development') {
require('preact/debug');
}
import 'whatwg-fetch';
import { h, render } from 'preact';
import { App } from './components/app';
import './style/index.scss';
render(<App />, document.body);
================================================
FILE: html/src/style/index.scss
================================================
html,
body {
height: 100%;
min-height: 100%;
margin: 0;
overflow: hidden;
}
#terminal-container {
width: auto;
height: 100%;
margin: 0 auto;
padding: 0;
.terminal {
padding: 5px;
height: calc(100% - 10px);
}
}
================================================
FILE: html/src/template.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="mobile-web-app-capable" content="yes">
<title><%= htmlWebpackPlugin.options.title %></title>
<link inline rel="icon" type="image/png" href="favicon.png">
<% for (const css in htmlWebpackPlugin.files.css) { %>
<link inline rel="stylesheet" type="text/css" href="<%= htmlWebpackPlugin.files.css[css] %>">
<% } %>
</head>
<body>
<% for (const js in htmlWebpackPlugin.files.js) { %>
<script inline type="text/javascript" src="<%= htmlWebpackPlugin.files.js[js] %>"></script>
<% } %>
</body>
</html>
================================================
FILE: html/tsconfig.json
================================================
{
"extends": "./node_modules/gts/tsconfig-google.json",
"compilerOptions": {
"moduleResolution": "node",
"esModuleInterop": true,
"jsx": "react",
"jsxFactory": "h",
"allowJs": true,
"noImplicitAny": false,
"declaration": false,
"experimentalDecorators": true,
"strictPropertyInitialization": false,
"lib": ["es2019", "dom"],
},
"include": [
"src/**/*.tsx",
"src/**/*.ts"
]
}
================================================
FILE: html/webpack.config.js
================================================
const path = require('path');
const { merge } = require('webpack-merge');
const ESLintPlugin = require('eslint-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const devMode = process.env.NODE_ENV !== 'production';
const baseConfig = {
context: path.resolve(__dirname, 'src'),
entry: {
app: './index.tsx',
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: devMode ? '[name].js' : '[name].[contenthash].js',
},
module: {
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/,
},
{
test: /\.s?[ac]ss$/,
use: [devMode ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
},
],
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
plugins: [
new ESLintPlugin({
context: path.resolve(__dirname, '.'),
extensions: ['js', 'jsx', 'ts', 'tsx'],
}),
new CopyWebpackPlugin({
patterns: [{ from: './favicon.png', to: '.' }],
}),
new MiniCssExtractPlugin({
filename: devMode ? '[name].css' : '[name].[contenthash].css',
chunkFilename: devMode ? '[id].css' : '[id].[contenthash].css',
}),
new HtmlWebpackPlugin({
inject: false,
minify: {
removeComments: true,
collapseWhitespace: true,
},
title: 'ttyd - Terminal',
template: './template.html',
}),
],
performance: {
hints: false,
},
};
const devConfig = {
mode: 'development',
devServer: {
static: path.join(__dirname, 'dist'),
compress: true,
port: 9000,
client: {
overlay: {
errors: true,
warnings: false,
},
},
proxy: [
{
context: ['/token', '/ws'],
target: 'http://localhost:7681',
ws: true,
},
],
webSocketServer: {
type: 'sockjs',
options: {
path: '/sockjs-node',
},
},
},
devtool: 'inline-source-map',
};
const prodConfig = {
mode: 'production',
optimization: {
minimizer: [new TerserPlugin(), new CssMinimizerPlugin()],
},
devtool: 'source-map',
};
module.exports = merge(baseConfig, devMode ? devConfig : prodConfig);
================================================
FILE: man/README.md
================================================
# Building the man page
```bash
go get github.com/cpuguy83/go-md2man
go-md2man < ttyd.man.md > ttyd.1
```
================================================
FILE: man/ttyd.1
================================================
.nh
.TH ttyd 1 "September 2016" ttyd "User Manual"
.SH NAME
.PP
ttyd - Share your terminal over the web
.SH SYNOPSIS
.PP
\fBttyd\fP [options] <command> [<arguments...>]
.SH DESCRIPTION
.PP
ttyd is a command-line tool for sharing terminal over the web that runs in *nix and windows systems, with the following features:
.RS
.IP \(bu 2
Built on top of Libwebsockets with libuv for speed
.IP \(bu 2
Fully-featured terminal based on Xterm.js with CJK (Chinese, Japanese, Korean) and IME support
.IP \(bu 2
Graphical ZMODEM integration with lrzsz support
.IP \(bu 2
Sixel image output support
.IP \(bu 2
SSL support based on OpenSSL
.IP \(bu 2
Run any custom command with options
.IP \(bu 2
Basic authentication support and many other custom options
.IP \(bu 2
Cross platform: macOS, Linux, FreeBSD/OpenBSD, OpenWrt/LEDE, Windows
.RE
.SH OPTIONS
.PP
-p, --port
Port to listen (default: 7681, use \fB\fC0\fR for random port)
.PP
-i, --interface
Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)
.PP
-U, --socket-owner
User owner of the UNIX domain socket file, when enabled (eg: user:group)
.PP
-c, --credential USER[:PASSWORD]
Credential for Basic Authentication (format: username:password)
.PP
-H, --auth-header
HTTP Header name for auth proxy, this will configure ttyd to let a HTTP reverse proxy handle authentication
.PP
-u, --uid
User id to run with
.PP
-g, --gid
Group id to run with
.PP
-s, --signal
Signal to send to the command when exit it (default: 1, SIGHUP)
.PP
-w, --cwd
Working directory to be set for the child program
.PP
-a, --url-arg
Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)
.PP
-W, --writable
Allow clients to write to the TTY (readonly by default)
.PP
-t, --client-option
Send option to client (format: key=value), repeat to add more options, see \fBCLIENT OPTIONS\fP for details
.PP
-T, --terminal-type
Terminal type to report, default: xterm-256color
.PP
-O, --check-origin
Do not allow websocket connection from different origin
.PP
-m, --max-clients
Maximum clients to support (default: 0, no limit)
.PP
-o, --once
Accept only one client and exit on disconnection
.PP
-q, --exit-no-conn
Exit on all clients disconnection
.PP
-B, --browser
Open terminal with the default system browser
.PP
-I, --index
Custom index.html path
.PP
-b, --base-path
Expected base path for requests coming from a reverse proxy (eg: /mounted/here, max length: 128)
.PP
-P, --ping-interval
Websocket ping interval(sec) (default: 5)
.PP
-f, --srv-buf-size
Maximum chunk of file (in bytes) that can be sent at once, a larger value may improve throughput (default: 4096)
.PP
-6, --ipv6
Enable IPv6 support
.PP
-S, --ssl
Enable SSL
.PP
-C, --ssl-cert
SSL certificate file path
.PP
-K, --ssl-key
SSL key file path
.PP
-A, --ssl-ca
SSL CA file path for client certificate verification
.PP
-d, --debug
Set log level (default: 7)
.PP
-v, --version
Print the version and exit
.PP
-h, --help
Print this text and exit
.SH CLIENT OPTIONS
.PP
ttyd has a mechanism to pass server side command-line arguments to the browser page which is called \fBclient options\fP:
.PP
.RS
.nf
-t, --client-option Send option to client (format: key=value), repeat to add more options
.fi
.RE
.SH Basic usage
.RS
.IP \(bu 2
\fB\fC-t rendererType=canvas\fR: use the \fB\fCcanvas\fR renderer for xterm.js (default: \fB\fCwebgl\fR)
.IP \(bu 2
\fB\fC-t disableLeaveAlert=true\fR: disable the leave page alert
.IP \(bu 2
\fB\fC-t disableResizeOverlay=true\fR: disable the terminal resize overlay
.IP \(bu 2
\fB\fC-t disableReconnect=true\fR: prevent the terminal from reconnecting on connection error/close
.IP \(bu 2
\fB\fC-t enableZmodem=true\fR: enable ZMODEM
\[la]https://en.wikipedia.org/wiki/ZMODEM\[ra] / lrzsz
\[la]https://ohse.de/uwe/software/lrzsz.html\[ra] file transfer support
.IP \(bu 2
\fB\fC-t enableTrzsz=true\fR: enable trzsz
\[la]https://trzsz.github.io\[ra] file transfer support
.IP \(bu 2
\fB\fC-t enableSixel=true\fR: enable Sixel
\[la]https://en.wikipedia.org/wiki/Sixel\[ra] image output support (Usage
\[la]https://saitoha.github.io/libsixel/\[ra])
.IP \(bu 2
\fB\fC-t closeOnDisconnect=true\fR: close the terminal on disconnection, this will disable reconnect
.IP \(bu 2
\fB\fC-t titleFixed=hello\fR: set a fixed title for the browser window
.IP \(bu 2
\fB\fC-t fontSize=20\fR: change the font size of the terminal
.IP \(bu 2
\fB\fC-t unicodeVersion=11\fR: set xterm unicode support level (default: 11, use 6 to disable unicode addon)
.IP \(bu 2
\fB\fC-t trzszDragInitTimeout=3000\fR: set the timeout in milliseconds for initializing drag and drop files to upload. (default: 3000)
.RE
.SH Advanced usage
.PP
You can use the client option to change all the settings of xterm defined in ITerminalOptions
\[la]https://xtermjs.org/docs/api/terminal/interfaces/iterminaloptions/\[ra], examples:
.RS
.IP \(bu 2
\fB\fC-t cursorStyle=bar\fR: set cursor style to \fB\fCbar\fR
.IP \(bu 2
\fB\fC-t lineHeight=1.5\fR: set line-height to \fB\fC1.5\fR
.IP \(bu 2
\fB\fC-t 'theme={"background": "green"}'\fR: set background color to \fB\fCgreen\fR
.RE
.PP
to try the example options above, run:
.PP
.RS
.nf
ttyd -t cursorStyle=bar -t lineHeight=1.5 -t 'theme={"background": "green"}' bash
.fi
.RE
.SH EXAMPLES
.PP
ttyd starts web server at port 7681 by default, you can use the -p option to change it, the command will be started with arguments as options. For example, run:
.PP
.RS
.nf
ttyd -p 8080 bash -x
.fi
.RE
.PP
Then open http://localhost:8080 with a browser, you will get a bash shell with debug mode enabled. More examples:
.RS
.IP \(bu 2
If you want to login with your system accounts on the web browser, run \fB\fCttyd login\fR\&.
.IP \(bu 2
You can even run a non-shell command like vim, try: \fB\fCttyd vim\fR, the web browser will show you a vim editor.
.IP \(bu 2
Sharing single process with multiple clients: \fB\fCttyd tmux new -A -s ttyd vim\fR, run \fB\fCtmux new -A -s ttyd\fR to connect to the tmux session from terminal.
.RE
.SH SSL how-to
.PP
Generate SSL CA and self signed server/client certificates:
.PP
.RS
.nf
# CA certificate (FQDN must be different from server/client)
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt
# server certificate (for multiple domains, change subjectAltName to: DNS:example.com,DNS:www.example.com)
openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=localhost" -out server.csr
openssl x509 -sha256 -req -extfile <(printf "subjectAltName=DNS:localhost") -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
# client certificate (the p12/pem format may be useful for some clients)
openssl req -newkey rsa:2048 -nodes -keyout client.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=client" -out client.csr
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -in client.p12 -out client.pem -clcerts
.fi
.RE
.PP
Then start ttyd:
.PP
.RS
.nf
ttyd --ssl --ssl-cert server.crt --ssl-key server.key --ssl-ca ca.crt bash
.fi
.RE
.PP
You may want to test the client certificate verification with \fIcurl\fP(1):
.PP
.RS
.nf
curl --insecure --cert client.p12[:password] -v https://localhost:7681
.fi
.RE
.PP
If you don't want to enable client certificate verification, remove the \fB\fC--ssl-ca\fR option.
.SH Docker and ttyd
.PP
Docker containers are jailed environments which are more secure, this is useful for protecting the host system, you may use ttyd with docker like this:
.RS
.IP \(bu 2
Sharing single docker container with multiple clients: docker run -it --rm -p 7681:7681 tsl0922/ttyd.
.IP \(bu 2
Creating new docker container for each client: ttyd docker run -it --rm ubuntu.
.RE
.SH Nginx reverse proxy
.PP
Sample config to proxy ttyd under the \fB\fC/ttyd\fR path:
.PP
.RS
.nf
location ~ ^/ttyd(.*)$ {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:7681/$1;
}
.fi
.RE
.SH AUTHOR
.PP
Shuanglei Tao <tsl0922@gmail.com> Visit https://github.com/tsl0922/ttyd to get more information and report bugs.
================================================
FILE: man/ttyd.man.md
================================================
ttyd 1 "September 2016" ttyd "User Manual"
==================================================
# NAME
ttyd - Share your terminal over the web
# SYNOPSIS
**ttyd** [options] \<command\> [\<arguments...\>]
# DESCRIPTION
ttyd is a command-line tool for sharing terminal over the web that runs in *nix and windows systems, with the following features:
- Built on top of Libwebsockets with libuv for speed
- Fully-featured terminal based on Xterm.js with CJK (Chinese, Japanese, Korean) and IME support
- Graphical ZMODEM integration with lrzsz support
- Sixel image output support
- SSL support based on OpenSSL
- Run any custom command with options
- Basic authentication support and many other custom options
- Cross platform: macOS, Linux, FreeBSD/OpenBSD, OpenWrt/LEDE, Windows
# OPTIONS
-p, --port <port>
Port to listen (default: 7681, use `0` for random port)
-i, --interface <interface>
Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)
-U, --socket-owner
User owner of the UNIX domain socket file, when enabled (eg: user:group)
-c, --credential USER[:PASSWORD]
Credential for Basic Authentication (format: username:password)
-H, --auth-header <name>
HTTP Header name for auth proxy, this will configure ttyd to let a HTTP reverse proxy handle authentication
-u, --uid <uid>
User id to run with
-g, --gid <gid>
Group id to run with
-s, --signal <signal string>
Signal to send to the command when exit it (default: 1, SIGHUP)
-w, --cwd <path>
Working directory to be set for the child program
-a, --url-arg
Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)
-W, --writable
Allow clients to write to the TTY (readonly by default)
-t, --client-option <key=value>
Send option to client (format: key=value), repeat to add more options, see **CLIENT OPTIONS** for details
-T, --terminal-type
Terminal type to report, default: xterm-256color
-O, --check-origin
Do not allow websocket connection from different origin
-m, --max-clients
Maximum clients to support (default: 0, no limit)
-o, --once
Accept only one client and exit on disconnection
-q, --exit-no-conn
Exit on all clients disconnection
-B, --browser
Open terminal with the default system browser
-I, --index <index file>
Custom index.html path
-b, --base-path
Expected base path for requests coming from a reverse proxy (eg: /mounted/here, max length: 128)
-P, --ping-interval
Websocket ping interval(sec) (default: 5)
-f, --srv-buf-size
Maximum chunk of file (in bytes) that can be sent at once, a larger value may improve throughput (default: 4096)
-6, --ipv6
Enable IPv6 support
-S, --ssl
Enable SSL
-C, --ssl-cert <cert path>
SSL certificate file path
-K, --ssl-key <key path>
SSL key file path
-A, --ssl-ca <ca path>
SSL CA file path for client certificate verification
-d, --debug <level>
Set log level (default: 7)
-v, --version
Print the version and exit
-h, --help
Print this text and exit
# CLIENT OPTIONS
ttyd has a mechanism to pass server side command-line arguments to the browser page which is called **client options**:
```bash
-t, --client-option Send option to client (format: key=value), repeat to add more options
```
## Basic usage
- `-t rendererType=canvas`: use the `canvas` renderer for xterm.js (default: `webgl`)
- `-t disableLeaveAlert=true`: disable the leave page alert
- `-t disableResizeOverlay=true`: disable the terminal resize overlay
- `-t disableReconnect=true`: prevent the terminal from reconnecting on connection error/close
- `-t enableZmodem=true`: enable [ZMODEM](https://en.wikipedia.org/wiki/ZMODEM) / [lrzsz](https://ohse.de/uwe/software/lrzsz.html) file transfer support
- `-t enableTrzsz=true`: enable [trzsz](https://trzsz.github.io) file transfer support
- `-t enableSixel=true`: enable [Sixel](https://en.wikipedia.org/wiki/Sixel) image output support ([Usage](https://saitoha.github.io/libsixel/))
- `-t closeOnDisconnect=true`: close the terminal on disconnection, this will disable reconnect
- `-t titleFixed=hello`: set a fixed title for the browser window
- `-t fontSize=20`: change the font size of the terminal
- `-t unicodeVersion=11`: set xterm unicode support level (default: 11, use 6 to disable unicode addon)
- `-t trzszDragInitTimeout=3000`: set the timeout in milliseconds for initializing drag and drop files to upload. (default: 3000)
## Advanced usage
You can use the client option to change all the settings of xterm defined in [ITerminalOptions](https://xtermjs.org/docs/api/terminal/interfaces/iterminaloptions/), examples:
- `-t cursorStyle=bar`: set cursor style to `bar`
- `-t lineHeight=1.5`: set line-height to `1.5`
- `-t 'theme={"background": "green"}'`: set background color to `green`
to try the example options above, run:
```bash
ttyd -t cursorStyle=bar -t lineHeight=1.5 -t 'theme={"background": "green"}' bash
```
# EXAMPLES
ttyd starts web server at port 7681 by default, you can use the -p option to change it, the command will be started with arguments as options. For example, run:
```
ttyd -p 8080 bash -x
```
Then open http://localhost:8080 with a browser, you will get a bash shell with debug mode enabled. More examples:
- If you want to login with your system accounts on the web browser, run `ttyd login`.
- You can even run a non-shell command like vim, try: `ttyd vim`, the web browser will show you a vim editor.
- Sharing single process with multiple clients: `ttyd tmux new -A -s ttyd vim`, run `tmux new -A -s ttyd` to connect to the tmux session from terminal.
# SSL how-to
Generate SSL CA and self signed server/client certificates:
```
# CA certificate (FQDN must be different from server/client)
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt
# server certificate (for multiple domains, change subjectAltName to: DNS:example.com,DNS:www.example.com)
openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=localhost" -out server.csr
openssl x509 -sha256 -req -extfile <(printf "subjectAltName=DNS:localhost") -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
# client certificate (the p12/pem format may be useful for some clients)
openssl req -newkey rsa:2048 -nodes -keyout client.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=client" -out client.csr
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
openssl pkcs12 -in client.p12 -out client.pem -clcerts
```
Then start ttyd:
```
ttyd --ssl --ssl-cert server.crt --ssl-key server.key --ssl-ca ca.crt bash
```
You may want to test the client certificate verification with *curl*(1):
```
curl --insecure --cert client.p12[:password] -v https://localhost:7681
```
If you don't want to enable client certificate verification, remove the `--ssl-ca` option.
# Docker and ttyd
Docker containers are jailed environments which are more secure, this is useful for protecting the host system, you may use ttyd with docker like this:
- Sharing single docker container with multiple clients: docker run -it --rm -p 7681:7681 tsl0922/ttyd.
- Creating new docker container for each client: ttyd docker run -it --rm ubuntu.
# Nginx reverse proxy
Sample config to proxy ttyd under the `/ttyd` path:
```nginx
location ~ ^/ttyd(.*)$ {
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:7681/$1;
}
```
# AUTHOR
Shuanglei Tao \<tsl0922@gmail.com\> Visit https://github.com/tsl0922/ttyd to get more information and report bugs.
================================================
FILE: scripts/cross-build.sh
================================================
#!/bin/bash
#
# Example:
# env BUILD_TARGET=mips ./scripts/cross-build.sh
#
set -eo pipefail
CROSS_ROOT="${CROSS_ROOT:-/opt/cross}"
STAGE_ROOT="${STAGE_ROOT:-/opt/stage}"
BUILD_ROOT="${BUILD_ROOT:-/opt/build}"
BUILD_TARGET="${BUILD_TARGET:-x86_64}"
ZLIB_VERSION="${ZLIB_VERSION:-1.3.2}"
JSON_C_VERSION="${JSON_C_VERSION:-0.18}"
OPENSSL_VERSION="${OPENSSL_VERSION:-3.6.1}"
LIBUV_VERSION="${LIBUV_VERSION:-1.52.1}"
LIBWEBSOCKETS_VERSION="${LIBWEBSOCKETS_VERSION:-4.5.7}"
build_zlib() {
echo "=== Building zlib-${ZLIB_VERSION} (${TARGET})..."
curl -fSsLo- "https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
pushd "${BUILD_DIR}"/zlib-"${ZLIB_VERSION}"
env CHOST="${TARGET}" ./configure --static --archs="-fPIC" --prefix="${STAGE_DIR}" --disable-crcvx
make -j"$(nproc)" install
popd
}
build_json-c() {
echo "=== Building json-c-${JSON_C_VERSION} (${TARGET})..."
curl -fSsLo- "https://s3.amazonaws.com/json-c_releases/releases/json-c-${JSON_C_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
pushd "${BUILD_DIR}/json-c-${JSON_C_VERSION}"
rm -rf build && mkdir -p build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE="${BUILD_DIR}/cross-${TARGET}.cmake" \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX="${STAGE_DIR}" \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_TESTING=OFF \
-DDISABLE_THREAD_LOCAL_STORAGE=ON \
..
make -j"$(nproc)" install
popd
}
map_openssl_target() {
case $1 in
i686) echo linux-generic32 ;;
x86_64) echo linux-x86_64 ;;
arm|armhf|armv7l) echo linux-armv4 ;;
aarch64) echo linux-aarch64 ;;
mips|mipsel) echo linux-mips32 ;;
mips64|mips64el) echo linux64-mips64 ;;
powerpc64) echo linux-ppc64 ;;
powerpc64le) echo linux-ppc64le ;;
s390x) echo linux64-s390x ;;
win32) echo mingw64 ;;
*) echo "unknown openssl target: $1" && exit 1
esac
}
build_openssl() {
openssl_target=$(map_openssl_target "${BUILD_TARGET}")
echo "=== Building openssl-${OPENSSL_VERSION} (${openssl_target})..."
curl -sLo- "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
pushd "${BUILD_DIR}/openssl-${OPENSSL_VERSION}"
openssl_cflags="-fPIC -latomic"
case ${BUILD_TARGET} in
s390x) openssl_cflags="${openssl_cflags} -march=z10" ;;
win32)
curl -sLo- https://github.com/openssl/openssl/pull/29826.patch | patch -p1
;;
esac
env CC=gcc CROSS_COMPILE="${TARGET}-" CFLAGS="${openssl_cflags}" \
./Configure "${openssl_target}" no-ssl3 no-err -DOPENSSL_SMALL_FOOTPRINT --prefix="${STAGE_DIR}" \
&& make -j"$(nproc)" all > /dev/null && make install_sw
popd
}
build_libuv() {
echo "=== Building libuv-${LIBUV_VERSION} (${TARGET})..."
curl -fSsLo- "https://dist.libuv.org/dist/v${LIBUV_VERSION}/libuv-v${LIBUV_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
pushd "${BUILD_DIR}/libuv-v${LIBUV_VERSION}"
./autogen.sh
env CFLAGS=-fPIC ./configure --disable-shared --enable-static --prefix="${STAGE_DIR}" --host="${TARGET}"
make -j"$(nproc)" install
popd
}
install_cmake_cross_file() {
cat << EOF > "${BUILD_DIR}/cross-${TARGET}.cmake"
SET(CMAKE_SYSTEM_NAME $1)
set(CMAKE_C_COMPILER "${TARGET}-gcc")
set(CMAKE_CXX_COMPILER "${TARGET}-g++")
set(CMAKE_FIND_ROOT_PATH "${STAGE_DIR}")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(OPENSSL_USE_STATIC_LIBS TRUE)
EOF
}
build_libwebsockets() {
echo "=== Building libwebsockets-${LIBWEBSOCKETS_VERSION} (${TARGET})..."
curl -fSsLo- "https://github.com/warmcat/libwebsockets/archive/v${LIBWEBSOCKETS_VERSION}.tar.gz" | tar xz -C "${BUILD_DIR}"
pushd "${BUILD_DIR}/libwebsockets-${LIBWEBSOCKETS_VERSION}"
sed -i 's/ websockets_shared//g' cmake/libwebsockets-config.cmake.in
rm -rf build && mkdir -p build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE="${BUILD_DIR}/cross-${TARGET}.cmake" \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX="${STAGE_DIR}" \
-DCMAKE_FIND_LIBRARY_SUFFIXES=".a" \
-DCMAKE_EXE_LINKER_FLAGS="-static" \
-DLWS_WITHOUT_TESTAPPS=ON \
-DLWS_WITH_SSL=ON \
-DLWS_WITH_LIBUV=ON \
-DLWS_STATIC_PIC=ON \
-DLWS_WITH_SHARED=OFF \
-DLWS_UNIX_SOCK=ON \
-DLWS_IPV6=ON \
-DLWS_ROLE_RAW_FILE=OFF \
-DLWS_WITH_HTTP2=ON \
-DLWS_WITH_HTTP_BASIC_AUTH=OFF \
-DLWS_WITH_HTTP_STREAM_COMPRESSION=ON \
-DLWS_WITH_UDP=OFF \
-DLWS_WITHOUT_CLIENT=ON \
-DLWS_WITHOUT_EXTENSIONS=OFF \
-DLWS_WITH_LEJP=OFF \
-DLWS_WITH_LEJP_CONF=OFF \
-DLWS_WITH_LWSAC=OFF \
-DLWS_WITH_SEQUENCER=OFF \
-DLWS_WITH_UPNG=OFF \
-DLWS_WITH_JPEG=OFF \
-DLWS_WITH_DLO=OFF \
-DLWS_WITH_SYS_STATE=OFF \
-DLWS_WITH_SYS_SMD=OFF \
-DLWS_WITH_SECURE_STREAMS=OFF \
-DLWS_CTEST_INTERNET_AVAILABLE=OFF \
..
make -j"$(nproc)" install
popd
}
build_ttyd() {
echo "=== Building ttyd (${TARGET})..."
rm -rf build && mkdir -p build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE="${BUILD_DIR}/cross-${TARGET}.cmake" \
-DCMAKE_INSTALL_PREFIX="${STAGE_DIR}" \
-DCMAKE_FIND_LIBRARY_SUFFIXES=".a" \
-DCMAKE_C_FLAGS="-Os -ffunction-sections -fdata-sections -fno-unwind-tables -fno-asynchronous-unwind-tables -flto" \
-DCMAKE_EXE_LINKER_FLAGS="-static -no-pie -Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" \
-DCMAKE_BUILD_TYPE=RELEASE \
..
make install
}
build() {
TARGET="$1"
ALIAS="$2"
STAGE_DIR="${STAGE_ROOT}/${TARGET}"
BUILD_DIR="${BUILD_ROOT}/${TARGET}"
MUSL_CC_URL="https://github.com/tsl0922/musl-toolchains/releases/download/2021-11-23"
COMPONENTS="1"
SYSTEM="Linux"
if [ "$ALIAS" = "win32" ]; then
COMPONENTS=2
SYSTEM="Windows"
fi
echo "=== Installing toolchain ${ALIAS} (${TARGET})..."
mkdir -p "${CROSS_ROOT}" && export PATH="${PATH}:${CROSS_ROOT}/bin"
curl -fSsLo- "${MUSL_CC_URL}/${TARGET}-cross.tgz" | tar xz -C "${CROSS_ROOT}" --strip-components=${COMPONENTS}
echo "=== Building target ${ALIAS} (${TARGET})..."
rm -rf "${STAGE_DIR}" "${BUILD_DIR}"
mkdir -p "${STAGE_DIR}" "${BUILD_DIR}"
export PKG_CONFIG_PATH="${STAGE_DIR}/lib/pkgconfig"
install_cmake_cross_file ${SYSTEM}
build_zlib
build_json-c
build_libuv
build_openssl
build_libwebsockets
build_ttyd
}
case ${BUILD_TARGET} in
amd64) BUILD_TARGET="x86_64" ;;
arm64) BUILD_TARGET="aarch64" ;;
armv7) BUILD_TARGET="armv7l" ;;
ppc64) BUILD_TARGET="powerpc64" ;;
ppc64le) BUILD_TARGET="powerpc64le" ;;
esac
case ${BUILD_TARGET} in
i686|x86_64|aarch64|mips|mipsel|mips64|mips64el|powerpc64|powerpc64le|s390x)
build "${BUILD_TARGET}-linux-musl" "${BUILD_TARGET}"
;;
arm)
build "${BUILD_TARGET}-linux-musleabi" "${BUILD_TARGET}"
;;
armhf)
build arm-linux-musleabihf "${BUILD_TARGET}"
;;
armv7l)
build armv7l-linux-musleabihf "${BUILD_TARGET}"
;;
win32)
build x86_64-w64-mingw32 "${BUILD_TARGET}"
;;
*)
echo "unknown cross target: ${BUILD_TARGET}" && exit 1
esac
================================================
FILE: snap/snapcraft.yaml
================================================
name: ttyd
adopt-info: ttyd
summary: Share your terminal over the web
description: |
ttyd is a simple command-line tool for sharing terminal over the web
grade: stable
confinement: classic
base: core20
compression: lzo
license: MIT
assumes:
- command-chain
apps:
ttyd:
command: usr/bin/ttyd
command-chain:
- bin/homeishome-launch
parts:
ttyd:
source: https://github.com/tsl0922/ttyd
source-type: git
plugin: cmake
cmake-parameters:
- -DCMAKE_INSTALL_PREFIX=/usr
build-environment:
- LDFLAGS: "-pthread"
override-pull: |
snapcraftctl pull
snapcraftctl set-version "$(git describe --tags | sed 's/^v//' | cut -d "-" -f1)"
build-packages:
- build-essential
- libjson-c-dev
- libwebsockets-dev
stage-packages:
- libjson-c4
- libwebsockets15
homeishome-launch:
plugin: nil
stage-snaps:
- homeishome-launch
================================================
FILE: src/compat.h
================================================
/* compat.h -- MSVC compatibility shims for POSIX functions */
#ifndef TTYD_COMPAT_H
#define TTYD_COMPAT_H
#ifdef _MSC_VER
#include <string.h>
#include <sys/stat.h>
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#ifndef S_ISDIR
#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)
#endif
#ifndef S_ISREG
#define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG)
#endif
#endif
#endif /* TTYD_COMPAT_H */
================================================
FILE: src/html.h
================================================
unsigned char index_html[] = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xec, 0xbd,
0x69, 0x77, 0xe3, 0xb8, 0x92, 0x20, 0xfa, 0xfd, 0xfd, 0x0a, 0x5b, 0xb7,
0xae, 0x8f, 0x68, 0x51, 0xb2, 0x76, 0xdb, 0x92, 0x69, 0x3f, 0xef, 0xe9,
0x2c, 0x2f, 0x99, 0x4e, 0x3b, 0x37, 0x5f, 0x8f, 0x8b, 0x92, 0x28, 0x89,
0x99, 0x32, 0xa9, 0x22, 0x29, 0x2f, 0x69, 0xeb, 0x9d, 0xd7, 0xfb, 0x36,
0x3d, 0x33, 0xdd, 0x7d, 0xab, 0xf7, 0x9e, 0x9e, 0x7d, 0xef, 0x9e, 0xde,
0xf7, 0xe5, 0xbf, 0xbc, 0x1f, 0x30, 0xe7, 0xfd, 0x84, 0x17, 0x81, 0x85,
0x04, 0x48, 0x50, 0x52, 0x66, 0x56, 0xdd, 0xbe, 0x73, 0xce, 0xeb, 0xdb,
0x95, 0x16, 0x81, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x40, 0x20, 0xb0,
0x36, 0xbf, 0x73, 0xb2, 0x7d, 0xf6, 0xe6, 0xd9, 0xee, 0x5c, 0x3f, 0xb8,
0x1e, 0xac, 0xaf, 0xe1, 0xbf, 0x73, 0x03, 0xd3, 0xe9, 0x19, 0x19, 0xcb,
0xc9, 0xc0, 0xb7, 0x65, 0x76, 0xd6, 0xd7, 0xae, 0xad, 0xc0, 0x9c, 0x6b,
0xf7, 0x4d, 0xcf, 0xb7, 0x02, 0x23, 0x73, 0x7e, 0xb6, 0x97, 0x5f, 0xc9,
0xb0, 0xd4, 0x7e, 0x10, 0x0c, 0xf3, 0xd6, 0xd7, 0x23, 0xfb, 0xc6, 0xc8,
0xbc, 0xce, 0x9f, 0x6f, 0xe6, 0xb7, 0xdd, 0xeb, 0xa1, 0x19, 0xd8, 0xad,
0x81, 0x95, 0x99, 0x6b, 0xbb, 0x4e, 0x60, 0x39, 0x50, 0xe4, 0x60, 0xd7,
0xb0, 0x3a, 0x3d, 0x4b, 0x6f, 0xf7, 0x3d, 0xf7, 0xda, 0x32, 0x4a, 0xbc,
0xb4, 0x63, 0xc2, 0x57, 0xe6, 0xda, 0x6d, 0xd9, 0x03, 0x2b, 0x7f, 0x6b,
0xb5, 0xf2, 0xe6, 0x70, 0x98, 0x6f, 0x9b, 0x43, 0x53, 0x2e, 0x7e, 0x6f,
0xf9, 0x50, 0x22, 0xb0, 0x83, 0x81, 0xb5, 0x1e, 0x04, 0xf7, 0x9d, 0xb9,
0xfc, 0xdc, 0x99, 0xe5, 0x5d, 0xdb, 0x8e, 0x39, 0x58, 0x5b, 0xa2, 0xc9,
0x6b, 0x03, 0xdb, 0x79, 0x3f, 0xe7, 0x59, 0x03, 0x23, 0x63, 0x43, 0xb9,
0xcc, 0x5c, 0x70, 0x3f, 0x04, 0xd4, 0xf6, 0xb5, 0xd9, 0xb3, 0x96, 0x86,
0x4e, 0x2f, 0x33, 0xd7, 0xf7, 0xac, 0xae, 0x91, 0xe9, 0x98, 0x81, 0xd9,
0x08, 0x53, 0x9b, 0x2d, 0xd3, 0xb7, 0xea, 0x55, 0xdd, 0x7e, 0xb9, 0x75,
0x72, 0x7a, 0x5b, 0xfc, 0x72, 0xbf, 0xe7, 0x6e, 0xc2, 0xff, 0x1d, 0xbf,
0x38, 0xef, 0xef, 0x9e, 0xf7, 0xe0, 0xd7, 0x36, 0x7e, 0x6e, 0xb6, 0xb7,
0x37, 0xdf, 0x90, 0x1f, 0xb7, 0x5e, 0xd1, 0xc6, 0xbf, 0xfb, 0xaf, 0x4f,
0xf7, 0x5e, 0x3d, 0x39, 0x3d, 0x6b, 0x95, 0xdf, 0x16, 0x3b, 0xe5, 0xbd,
0xfb, 0xb7, 0xcf, 0xb7, 0xb6, 0xde, 0xee, 0xaf, 0xda, 0x6f, 0x5f, 0x6c,
0x3d, 0x6d, 0xbd, 0xda, 0x73, 0xde, 0xbe, 0x7c, 0x3a, 0x78, 0xf3, 0xea,
0xb4, 0xd6, 0x6e, 0x0f, 0x06, 0xcf, 0xb0, 0x40, 0xf1, 0x6e, 0xf8, 0x72,
0xaf, 0x5f, 0x7c, 0xb5, 0x5b, 0x3a, 0x3a, 0xb9, 0x3e, 0xbe, 0x69, 0xbd,
0xa8, 0xf5, 0x29, 0x7c, 0xad, 0xda, 0x7a, 0xbd, 0x49, 0xff, 0x6f, 0xe7,
0x76, 0xc9, 0x7a, 0xb2, 0xd5, 0x7f, 0x53, 0x0e, 0x06, 0x9d, 0xed, 0x2d,
0xfb, 0xed, 0xab, 0xce, 0xb0, 0xf5, 0xae, 0x68, 0x2f, 0x2f, 0x8f, 0x96,
0x0e, 0xec, 0xad, 0xe1, 0xdb, 0x9d, 0xa2, 0xfd, 0xf2, 0xc3, 0xcb, 0xe3,
0xa3, 0xdd, 0xd2, 0xed, 0xf3, 0xf2, 0x4b, 0xd7, 0x3c, 0xef, 0xd7, 0xdb,
0xd7, 0x2f, 0xcf, 0xac, 0xf7, 0xb5, 0xf3, 0x37, 0x95, 0xa1, 0xf7, 0xe6,
0xc3, 0xe0, 0xfd, 0xc1, 0xbb, 0x95, 0xdc, 0xc1, 0xce, 0x5d, 0xf5, 0xc4,
0xe9, 0x07, 0xed, 0xfd, 0xd2, 0xa0, 0xb3, 0xbf, 0xdb, 0xb3, 0xf6, 0x4b,
0x7e, 0xcb, 0x39, 0xaa, 0x5b, 0x50, 0x1e, 0x68, 0xba, 0x79, 0x73, 0x7d,
0x5e, 0xc7, 0xef, 0xd6, 0xab, 0x97, 0xc5, 0x37, 0x2f, 0x56, 0xec, 0x83,
0x27, 0xbd, 0x3a, 0xc0, 0xdc, 0x76, 0xf6, 0xfd, 0xd5, 0x83, 0xf7, 0x7b,
0xef, 0x5b, 0xe5, 0xa7, 0x83, 0x83, 0xbd, 0xfe, 0xf1, 0xf9, 0xf6, 0xd6,
0x4e, 0xab, 0x02, 0xbf, 0x77, 0xce, 0x47, 0xc7, 0x76, 0xe9, 0xdd, 0xd1,
0xce, 0x9b, 0xca, 0xc1, 0x4e, 0xbb, 0x76, 0xf8, 0x6e, 0xb7, 0x74, 0xfc,
0xa1, 0x5d, 0x3c, 0xbe, 0xbf, 0xed, 0x1d, 0xbd, 0xdb, 0xbc, 0x3b, 0x7e,
0xb1, 0x72, 0x7b, 0x74, 0xbf, 0xf2, 0xe1, 0x68, 0xbb, 0x78, 0x7f, 0xf4,
0xc1, 0x2d, 0x1e, 0xed, 0xc0, 0x7f, 0xf6, 0x66, 0xef, 0x60, 0x9b, 0xfd,
0xf7, 0xae, 0xda, 0x7b, 0xf6, 0xe4, 0xe9, 0xfb, 0xb7, 0xef, 0x86, 0x2f,
0x4e, 0x77, 0xdf, 0x84, 0xf4, 0xb4, 0xaf, 0x4f, 0xaf, 0x9f, 0xbd, 0x78,
0xea, 0x76, 0x9e, 0x9c, 0xde, 0x9e, 0xd8, 0x2b, 0x37, 0x9d, 0x4a, 0xa7,
0x72, 0xe8, 0xb4, 0x3f, 0x1c, 0x5e, 0xaf, 0xde, 0xbf, 0xbd, 0x5f, 0xb9,
0x3b, 0x39, 0x7b, 0x5f, 0x3b, 0xfc, 0xb0, 0x79, 0x7f, 0xf8, 0xe1, 0xe0,
0xfe, 0xf0, 0x35, 0x94, 0xb7, 0x4b, 0x1f, 0xac, 0x57, 0xb5, 0xe2, 0x9b,
0xd7, 0xbd, 0x00, 0xca, 0xbf, 0x13, 0xf0, 0xee, 0xbe, 0x7d, 0x7d, 0xfc,
0xae, 0x7d, 0x3d, 0x80, 0x36, 0x0c, 0x6e, 0x5a, 0xf6, 0xd6, 0xfd, 0xdb,
0xfd, 0x37, 0xf5, 0x37, 0xaf, 0x9e, 0xde, 0x74, 0x5e, 0x3f, 0x5f, 0x3d,
0xb0, 0x0f, 0x22, 0x1e, 0x40, 0x3b, 0xcf, 0xce, 0x8b, 0xab, 0x07, 0xd7,
0xfd, 0x62, 0xe7, 0xc9, 0x66, 0xfd, 0xf0, 0x7e, 0x75, 0xd4, 0xbe, 0x0f,
0xfb, 0xe2, 0x5d, 0xab, 0x5c, 0xbc, 0xb1, 0xf6, 0xf7, 0x6e, 0x0f, 0x3f,
0xec, 0x8e, 0x8e, 0xb6, 0x57, 0x83, 0x16, 0xe1, 0x4f, 0x3f, 0x68, 0xed,
0xd7, 0x3e, 0x9c, 0x38, 0xc7, 0xc5, 0xf3, 0xeb, 0x97, 0x12, 0xcd, 0x80,
0x73, 0xc4, 0x78, 0x3a, 0x7a, 0x53, 0x5e, 0x0d, 0x0e, 0x2b, 0xfd, 0x7e,
0x7b, 0x7b, 0xe5, 0xee, 0xf0, 0xdd, 0xe6, 0x4d, 0xbb, 0x04, 0xfd, 0xbf,
0x7f, 0x7e, 0x03, 0x65, 0x3e, 0xb4, 0x2a, 0x2f, 0xef, 0xdf, 0x94, 0x5f,
0xbe, 0x78, 0xfb, 0xea, 0xcd, 0x3b, 0xe8, 0xcb, 0x6a, 0xeb, 0xd5, 0xdd,
0xa8, 0xfd, 0x61, 0x88, 0x7d, 0x3f, 0x23, 0x2d, 0x94, 0x8e, 0x36, 0xb0,
0xfe, 0xe4, 0x3d, 0xd4, 0x57, 0x79, 0x19, 0xbc, 0x05, 0x5e, 0xbc, 0x38,
0x87, 0xf6, 0x61, 0x5f, 0x6f, 0xd7, 0xde, 0x9b, 0xaf, 0x9e, 0xd7, 0x4f,
0xce, 0x7a, 0xf7, 0xa7, 0xef, 0xa0, 0xe6, 0x77, 0x9b, 0x95, 0xa3, 0xb3,
0xb7, 0xbb, 0x47, 0x67, 0x7b, 0x7b, 0xc7, 0xef, 0x7a, 0xe5, 0xa3, 0xe2,
0xf1, 0xf6, 0xc9, 0xee, 0x9b, 0xca, 0xe9, 0xbb, 0xa7, 0x5b, 0x47, 0xf0,
0xf7, 0xb8, 0xb8, 0x2b, 0xe0, 0x1b, 0x8c, 0xda, 0x95, 0xd3, 0x7e, 0xeb,
0xfa, 0x78, 0x20, 0xe0, 0x1b, 0x4a, 0xf8, 0x40, 0xc2, 0x66, 0xc2, 0xb7,
0x33, 0xdc, 0x01, 0x99, 0xec, 0x77, 0xf6, 0x57, 0xef, 0x5f, 0xee, 0xaf,
0xde, 0xb4, 0x40, 0xe6, 0x9e, 0x53, 0xfe, 0xf4, 0xce, 0xf7, 0xfb, 0x37,
0x90, 0xfe, 0xc1, 0xdc, 0x5f, 0xbd, 0x3d, 0xd8, 0x3d, 0xde, 0x39, 0xd8,
0x39, 0xb8, 0x3d, 0x3a, 0x3b, 0xef, 0x7d, 0xb9, 0x5b, 0x02, 0x99, 0x1f,
0x8c, 0x48, 0xde, 0xf6, 0x7b, 0xfb, 0x99, 0xbd, 0xb9, 0xc2, 0xfa, 0xa9,
0x7e, 0xba, 0xff, 0xf2, 0xde, 0x7c, 0xfd, 0x76, 0xf0, 0x76, 0xf7, 0xed,
0x3d, 0xf0, 0xa3, 0x07, 0x74, 0x22, 0x0f, 0xeb, 0xe6, 0xab, 0xda, 0x87,
0xce, 0xfe, 0x1e, 0xf0, 0xfc, 0xe5, 0xd3, 0x53, 0x41, 0xae, 0x81, 0x77,
0xef, 0x90, 0xee, 0xb6, 0x50, 0xd7, 0xc9, 0xbb, 0xf3, 0xca, 0x9b, 0xeb,
0xe7, 0x77, 0xc7, 0xef, 0xfa, 0xef, 0x0e, 0x5f, 0x1d, 0xd4, 0xde, 0xee,
0xb4, 0x83, 0xa3, 0xb3, 0xdd, 0xca, 0xc9, 0x8b, 0x52, 0xff, 0xa8, 0x7c,
0x3a, 0x38, 0x7c, 0xf5, 0xf6, 0xfa, 0xf8, 0xdd, 0xf3, 0xfb, 0x37, 0x67,
0x47, 0xd5, 0xe3, 0xb3, 0xa7, 0xd7, 0x47, 0xdb, 0x07, 0x61, 0x3d, 0x88,
0xaf, 0xf3, 0xaa, 0x34, 0x68, 0x39, 0xa7, 0xdf, 0x45, 0x3d, 0x37, 0xd8,
0xd6, 0xc3, 0x8a, 0x42, 0x86, 0x51, 0xb6, 0xb7, 0x57, 0x89, 0x1c, 0x9f,
0xbf, 0x3f, 0xdd, 0xa7, 0x70, 0x74, 0x9c, 0x92, 0x71, 0x7b, 0x06, 0xf9,
0x3b, 0xab, 0xd5, 0xf6, 0xfe, 0xde, 0x3b, 0xb3, 0xfc, 0xb2, 0x78, 0xb0,
0xff, 0x72, 0x84, 0xfa, 0xa1, 0x6d, 0x1f, 0x2c, 0x3d, 0xeb, 0xfb, 0xbe,
0x7f, 0x84, 0xfa, 0xea, 0x70, 0xe7, 0xc5, 0xf9, 0xe9, 0xd6, 0xcb, 0x27,
0xef, 0xcc, 0xbb, 0x3d, 0x73, 0xf5, 0xdd, 0xdd, 0xd3, 0xad, 0xbd, 0x27,
0x2b, 0x1f, 0x76, 0x8e, 0x3a, 0xdb, 0x6f, 0xbc, 0xfe, 0xc1, 0xe6, 0x70,
0x08, 0x63, 0xd3, 0xdc, 0xaf, 0x6d, 0xd7, 0x4e, 0x9f, 0xe7, 0x3e, 0x9c,
0x94, 0xf7, 0x83, 0xfb, 0x5a, 0x6f, 0xd8, 0x7a, 0x53, 0xfe, 0xd2, 0x6f,
0x9d, 0xdc, 0x8f, 0x4a, 0x47, 0xde, 0xfe, 0xfe, 0x6e, 0xf0, 0x6e, 0x69,
0x73, 0xd5, 0x0f, 0x0e, 0x9f, 0xbd, 0xf6, 0xeb, 0xdb, 0xef, 0x9e, 0xd6,
0xf6, 0xdf, 0x1c, 0xec, 0xd5, 0x37, 0x77, 0x6b, 0x07, 0x3b, 0x5b, 0x4f,
0xde, 0x5e, 0x77, 0xf7, 0x57, 0xcb, 0x7b, 0xd5, 0xb7, 0x1f, 0x6e, 0x9e,
0x6f, 0x3a, 0xf7, 0xf7, 0x27, 0xcb, 0x27, 0x2b, 0x1f, 0x5e, 0xe7, 0x96,
0x2b, 0xdd, 0x5c, 0xad, 0x77, 0xda, 0xa9, 0xb4, 0x6e, 0x6e, 0x5e, 0xf4,
0xba, 0xdd, 0xe3, 0xea, 0xd2, 0x60, 0xb5, 0xba, 0xf2, 0xa6, 0xb7, 0xf9,
0x62, 0xaf, 0xff, 0x7c, 0xd5, 0x7c, 0xd5, 0xff, 0xfa, 0xa8, 0x9e, 0x1b,
0xbe, 0xe9, 0x7a, 0x2f, 0xdf, 0xed, 0xd4, 0x5e, 0x3d, 0x59, 0x3d, 0xfe,
0x72, 0xa5, 0xbb, 0x7c, 0xb7, 0x62, 0xb5, 0x8e, 0x9d, 0x97, 0xc1, 0xcd,
0xab, 0xed, 0x7a, 0x6b, 0xe9, 0xd4, 0x7c, 0x76, 0x07, 0x3a, 0xe5, 0xce,
0xbf, 0xbb, 0x6e, 0x6d, 0xd5, 0x06, 0x07, 0xdd, 0x63, 0xff, 0x60, 0xe7,
0xa8, 0xd7, 0xf3, 0x2c, 0xeb, 0xc3, 0xd7, 0xfb, 0x25, 0x77, 0x75, 0xff,
0x60, 0xff, 0xdd, 0xca, 0x6e, 0xb5, 0xf6, 0x61, 0xef, 0xf8, 0xc3, 0x9b,
0x9e, 0x73, 0x5e, 0xdd, 0xa9, 0xdd, 0xdd, 0x9f, 0x9f, 0xbf, 0xdf, 0xea,
0x0d, 0x86, 0x7b, 0x9b, 0x5f, 0x76, 0x7b, 0xaf, 0xcc, 0x5a, 0x6f, 0xef,
0xcd, 0xca, 0xaa, 0x77, 0xfc, 0xf2, 0xa6, 0xf7, 0xf4, 0xe9, 0x51, 0xef,
0xc5, 0xd6, 0xfb, 0xe1, 0xbb, 0xf6, 0x4b, 0xfb, 0xe0, 0xe0, 0xc5, 0x66,
0xf5, 0xf5, 0xe6, 0x41, 0x75, 0x69, 0xf7, 0xcd, 0xfb, 0xad, 0xd7, 0x67,
0x9d, 0xfb, 0x37, 0xcf, 0x57, 0x0f, 0x4f, 0xce, 0xcf, 0x57, 0xfd, 0xdb,
0xe5, 0xd6, 0xf5, 0x7e, 0x79, 0xf0, 0x75, 0xef, 0xd9, 0xed, 0xed, 0xe6,
0x97, 0x2f, 0x5e, 0xae, 0xee, 0x2c, 0x3d, 0xab, 0x2d, 0xed, 0x97, 0xdb,
0xfe, 0x71, 0xe0, 0x1e, 0x3f, 0x5d, 0x2e, 0xe5, 0x2a, 0xe5, 0x27, 0x7b,
0xef, 0xbe, 0x3e, 0xf1, 0x3f, 0xdc, 0x3f, 0x7f, 0xbf, 0xf3, 0x66, 0xf5,
0xee, 0xb0, 0xe5, 0xbd, 0x7b, 0xbf, 0xeb, 0x7a, 0x2f, 0xac, 0xdc, 0xed,
0x9b, 0xfd, 0x76, 0x7d, 0xd9, 0x5d, 0x2e, 0xbf, 0xfa, 0x50, 0xee, 0xbc,
0xf8, 0xfa, 0x65, 0x2e, 0x78, 0xe7, 0xad, 0x5a, 0x55, 0xdb, 0xde, 0xec,
0x76, 0x5a, 0x4e, 0xf7, 0x30, 0xb7, 0x5f, 0xdd, 0x2a, 0x15, 0x6f, 0x83,
0x9d, 0x97, 0x4b, 0xce, 0xd6, 0x8b, 0x37, 0x9b, 0xc7, 0xb5, 0x93, 0x62,
0xad, 0x62, 0xd9, 0x37, 0x2f, 0xbf, 0x0e, 0x6e, 0xbe, 0x2e, 0x9d, 0x7f,
0xe9, 0x2d, 0x9d, 0xee, 0x98, 0x2f, 0xb7, 0xdd, 0xee, 0xf6, 0x3d, 0xfc,
0xbb, 0xea, 0xf6, 0x5e, 0xef, 0x16, 0xbf, 0x3e, 0x78, 0x01, 0xdd, 0xe4,
0x3f, 0xad, 0xec, 0x0f, 0xb6, 0x3f, 0x7c, 0xd8, 0x7f, 0xff, 0xfc, 0x49,
0xfb, 0x64, 0xb7, 0x77, 0xb6, 0xe2, 0x94, 0xef, 0x5e, 0x1d, 0xde, 0x77,
0xef, 0x73, 0xaf, 0xad, 0x9d, 0x5b, 0x73, 0xe7, 0xcb, 0xe5, 0x97, 0xe6,
0xf2, 0xeb, 0xeb, 0xe5, 0xca, 0xeb, 0xea, 0x9b, 0xf3, 0x27, 0xa6, 0x79,
0xda, 0x3d, 0xba, 0x6d, 0xb7, 0x0e, 0x9e, 0x75, 0xce, 0x8e, 0xb7, 0xf6,
0x5f, 0x6d, 0xbd, 0xb8, 0x7d, 0xff, 0xac, 0xb2, 0x7b, 0xdb, 0xf1, 0x56,
0x5f, 0x7b, 0xab, 0x7b, 0xed, 0xd6, 0xe6, 0xf9, 0xed, 0xf0, 0x60, 0xfb,
0xfd, 0xfd, 0x97, 0x9b, 0xaf, 0x47, 0x67, 0xa7, 0x9d, 0xf7, 0x07, 0x9b,
0x77, 0x4f, 0xaa, 0xcf, 0xcf, 0xfa, 0x27, 0xbb, 0x4e, 0xbd, 0xf4, 0xaa,
0xfc, 0xe6, 0xc5, 0x97, 0xde, 0x68, 0xf3, 0xe5, 0xd0, 0x7a, 0x6a, 0x9f,
0x3f, 0xb7, 0xdf, 0x9c, 0x3e, 0x7f, 0xf7, 0xf5, 0x93, 0x83, 0xeb, 0xf7,
0xab, 0xce, 0xce, 0xbb, 0x1d, 0x18, 0x9e, 0xef, 0x9c, 0x93, 0x5c, 0x67,
0x79, 0xd8, 0x39, 0xae, 0xf5, 0x5f, 0x9f, 0xdc, 0x9e, 0x8e, 0xf6, 0x5f,
0x77, 0xde, 0x9c, 0xf6, 0x7a, 0x9b, 0xc7, 0x07, 0x9d, 0xa3, 0x55, 0xff,
0xbe, 0x1c, 0x9c, 0x59, 0xfb, 0xcf, 0xfc, 0xd1, 0xf1, 0xf0, 0xe6, 0xf8,
0xe9, 0x6d, 0xef, 0xfd, 0xe9, 0xcb, 0xf3, 0xa3, 0xe1, 0x9b, 0x67, 0x9d,
0x97, 0xb5, 0xce, 0xd3, 0xf3, 0x53, 0xff, 0xe0, 0xed, 0xdb, 0xd5, 0x57,
0x5b, 0xbb, 0x5b, 0x75, 0xf3, 0xb4, 0xff, 0xe5, 0x7b, 0xcb, 0x7a, 0xf5,
0xe2, 0x83, 0x5d, 0x7e, 0xb7, 0xfa, 0xfe, 0xee, 0xfd, 0xca, 0xcd, 0xe1,
0xde, 0xd7, 0xfe, 0xe6, 0xd6, 0xde, 0xfb, 0x9b, 0xc1, 0xab, 0x17, 0x6f,
0xfa, 0xee, 0xd7, 0x1d, 0xc7, 0xae, 0x7f, 0x78, 0x53, 0xee, 0x9c, 0x76,
0x9f, 0x3c, 0xed, 0xbe, 0x71, 0x77, 0xbd, 0x9b, 0xbb, 0xad, 0xbd, 0xc3,
0x56, 0xcd, 0x82, 0xd9, 0xf4, 0x7c, 0x67, 0x6f, 0xf0, 0x66, 0xfb, 0x76,
0x67, 0x78, 0xb4, 0xb2, 0x7d, 0x5e, 0x1c, 0xee, 0xee, 0xb8, 0x9b, 0x3b,
0xe7, 0xfb, 0x4f, 0x56, 0xdf, 0x6c, 0x77, 0x57, 0x3a, 0xbd, 0x2f, 0x47,
0xcf, 0x5f, 0x9c, 0x9a, 0xbd, 0xd7, 0xae, 0xbb, 0x74, 0xd8, 0x2b, 0xee,
0x98, 0x95, 0xed, 0xad, 0x97, 0xb7, 0xd7, 0x40, 0xdd, 0xd6, 0x97, 0x5b,
0x37, 0xd5, 0xfa, 0x5e, 0xf7, 0xc9, 0xf1, 0xc1, 0xa0, 0x9d, 0xdb, 0x7a,
0xb3, 0xf7, 0xf6, 0xf9, 0x13, 0xab, 0x78, 0xbf, 0xe5, 0x3c, 0x7f, 0xd6,
0x3b, 0x2e, 0x3e, 0xd9, 0x0b, 0x5e, 0xae, 0x3c, 0x59, 0x79, 0x79, 0xfd,
0xfa, 0xbd, 0xbb, 0xb2, 0xb9, 0xd5, 0xdb, 0x3d, 0x71, 0x4b, 0xa3, 0x83,
0x9d, 0xb7, 0x47, 0xad, 0xed, 0x57, 0x9b, 0x87, 0xa7, 0xf6, 0xf3, 0xcd,
0xd3, 0xa5, 0xde, 0xfb, 0x9b, 0xe1, 0xd7, 0xfe, 0x79, 0xee, 0xb4, 0x3d,
0xa8, 0xf6, 0x5e, 0xad, 0x7e, 0x38, 0xad, 0x3f, 0x3d, 0xdc, 0x7e, 0xfd,
0xfa, 0x79, 0xed, 0xf5, 0xd9, 0xcb, 0xcd, 0x2f, 0x4f, 0x97, 0xfc, 0xaf,
0x0f, 0x6e, 0xf6, 0x4f, 0x76, 0x06, 0x2b, 0xab, 0x5b, 0xce, 0xd3, 0xee,
0xe1, 0x93, 0xf6, 0xe9, 0xd3, 0xe3, 0xb6, 0xf5, 0xac, 0x1e, 0x3c, 0x5f,
0xed, 0xee, 0x78, 0xd5, 0xdc, 0xe9, 0xf5, 0xe9, 0x93, 0xeb, 0xcd, 0xf3,
0xaf, 0x5d, 0xfb, 0x70, 0xf7, 0xfd, 0x89, 0x73, 0x54, 0xba, 0x69, 0x95,
0x87, 0x1f, 0x56, 0xb6, 0x77, 0x36, 0xb7, 0xcf, 0x8f, 0x7a, 0xed, 0x27,
0xbb, 0x95, 0x97, 0x47, 0x5f, 0x13, 0x83, 0x60, 0xeb, 0xe9, 0xe9, 0x79,
0x6d, 0xd7, 0x7b, 0xff, 0xb4, 0xd7, 0xeb, 0x19, 0x46, 0x66, 0x69, 0x7d,
0xcd, 0x0f, 0xee, 0x07, 0x16, 0x33, 0x6d, 0x02, 0xeb, 0x2e, 0x58, 0x6a,
0xfb, 0x60, 0x19, 0x15, 0xee, 0x02, 0xb0, 0x86, 0x1e, 0xda, 0x23, 0xcf,
0x77, 0xbd, 0x06, 0xa6, 0x37, 0x87, 0xae, 0x6f, 0x07, 0xb6, 0xeb, 0x34,
0xc0, 0x22, 0x02, 0x6b, 0xec, 0xc6, 0x6a, 0x8e, 0x7c, 0xcb, 0xcb, 0xfb,
0xd6, 0xc0, 0x6a, 0x07, 0x0d, 0xc7, 0x75, 0xac, 0x66, 0xfe, 0xda, 0xcf,
0x27, 0x13, 0xc1, 0x08, 0x7b, 0x6f, 0x07, 0x89, 0x8c, 0x31, 0xad, 0xa3,
0xd0, 0x75, 0xdb, 0x23, 0x5f, 0xa7, 0x1f, 0x0d, 0xf2, 0xf1, 0xe0, 0x8e,
0x02, 0xb0, 0xbd, 0x2c, 0x11, 0x6c, 0x8e, 0xfe, 0xc9, 0xf7, 0xad, 0xc1,
0xd0, 0xf2, 0xfc, 0x87, 0x90, 0x1a, 0xb3, 0xe5, 0xbb, 0x83, 0x51, 0x60,
0x35, 0x03, 0x77, 0xd8, 0x28, 0x36, 0x3f, 0xe4, 0x6d, 0xa7, 0x63, 0xdd,
0x35, 0x6a, 0xca, 0x72, 0x79, 0x6c, 0x89, 0xe9, 0x59, 0xe6, 0x43, 0xcb,
0xf5, 0x3a, 0x96, 0x07, 0x05, 0xfa, 0x96, 0xdd, 0xeb, 0x07, 0xf0, 0x63,
0x60, 0x75, 0x83, 0x46, 0x7e, 0x15, 0xfe, 0xcf, 0xba, 0x6e, 0x5e, 0x9b,
0x5e, 0xcf, 0x76, 0x20, 0xd5, 0x1d, 0x9a, 0x6d, 0x3b, 0xb8, 0xc7, 0x5f,
0x37, 0x96, 0xd7, 0x1d, 0xb8, 0xb7, 0x8d, 0xbe, 0xdd, 0xe9, 0x58, 0x4e,
0x73, 0x68, 0x76, 0x3a, 0xb6, 0xd3, 0x83, 0x9c, 0x24, 0x2d, 0x9e, 0xe5,
0xdb, 0x1f, 0x28, 0xfd, 0x8c, 0xae, 0xdb, 0xbe, 0x1d, 0x58, 0x79, 0x1f,
0xb0, 0x61, 0xf2, 0xad, 0x67, 0x0e, 0x9b, 0xb7, 0x76, 0x27, 0xe8, 0x0b,
0x24, 0xe7, 0x23, 0x9a, 0xdb, 0x60, 0xf1, 0x32, 0xa4, 0xf9, 0x1b, 0xdb,
0xba, 0x7d, 0x68, 0x99, 0xed, 0xf7, 0x3d, 0xcf, 0x1d, 0x39, 0x9d, 0xc6,
0xf7, 0x8a, 0xc5, 0x62, 0xb3, 0xed, 0x0e, 0xa0, 0x5f, 0xbe, 0xd7, 0xed,
0x76, 0x9b, 0x1d, 0xdb, 0x1f, 0x0e, 0xcc, 0x7b, 0x5a, 0x59, 0x92, 0x14,
0x45, 0xc5, 0xbc, 0xc2, 0x52, 0x6a, 0x7d, 0x05, 0xb3, 0x8d, 0x3d, 0xfc,
0xc0, 0x71, 0xb7, 0x06, 0x6e, 0xfb, 0x7d, 0x8c, 0xa3, 0x08, 0x37, 0x74,
0xbd, 0x40, 0xa0, 0x2d, 0xcf, 0xc8, 0x42, 0x0a, 0x5b, 0x6e, 0x10, 0xb8,
0xd7, 0xd0, 0x3c, 0x26, 0x43, 0x1d, 0xab, 0x6b, 0x8e, 0x06, 0x01, 0x65,
0x73, 0xc4, 0xcd, 0xfc, 0x7d, 0xc3, 0x6f, 0x7b, 0xee, 0x60, 0xa0, 0xe2,
0x22, 0xeb, 0x19, 0xc2, 0xc1, 0x58, 0xed, 0x50, 0xc8, 0xb2, 0x9c, 0x87,
0x84, 0x50, 0x2a, 0xc1, 0xe6, 0xda, 0xa6, 0x73, 0x63, 0xfa, 0x0f, 0xac,
0xee, 0x14, 0xd9, 0x49, 0x16, 0x05, 0xb2, 0xf2, 0x44, 0x5a, 0x6e, 0x6c,
0xdf, 0x86, 0x05, 0x05, 0x0a, 0x02, 0xed, 0x7d, 0x06, 0x9b, 0xc7, 0x15,
0x4c, 0xfe, 0xda, 0x32, 0xfd, 0x91, 0x67, 0xe5, 0x41, 0xb6, 0xaf, 0x61,
0x71, 0x11, 0x72, 0xcd, 0x76, 0x50, 0x8a, 0xf3, 0x84, 0x79, 0xb2, 0x78,
0x91, 0x74, 0x26, 0x79, 0x8e, 0xeb, 0x5d, 0x9b, 0xaa, 0xe6, 0x53, 0xc1,
0x49, 0xab, 0xba, 0x60, 0x39, 0xb8, 0xa4, 0xc9, 0x5f, 0xbb, 0x30, 0xb0,
0xf2, 0xd6, 0x0d, 0x54, 0xec, 0x3f, 0xc8, 0xbc, 0x8e, 0x35, 0x88, 0x66,
0xe6, 0x87, 0xae, 0x0d, 0x6b, 0x20, 0x8f, 0x8d, 0x38, 0x65, 0x1e, 0xc7,
0xc3, 0x3e, 0x79, 0x8d, 0xd0, 0xbb, 0xa3, 0x6b, 0x87, 0x8d, 0x61, 0x3a,
0x6e, 0x39, 0x24, 0xf0, 0xca, 0xf7, 0xfb, 0xa6, 0xed, 0xc5, 0xea, 0x34,
0xdb, 0x6d, 0xcb, 0x0f, 0x1b, 0xe0, 0xb8, 0x41, 0xb6, 0xd0, 0xb1, 0x5a,
0xa3, 0x9e, 0xa6, 0xcb, 0x70, 0xd7, 0x00, 0x05, 0x0b, 0xa8, 0x87, 0x48,
0x6a, 0x88, 0x24, 0x05, 0x9e, 0xe9, 0x80, 0xe8, 0x7a, 0xd0, 0xb8, 0x66,
0xd8, 0x79, 0x84, 0x26, 0xd6, 0xe2, 0x34, 0xa9, 0x97, 0x44, 0x27, 0x12,
0xf8, 0x78, 0x1f, 0x4b, 0xe4, 0xe5, 0x03, 0x90, 0x15, 0x91, 0xc6, 0xb9,
0x46, 0x83, 0xb6, 0x15, 0x50, 0x3f, 0x24, 0x08, 0x9a, 0x8a, 0xea, 0x41,
0xd4, 0x78, 0x44, 0x85, 0x8a, 0x63, 0x71, 0xe8, 0x45, 0xb2, 0x3a, 0x00,
0xc1, 0xcd, 0x7b, 0x56, 0x0f, 0xeb, 0x61, 0x52, 0x51, 0x1a, 0xde, 0x09,
0x22, 0x03, 0x1f, 0x09, 0xf5, 0x93, 0x1c, 0xe9, 0x44, 0x9f, 0x40, 0x41,
0x2e, 0x9c, 0x1d, 0xfb, 0xfa, 0x81, 0xeb, 0xaf, 0xd2, 0xbc, 0x7d, 0x8d,
0xa3, 0xd5, 0x0c, 0x09, 0xcf, 0xc3, 0x80, 0xb5, 0x3c, 0x22, 0x89, 0xa5,
0x07, 0x24, 0x2f, 0xdf, 0xb1, 0xda, 0xae, 0x67, 0x12, 0xa4, 0x61, 0x5e,
0x12, 0xb8, 0x9c, 0x00, 0xee, 0xb8, 0x23, 0x90, 0xc4, 0xb9, 0x09, 0x65,
0x2a, 0x89, 0x32, 0xb7, 0xe6, 0xcd, 0xfd, 0xa4, 0x12, 0x55, 0x45, 0x2d,
0x41, 0x60, 0x75, 0x26, 0x95, 0xa9, 0x25, 0xcb, 0x98, 0x7e, 0x5f, 0x55,
0x06, 0x99, 0x89, 0xdf, 0x89, 0x02, 0x3c, 0x23, 0x0e, 0x38, 0x03, 0xcb,
0x38, 0x68, 0x7a, 0x6d, 0x33, 0xb0, 0x32, 0x44, 0x92, 0xc6, 0xd3, 0x54,
0x5c, 0x49, 0x16, 0x87, 0xb8, 0xd4, 0xbc, 0x4e, 0xc5, 0x94, 0x64, 0xbd,
0x40, 0x95, 0xba, 0x0f, 0x52, 0x71, 0x25, 0xbb, 0x24, 0xc2, 0x95, 0xd2,
0x37, 0x7e, 0xe0, 0xd9, 0xef, 0xad, 0xa0, 0x0f, 0x33, 0x4a, 0xaf, 0x9f,
0x28, 0x4e, 0xb0, 0xb2, 0xcc, 0xb0, 0x04, 0x55, 0xf2, 0x5c, 0xea, 0x43,
0xe0, 0x3c, 0xee, 0xf6, 0x98, 0x50, 0xc0, 0x4b, 0xe6, 0x29, 0x0c, 0x08,
0xae, 0x25, 0xea, 0x9f, 0x83, 0x37, 0x09, 0x0c, 0x2a, 0x28, 0x0f, 0xb3,
0x01, 0x68, 0x55, 0x5e, 0xc1, 0xf2, 0x38, 0x09, 0x85, 0x6c, 0xc1, 0x19,
0x35, 0xef, 0x8d, 0x06, 0x00, 0xfa, 0x39, 0x5a, 0x6e, 0x45, 0x81, 0x1e,
0x20, 0x92, 0x73, 0x65, 0x58, 0xa2, 0x3c, 0x2e, 0x5c, 0xbb, 0x1d, 0x73,
0xf0, 0x60, 0x0e, 0xec, 0x9e, 0x93, 0x07, 0x25, 0x75, 0xed, 0x37, 0xda,
0x16, 0x52, 0x10, 0x9a, 0x17, 0xdd, 0x81, 0x35, 0x41, 0x09, 0x75, 0xed,
0x3b, 0xab, 0x13, 0xe2, 0xab, 0x16, 0x19, 0x42, 0x9d, 0xfe, 0xc9, 0x47,
0x26, 0x42, 0xa4, 0xe1, 0x99, 0x3e, 0x8f, 0x4d, 0xf2, 0x49, 0xf8, 0xb8,
0x75, 0xe1, 0xf5, 0x5a, 0x66, 0x76, 0xb9, 0xaa, 0xd3, 0xff, 0x2f, 0xac,
0x68, 0x49, 0xc6, 0x70, 0x34, 0x6c, 0xb7, 0xef, 0x81, 0x5b, 0x73, 0x73,
0xe5, 0x22, 0x68, 0xd2, 0x6b, 0xf3, 0x8e, 0xcf, 0xbd, 0x6d, 0x73, 0xd0,
0xce, 0x96, 0x8a, 0xc5, 0x9b, 0xfe, 0x5c, 0x7e, 0xae, 0x54, 0x87, 0x5c,
0x2d, 0x6a, 0xa3, 0x39, 0x0a, 0x5c, 0x85, 0xd5, 0xcb, 0xd4, 0x6c, 0xb1,
0xf8, 0xfd, 0x58, 0x35, 0x73, 0x85, 0x96, 0x7b, 0xa7, 0xb0, 0x86, 0xd0,
0x48, 0x63, 0x3f, 0xab, 0x26, 0xfe, 0xaf, 0x29, 0x99, 0x55, 0xa1, 0x21,
0x59, 0x2a, 0x94, 0x6b, 0x9e, 0x75, 0x1d, 0xc7, 0x8a, 0xfb, 0xa5, 0x20,
0x11, 0xd4, 0x60, 0xcd, 0x33, 0xf6, 0x81, 0x96, 0x9f, 0x83, 0xb6, 0xda,
0x9d, 0xb9, 0xef, 0x75, 0x3a, 0x9d, 0x66, 0x17, 0x60, 0xc1, 0xce, 0x26,
0x6d, 0x5a, 0x06, 0xe3, 0x8b, 0x36, 0x38, 0x04, 0xc6, 0x56, 0xb3, 0x5a,
0xa4, 0x34, 0x32, 0xb8, 0x48, 0x9f, 0xb3, 0xde, 0x4e, 0xb4, 0xa8, 0x8b,
0xbb, 0xa8, 0xb6, 0x33, 0x1c, 0x05, 0x7c, 0x62, 0x2a, 0x14, 0x4b, 0x68,
0xc0, 0x30, 0x2b, 0x4e, 0x30, 0xd4, 0x53, 0x2d, 0x18, 0xca, 0x30, 0x52,
0x4e, 0x8d, 0xbf, 0x1d, 0x98, 0x2a, 0xc9, 0x53, 0x70, 0xb2, 0x86, 0xff,
0x6b, 0x32, 0x56, 0xb0, 0xc4, 0x4e, 0x0b, 0xff, 0xc7, 0x13, 0x3d, 0xb3,
0x63, 0x8f, 0xfc, 0x46, 0x05, 0x5a, 0x07, 0xbd, 0x91, 0x07, 0x9b, 0xa4,
0x03, 0x5d, 0x49, 0xe8, 0x63, 0xf0, 0xf5, 0x72, 0xb1, 0x68, 0x59, 0x4d,
0xd9, 0xc4, 0x69, 0xc6, 0x6c, 0x36, 0x22, 0xed, 0x84, 0xab, 0xc4, 0x90,
0xc7, 0x26, 0x8b, 0x3c, 0xae, 0x15, 0xc3, 0x85, 0x43, 0x19, 0x7a, 0x0d,
0x72, 0xdf, 0x8d, 0xfc, 0xc0, 0xee, 0xde, 0xf3, 0x96, 0x91, 0xe1, 0x02,
0xaa, 0xcc, 0xf4, 0x02, 0xc9, 0xd8, 0x2b, 0x15, 0x6a, 0x31, 0xa6, 0xb1,
0xce, 0x27, 0x92, 0x58, 0xa8, 0x2c, 0x03, 0x2e, 0x14, 0x45, 0x10, 0xc4,
0x39, 0xac, 0x34, 0x29, 0x7e, 0x20, 0x9d, 0x81, 0x0d, 0xd0, 0xac, 0xdf,
0x80, 0xc5, 0x0a, 0x13, 0x7f, 0xfc, 0x7f, 0x5e, 0x5b, 0x1d, 0xdb, 0x9c,
0x1b, 0x7a, 0xd0, 0x3a, 0x9d, 0xe9, 0x31, 0xd3, 0xe9, 0xcc, 0x65, 0xaf,
0x41, 0x2c, 0x68, 0x87, 0x2c, 0xd7, 0xc1, 0xac, 0xd0, 0x1e, 0xd2, 0x86,
0x0a, 0x91, 0xfe, 0xb4, 0xa1, 0x52, 0x25, 0x23, 0x85, 0xe2, 0xa9, 0xe3,
0xc7, 0x78, 0xdc, 0x72, 0x3b, 0xf7, 0x3a, 0xee, 0xf5, 0x87, 0x16, 0x0c,
0x8c, 0x90, 0x68, 0x1d, 0x85, 0xf5, 0x8a, 0x19, 0x31, 0x4d, 0x32, 0xfe,
0x5e, 0xc0, 0x76, 0xdf, 0x23, 0xe5, 0xaa, 0x44, 0x44, 0xe9, 0x8a, 0xd6,
0x5e, 0x94, 0x06, 0x4c, 0x54, 0xa1, 0x98, 0x2b, 0xf0, 0xb4, 0x87, 0x58,
0x33, 0xbe, 0x8f, 0x5c, 0x26, 0xad, 0xe0, 0xb8, 0x6a, 0xd0, 0x8a, 0xff,
0x63, 0x69, 0xf1, 0x7b, 0x30, 0xae, 0x46, 0x5e, 0xdb, 0x3a, 0x32, 0x87,
0x43, 0x48, 0x3e, 0x3f, 0x3d, 0x34, 0xe0, 0x57, 0xa1, 0xb4, 0x52, 0x6c,
0x99, 0x2d, 0xcb, 0xb2, 0x56, 0x56, 0x8a, 0xed, 0x72, 0xbd, 0xdd, 0x2e,
0xd6, 0xca, 0x05, 0x58, 0x2a, 0x17, 0xae, 0xcd, 0xe1, 0xe2, 0xd2, 0xda,
0x12, 0x59, 0x46, 0xaf, 0xaf, 0x2d, 0xd1, 0xd3, 0x0d, 0x64, 0x06, 0x2c,
0xad, 0xdb, 0x9e, 0x3d, 0x0c, 0xc4, 0xb5, 0xf5, 0x3b, 0x13, 0x96, 0x21,
0x24, 0x35, 0xb3, 0x9e, 0xcd, 0x6a, 0xc6, 0xfa, 0xc3, 0x8d, 0xe9, 0xcd,
0x59, 0xc6, 0xc3, 0x4a, 0xad, 0xdc, 0xb0, 0xd8, 0x67, 0xd0, 0x04, 0x9b,
0xb1, 0xab, 0x07, 0x06, 0x02, 0x50, 0xa8, 0x0c, 0x98, 0x92, 0x73, 0x38,
0x31, 0xb6, 0x83, 0x4c, 0x93, 0x15, 0x59, 0x2d, 0x56, 0x1a, 0x59, 0x4b,
0x0f, 0x74, 0x1b, 0x21, 0x4e, 0x5a, 0xef, 0xd0, 0x28, 0x07, 0xcb, 0x1f,
0xda, 0xfd, 0xcc, 0x73, 0x61, 0xb1, 0x1b, 0xdc, 0x67, 0x03, 0x3d, 0x73,
0x75, 0x65, 0xf9, 0x47, 0x6e, 0x07, 0x66, 0x95, 0x8c, 0x0e, 0xe8, 0x07,
0x23, 0xab, 0x31, 0x5f, 0x1c, 0x6b, 0x7a, 0x50, 0xd8, 0x32, 0x7d, 0xeb,
0xd4, 0xc2, 0xe9, 0xf7, 0x10, 0xa7, 0x27, 0xe3, 0xc6, 0x05, 0x75, 0x82,
0x96, 0xb7, 0xe3, 0x07, 0x73, 0xbe, 0x61, 0x67, 0xcb, 0xcb, 0x55, 0x4d,
0xf7, 0xe0, 0x47, 0xbd, 0xbc, 0xac, 0xe9, 0x0e, 0xa6, 0x54, 0xe0, 0x87,
0x0b, 0x3f, 0x56, 0xea, 0x45, 0x4d, 0x37, 0xe1, 0x47, 0x05, 0x61, 0xfa,
0x98, 0xb5, 0x5a, 0xd7, 0xf4, 0x01, 0xa6, 0x54, 0x6b, 0x9a, 0xde, 0x46,
0x98, 0xda, 0xaa, 0xa6, 0x77, 0x30, 0x65, 0x15, 0x7e, 0x5c, 0x91, 0x94,
0x9a, 0xd6, 0x6c, 0x0f, 0x4c, 0xdf, 0x9f, 0x1b, 0xcd, 0x01, 0x3f, 0xa0,
0x72, 0x7f, 0xae, 0x5d, 0xd8, 0x81, 0xb1, 0xe7, 0xfa, 0xb8, 0x9a, 0x79,
0xe8, 0x59, 0x01, 0x5b, 0xac, 0x65, 0xb5, 0x07, 0xcf, 0x0a, 0x46, 0x9e,
0x33, 0x17, 0xf4, 0x6d, 0xbf, 0x70, 0x45, 0x53, 0xc7, 0x14, 0xa0, 0xdd,
0xb7, 0xb6, 0xd5, 0x50, 0xb0, 0x1e, 0xdb, 0x0c, 0xa0, 0x86, 0x8d, 0xc2,
0x10, 0xd6, 0x13, 0xfe, 0x45, 0xf1, 0xb2, 0xc0, 0x4a, 0x92, 0x76, 0x79,
0xa3, 0x76, 0xe0, 0x7a, 0x94, 0x6d, 0xba, 0xa7, 0x3b, 0xba, 0xab, 0x9b,
0x7a, 0x47, 0xbf, 0xd2, 0x47, 0xda, 0x83, 0x3f, 0x02, 0xa6, 0x65, 0x81,
0x33, 0x04, 0x13, 0x17, 0x1c, 0xc3, 0x62, 0x09, 0xa1, 0x50, 0x19, 0x01,
0x4b, 0x31, 0x07, 0xc3, 0xbe, 0x69, 0x38, 0xbc, 0x40, 0x1f, 0x56, 0x7f,
0x2f, 0x70, 0x16, 0x6f, 0x5b, 0x86, 0xcb, 0x12, 0x5b, 0xa3, 0x6e, 0xd7,
0xf2, 0x78, 0xaa, 0xc9, 0x52, 0xdd, 0x21, 0x8e, 0x69, 0x9f, 0x27, 0x77,
0x58, 0x72, 0x34, 0x5f, 0xf3, 0x9c, 0xab, 0xb0, 0x6e, 0xcf, 0xda, 0xf2,
0xdc, 0x5b, 0x3f, 0xc2, 0x35, 0x0a, 0x0b, 0xe1, 0xe7, 0x36, 0xb4, 0xfb,
0x15, 0x0e, 0x05, 0xa3, 0x98, 0x48, 0x7f, 0x42, 0x24, 0x3f, 0x9e, 0x61,
0x0d, 0x06, 0xca, 0x02, 0x90, 0xae, 0x2e, 0x00, 0x98, 0x0e, 0x41, 0xeb,
0x2b, 0x92, 0xcf, 0xdc, 0x61, 0x98, 0x1a, 0x2e, 0x98, 0x40, 0xe6, 0xac,
0x81, 0x91, 0x2d, 0xea, 0xfd, 0x02, 0xa8, 0x1f, 0x33, 0x00, 0xd6, 0xb0,
0x1c, 0x2a, 0x73, 0x24, 0x5f, 0x0b, 0xd9, 0xdd, 0xb2, 0x03, 0x18, 0x49,
0xfb, 0x16, 0xf0, 0xd7, 0x84, 0x1e, 0x32, 0x2e, 0x2e, 0xf5, 0x58, 0x8f,
0x46, 0x52, 0x62, 0x90, 0x1c, 0x5c, 0x2f, 0xf9, 0xd0, 0x4b, 0x59, 0xc7,
0xba, 0x05, 0x21, 0x3a, 0x1a, 0x05, 0x98, 0x17, 0x41, 0x71, 0xcc, 0xae,
0xb3, 0xd9, 0xe9, 0x9c, 0x81, 0xb4, 0xc1, 0x12, 0x9d, 0x20, 0xa2, 0x92,
0xa3, 0x40, 0x32, 0x28, 0xec, 0xa2, 0xb9, 0xb5, 0x7b, 0x6d, 0x83, 0x95,
0xeb, 0xb1, 0xf2, 0x13, 0x8b, 0xa7, 0x21, 0x2f, 0x10, 0xbb, 0x8d, 0xb7,
0x00, 0x58, 0xba, 0x8d, 0x73, 0xcf, 0xa9, 0x05, 0xf3, 0x22, 0xe8, 0x3d,
0x03, 0x2b, 0xf3, 0x0b, 0xdb, 0xf1, 0xf4, 0xac, 0x2c, 0x79, 0x4a, 0x61,
0x51, 0xb2, 0x39, 0x4d, 0x7e, 0x52, 0xa5, 0x47, 0x21, 0xb2, 0x9c, 0x5d,
0x6d, 0xb1, 0x79, 0xc9, 0x92, 0xa0, 0xef, 0x6c, 0x67, 0x07, 0x96, 0xfe,
0xb8, 0xd3, 0xc1, 0x7a, 0x76, 0x97, 0xee, 0x7b, 0x64, 0x33, 0xb4, 0x6c,
0x46, 0x46, 0x55, 0x20, 0x03, 0xfe, 0x10, 0xd8, 0x5c, 0x00, 0x4d, 0x9b,
0xfd, 0x8a, 0xda, 0xa6, 0x5f, 0x3c, 0xd8, 0x63, 0x6a, 0x16, 0x7f, 0x15,
0x03, 0x27, 0x9a, 0xb4, 0xf0, 0xe1, 0x00, 0x2d, 0x49, 0xc3, 0x2b, 0x04,
0xee, 0x0b, 0xd0, 0x7b, 0x4e, 0x2f, 0x94, 0x14, 0xdb, 0xb1, 0x03, 0x3e,
0xf8, 0xe3, 0x43, 0xb3, 0x00, 0xaa, 0x1a, 0xa4, 0x6b, 0xbb, 0x6f, 0x0f,
0x3a, 0x59, 0x11, 0x2b, 0x87, 0xf4, 0xac, 0xae, 0x67, 0xf9, 0xfd, 0x6d,
0x2e, 0x54, 0xd9, 0x24, 0x23, 0x0a, 0xc4, 0x4e, 0xe0, 0x25, 0x42, 0x01,
0x51, 0x00, 0xba, 0x0e, 0xe0, 0x71, 0x7a, 0x16, 0xe9, 0x44, 0x3f, 0x9b,
0x45, 0x05, 0x9e, 0x52, 0x8d, 0x15, 0xa2, 0xf3, 0xad, 0x80, 0xd3, 0x0d,
0x85, 0x3b, 0x83, 0x68, 0x5c, 0x50, 0x64, 0x9c, 0x6e, 0xb9, 0x87, 0x0b,
0xe1, 0xe7, 0x0b, 0xb4, 0x29, 0x94, 0x52, 0x10, 0xc1, 0xec, 0x3a, 0x1d,
0x35, 0x04, 0xdd, 0xc1, 0xa1, 0x35, 0x62, 0x8a, 0x36, 0xd6, 0xb4, 0x78,
0x43, 0x61, 0xc8, 0xb6, 0x81, 0xeb, 0xc2, 0x40, 0xca, 0xd2, 0x49, 0x48,
0xea, 0x25, 0x30, 0x54, 0x61, 0x0a, 0xcf, 0x12, 0x04, 0x63, 0xa9, 0x4f,
0x38, 0x5c, 0x70, 0x87, 0xa3, 0xdf, 0x2c, 0xe0, 0x62, 0xed, 0xf6, 0xa0,
0xbb, 0x67, 0x0e, 0xfc, 0x7b, 0x4d, 0xea, 0x94, 0x02, 0x28, 0xf3, 0x6d,
0xb4, 0x3b, 0xee, 0x40, 0x76, 0xca, 0x1d, 0x98, 0x9f, 0x88, 0x46, 0x6d,
0x08, 0xda, 0x75, 0xcc, 0xc9, 0xa3, 0x9f, 0x8f, 0x8f, 0xac, 0xfc, 0xc0,
0x02, 0xce, 0x0e, 0x06, 0x50, 0x3f, 0x65, 0xe2, 0xd6, 0x60, 0x04, 0xaa,
0xfb, 0x81, 0x7d, 0xed, 0xe1, 0xd6, 0x54, 0xf4, 0xb9, 0x4d, 0x4c, 0xbd,
0x23, 0x42, 0x2f, 0x4f, 0xdb, 0xf7, 0xec, 0x0e, 0x67, 0x38, 0x0c, 0x87,
0x30, 0x3d, 0xd1, 0x1b, 0x64, 0xaa, 0x30, 0xe6, 0x4b, 0xbc, 0x5d, 0x31,
0x8e, 0x8e, 0x86, 0x1d, 0x18, 0x01, 0xb1, 0x91, 0x4b, 0x07, 0x8e, 0x4e,
0x27, 0xe7, 0x31, 0x14, 0x09, 0xce, 0xc2, 0x7d, 0xa3, 0xf6, 0x3d, 0x08,
0xc3, 0x83, 0xdd, 0x05, 0x69, 0x31, 0x0c, 0xa1, 0x69, 0x1a, 0x9d, 0xc7,
0xd8, 0xf4, 0x1b, 0x18, 0x22, 0xa3, 0x9a, 0xe2, 0x7c, 0x63, 0x29, 0x07,
0x2a, 0x1f, 0x6a, 0x60, 0x53, 0x1e, 0x03, 0x61, 0xb3, 0x8d, 0x16, 0xcf,
0x02, 0x9b, 0x17, 0x75, 0x78, 0x7c, 0xb8, 0x00, 0x43, 0x3e, 0x75, 0xc0,
0x24, 0xd9, 0xcb, 0xa7, 0x06, 0x69, 0x2e, 0x2c, 0xa0, 0x56, 0xc9, 0x97,
0x80, 0x3b, 0x8a, 0xb1, 0x82, 0xec, 0x99, 0xcf, 0x2a, 0xe7, 0xb7, 0x35,
0xa3, 0xb8, 0xb0, 0xa0, 0x9e, 0xe1, 0x20, 0x4b, 0x0b, 0xa5, 0x8f, 0x63,
0x43, 0x19, 0x04, 0xb5, 0xd0, 0xfe, 0x7a, 0x64, 0x7b, 0x96, 0xa8, 0xa8,
0xb5, 0x59, 0xb4, 0x6d, 0xc1, 0x33, 0x6f, 0x4f, 0x68, 0x8a, 0x6e, 0xc9,
0xf3, 0x1e, 0x9f, 0x3f, 0x53, 0x66, 0x4f, 0xf5, 0xec, 0x9c, 0x32, 0x37,
0xa7, 0xea, 0xe9, 0x42, 0x67, 0xe8, 0x85, 0xdd, 0x96, 0x9c, 0x08, 0x0b,
0xc4, 0x9e, 0xc3, 0x26, 0x0e, 0x0a, 0x5d, 0xd7, 0xbb, 0x35, 0xbd, 0x0e,
0x99, 0xc1, 0xc2, 0x61, 0xc6, 0x8b, 0xa4, 0xcd, 0x62, 0x93, 0xa7, 0xc8,
0x44, 0xcd, 0x05, 0xa8, 0xe1, 0xfa, 0x7c, 0x98, 0xd5, 0x60, 0x31, 0xe4,
0x65, 0x07, 0x60, 0x8a, 0x59, 0x46, 0xb1, 0x69, 0xad, 0xc5, 0xc1, 0x88,
0xe9, 0x55, 0x18, 0x58, 0x4e, 0x2f, 0xe8, 0x37, 0xad, 0x5c, 0x4e, 0x53,
0xce, 0xf1, 0x17, 0xd6, 0x25, 0x99, 0x09, 0xbb, 0x09, 0x6a, 0xa9, 0xe9,
0x66, 0x71, 0xd3, 0x4d, 0x1b, 0x8f, 0xe9, 0x81, 0x0a, 0x8a, 0x86, 0xda,
0x88, 0x01, 0x4e, 0x59, 0x54, 0x16, 0x21, 0xa9, 0x70, 0x3b, 0xa1, 0x63,
0x62, 0xa0, 0xfd, 0x09, 0xbd, 0x25, 0x80, 0x42, 0x92, 0x0a, 0x6b, 0x64,
0x5d, 0xc9, 0xa0, 0x29, 0x58, 0x89, 0xfd, 0x24, 0x43, 0xe2, 0x42, 0x5a,
0x69, 0x50, 0xc9, 0x60, 0xb0, 0xcc, 0x93, 0x67, 0xc9, 0xdb, 0x18, 0x81,
0x42, 0xaa, 0x0c, 0xd8, 0x8f, 0xd3, 0x27, 0x26, 0xab, 0x66, 0x5e, 0x8a,
0xf9, 0xab, 0x2f, 0x1e, 0x2c, 0xb2, 0xbe, 0x11, 0x31, 0x8f, 0x87, 0x77,
0x5f, 0xa9, 0x8a, 0xb0, 0x3a, 0xe2, 0x65, 0x68, 0xb2, 0x50, 0x28, 0x45,
0x87, 0x7f, 0xbc, 0xaa, 0x19, 0x93, 0xc2, 0xa2, 0xc4, 0x66, 0x13, 0x23,
0x7f, 0xa3, 0x20, 0x02, 0xc1, 0x4c, 0x71, 0xd5, 0xb5, 0xc1, 0xe0, 0x82,
0x4e, 0xf7, 0x99, 0xfd, 0xef, 0x0b, 0x73, 0x15, 0xee, 0x44, 0x0c, 0x4e,
0x41, 0xb3, 0x67, 0xad, 0xc5, 0x94, 0x71, 0x9e, 0x48, 0x67, 0x83, 0xd7,
0x4e, 0x29, 0xe0, 0xa7, 0x14, 0x60, 0x94, 0x1c, 0xc1, 0xc2, 0x77, 0x60,
0x1d, 0x82, 0x22, 0xde, 0x0c, 0x04, 0xaa, 0x0c, 0x98, 0x69, 0xf8, 0x12,
0xec, 0xc8, 0x0c, 0xc0, 0x7a, 0xb6, 0xec, 0x41, 0xb6, 0x50, 0x4b, 0x43,
0xd6, 0xfc, 0x88, 0x26, 0x64, 0x83, 0x5c, 0x49, 0x4b, 0x41, 0x94, 0xf7,
0xf3, 0x93, 0xb4, 0x50, 0x6a, 0x2b, 0x27, 0xaa, 0x2e, 0xda, 0xd2, 0x2d,
0xb2, 0xe5, 0xa4, 0x68, 0xa9, 0xee, 0x83, 0xca, 0xfe, 0x98, 0x3e, 0x98,
0xd4, 0x80, 0xdc, 0xe4, 0x06, 0xe4, 0x4b, 0x9f, 0xda, 0x84, 0xf6, 0xc8,
0x1b, 0xdc, 0x9f, 0xf3, 0x6d, 0x6a, 0xda, 0x84, 0xa8, 0xaf, 0x22, 0xea,
0x7d, 0xf3, 0x26, 0x9a, 0x77, 0x31, 0xa1, 0x05, 0x26, 0x95, 0xf3, 0x0c,
0xfa, 0x50, 0x4a, 0x85, 0x45, 0xa8, 0xfb, 0xde, 0x7a, 0x81, 0x03, 0xc7,
0x90, 0x9b, 0x4e, 0xd2, 0xc2, 0xf5, 0xf7, 0x24, 0xaa, 0x84, 0x4e, 0x47,
0x9a, 0xa8, 0xb6, 0xf2, 0x43, 0xad, 0xec, 0x81, 0x56, 0xf6, 0xd6, 0xec,
0xa6, 0x07, 0xaa, 0x97, 0x09, 0x93, 0x6d, 0x64, 0xad, 0x9c, 0x97, 0xe4,
0x1d, 0xe5, 0x80, 0x43, 0x72, 0x73, 0x85, 0x5a, 0x1a, 0x80, 0x4b, 0x01,
0x14, 0xcc, 0xa7, 0xf9, 0xa6, 0x31, 0x45, 0xb6, 0x4a, 0x7a, 0xdf, 0x30,
0xf3, 0xbe, 0x3e, 0x30, 0xcc, 0x9c, 0x2f, 0x90, 0x8f, 0x56, 0xe4, 0x99,
0x9b, 0xb5, 0x75, 0x53, 0xe6, 0xdc, 0x07, 0xdb, 0xf2, 0xc0, 0x6e, 0x63,
0x99, 0x40, 0x21, 0xf9, 0x6f, 0x02, 0x90, 0xa3, 0x0f, 0x60, 0x31, 0x8f,
0xff, 0x99, 0xda, 0x38, 0xce, 0x6d, 0xa9, 0x03, 0x40, 0xc9, 0xc0, 0xec,
0x43, 0x34, 0x02, 0x3d, 0xcf, 0xf8, 0xdf, 0xa1, 0x6f, 0xc5, 0x4a, 0xac,
0x00, 0xc7, 0xd2, 0x8e, 0xe9, 0xf7, 0xb3, 0x17, 0xe5, 0x45, 0x5f, 0xf7,
0x2f, 0x35, 0x86, 0xd9, 0x33, 0xd2, 0x46, 0x8e, 0x33, 0xb5, 0x83, 0x92,
0x9d, 0xe2, 0xe9, 0x4e, 0x34, 0xd3, 0xc3, 0xc2, 0xbf, 0x19, 0x80, 0x4c,
0x05, 0x91, 0x4c, 0xf9, 0x28, 0x14, 0x76, 0x2e, 0x48, 0x11, 0x8a, 0x58,
0x43, 0x00, 0xa1, 0x0f, 0x08, 0x27, 0xf7, 0x0d, 0x18, 0xb0, 0xbe, 0x95,
0x60, 0xab, 0xd8, 0x63, 0xe4, 0xd4, 0xe8, 0x7f, 0xe7, 0x1e, 0xab, 0x42,
0x8f, 0x55, 0x16, 0x67, 0xec, 0x33, 0xe0, 0xef, 0x84, 0x21, 0xf9, 0x09,
0x3d, 0xea, 0x8a, 0x8d, 0x67, 0xdd, 0xe2, 0xc8, 0xa9, 0x9f, 0xd2, 0x2d,
0xc8, 0x30, 0xb4, 0x6e, 0x0e, 0x63, 0x7d, 0xf2, 0xed, 0xcc, 0xb0, 0x93,
0x98, 0xbf, 0x68, 0xa7, 0x18, 0x7a, 0xb8, 0xf0, 0x22, 0x2d, 0xc1, 0x3a,
0x45, 0x9a, 0x70, 0xde, 0xe7, 0xac, 0xff, 0xe8, 0x6e, 0xf5, 0x12, 0x8c,
0x9a, 0xd4, 0xa4, 0x9c, 0xb7, 0x54, 0x4e, 0x6d, 0x16, 0xc9, 0x4c, 0x99,
0x93, 0xf2, 0x5e, 0xaa, 0xf9, 0x90, 0x27, 0x73, 0x52, 0x68, 0x3c, 0x3d,
0x08, 0xa6, 0xd5, 0x86, 0xd8, 0x63, 0x00, 0x40, 0x48, 0x2b, 0xea, 0x45,
0x85, 0xe9, 0xa8, 0x32, 0x12, 0xb5, 0x46, 0x56, 0x31, 0x04, 0x8c, 0x54,
0x33, 0xac, 0x10, 0x9d, 0xd0, 0xa0, 0xd9, 0xa7, 0x2b, 0xba, 0xfa, 0x23,
0x2a, 0xe7, 0xad, 0x52, 0x5a, 0x68, 0xe9, 0xcd, 0xfb, 0xee, 0xcd, 0xb5,
0x6f, 0x9f, 0x2b, 0xdf, 0x3d, 0xcd, 0xdc, 0xda, 0xc5, 0xc5, 0x84, 0x37,
0xa2, 0x3b, 0x54, 0x8a, 0x11, 0xe9, 0x3a, 0x7c, 0xa3, 0xa1, 0x67, 0x05,
0x7b, 0xf0, 0x95, 0x9d, 0x2f, 0xe9, 0xf3, 0x25, 0x71, 0x90, 0xe3, 0xee,
0x0c, 0x9e, 0x14, 0xe0, 0x10, 0x30, 0x9c, 0xc2, 0xd9, 0xee, 0xeb, 0xb3,
0xab, 0xad, 0xcd, 0x17, 0xbb, 0x87, 0x07, 0xc7, 0xbb, 0x1c, 0x6c, 0x60,
0x0f, 0x4f, 0xdd, 0xdb, 0xac, 0xad, 0x35, 0x71, 0xa6, 0xf0, 0x8d, 0xf9,
0x52, 0x73, 0xbe, 0x34, 0xcf, 0xb7, 0x37, 0x52, 0x97, 0xd4, 0x85, 0xf6,
0x08, 0x14, 0xc8, 0xf5, 0xfe, 0xe0, 0x7e, 0xd8, 0xf7, 0x17, 0x16, 0xb2,
0x64, 0xb1, 0xee, 0x16, 0x02, 0xef, 0x7e, 0x07, 0x80, 0xb6, 0x49, 0x26,
0xb6, 0x40, 0x8b, 0x3a, 0x40, 0xb7, 0xc8, 0xa6, 0x11, 0xde, 0x1b, 0x41,
0x55, 0x94, 0xc2, 0x96, 0x24, 0xbb, 0x54, 0x8b, 0xf2, 0xd9, 0x56, 0xf0,
0xe9, 0xd4, 0x23, 0xf7, 0x5e, 0xc0, 0xaa, 0x74, 0xb2, 0xfd, 0xa8, 0xe9,
0x7e, 0xb8, 0xe2, 0x61, 0x32, 0x80, 0x4b, 0x92, 0xec, 0x2c, 0x0d, 0xc9,
0xa9, 0x16, 0x90, 0xa9, 0xad, 0x4b, 0x40, 0xc3, 0x32, 0x32, 0x91, 0x16,
0xea, 0xc6, 0x0e, 0xb2, 0x98, 0x54, 0xcf, 0xc4, 0x82, 0xcf, 0x74, 0x12,
0x61, 0x1e, 0xfb, 0xa4, 0x5b, 0x4a, 0x0e, 0xfd, 0x22, 0xb4, 0x65, 0xb5,
0xa6, 0x1d, 0xae, 0xdc, 0xe3, 0x3b, 0xd9, 0x38, 0x35, 0xe0, 0x0f, 0x82,
0x9b, 0xc2, 0xc8, 0xbb, 0x3f, 0xf4, 0xab, 0x70, 0x8f, 0xc7, 0xae, 0xb9,
0xa4, 0x06, 0x27, 0x35, 0x68, 0xfa, 0x7c, 0x6c, 0x49, 0xc7, 0xf7, 0xc8,
0x50, 0xca, 0x5c, 0xac, 0xde, 0x35, 0x40, 0x6e, 0xf8, 0x4e, 0xc3, 0x7a,
0x69, 0x23, 0x06, 0x8f, 0xc4, 0x9e, 0x9a, 0xb8, 0xab, 0x09, 0xdd, 0xd4,
0x21, 0x72, 0xb6, 0xed, 0x5e, 0xb7, 0x40, 0x92, 0x71, 0x73, 0xca, 0xcb,
0x86, 0x83, 0x53, 0x45, 0xff, 0x68, 0x10, 0x14, 0x5a, 0xbd, 0x69, 0x10,
0xdd, 0xa9, 0x10, 0xd0, 0xd9, 0xfa, 0x7c, 0x51, 0x6b, 0x4c, 0xa7, 0x2d,
0x2b, 0xf0, 0xfa, 0xf1, 0xf1, 0xaa, 0xf0, 0xea, 0xc9, 0xc1, 0xd9, 0xee,
0x8b, 0x67, 0x9b, 0xdb, 0xbb, 0x57, 0xdb, 0xbb, 0x87, 0x87, 0x57, 0xdb,
0x27, 0x3b, 0xbb, 0x3f, 0x42, 0x8a, 0xf5, 0x79, 0xb7, 0x80, 0xbb, 0x2e,
0x85, 0xbb, 0xc7, 0x47, 0xfe, 0xf3, 0x9e, 0x77, 0x41, 0x9a, 0xa1, 0x15,
0xaa, 0x02, 0xf5, 0xb9, 0xce, 0x85, 0x4b, 0x14, 0x0a, 0x2c, 0xc8, 0x9f,
0x99, 0x3d, 0xeb, 0x92, 0x6f, 0xe5, 0xc5, 0xb7, 0x7e, 0x64, 0x28, 0xb6,
0x9f, 0x10, 0x2a, 0x94, 0xc9, 0x38, 0x19, 0x34, 0xe8, 0x93, 0x59, 0xa0,
0x37, 0x0a, 0x34, 0x7f, 0x83, 0xda, 0x38, 0xd0, 0x90, 0x8e, 0x05, 0xe2,
0x65, 0xcd, 0xcd, 0x52, 0x38, 0xb9, 0x41, 0xa6, 0x24, 0x1f, 0x58, 0xeb,
0x83, 0xc6, 0x98, 0x91, 0xfe, 0x0d, 0x0e, 0x3f, 0x63, 0x0b, 0x1e, 0x1f,
0x67, 0x02, 0x9b, 0xb8, 0xd5, 0xa6, 0xe4, 0xa0, 0x36, 0x5b, 0x1f, 0x16,
0xd8, 0xbe, 0x4d, 0xda, 0x51, 0x5e, 0x0a, 0x37, 0x8c, 0x8f, 0x61, 0x1d,
0x9d, 0x58, 0xfa, 0x06, 0x17, 0xc8, 0xe6, 0x34, 0xdd, 0x0c, 0x04, 0xb5,
0xcd, 0x81, 0x75, 0x82, 0xce, 0x66, 0xf4, 0x20, 0x3f, 0x9c, 0x65, 0xf0,
0x4c, 0xc2, 0x1c, 0x0c, 0xdc, 0xdb, 0x53, 0x02, 0x03, 0x59, 0x5a, 0x96,
0x9c, 0x04, 0x33, 0xdc, 0x29, 0xca, 0x08, 0x4a, 0xf6, 0x0d, 0xb5, 0xad,
0x26, 0xcd, 0x97, 0xa8, 0x57, 0x0f, 0xf0, 0x32, 0xe0, 0x47, 0x89, 0x5f,
0x38, 0x45, 0xcc, 0xd2, 0x31, 0x7a, 0x94, 0xca, 0xdc, 0x43, 0x80, 0xea,
0x64, 0xda, 0x7d, 0xd4, 0x24, 0x3e, 0x7a, 0x3f, 0x6a, 0xa2, 0xc9, 0xbb,
0x05, 0xb7, 0xdb, 0x85, 0xb5, 0x0b, 0x20, 0xf8, 0x98, 0x39, 0x27, 0x2a,
0x77, 0x0f, 0x8b, 0xf6, 0x50, 0x71, 0xa8, 0x17, 0x0e, 0x5c, 0x61, 0x58,
0xa2, 0x5d, 0xa2, 0x5e, 0xaa, 0x79, 0xd4, 0xa0, 0x4c, 0x1a, 0x4f, 0xd2,
0x7c, 0x2d, 0xcf, 0x33, 0x60, 0x92, 0x25, 0x6d, 0xa4, 0x49, 0xb3, 0xbe,
0xbc, 0xea, 0xb1, 0x87, 0x48, 0x23, 0xb7, 0x8d, 0xc8, 0x39, 0x11, 0xd5,
0x7f, 0x5f, 0x7d, 0xf1, 0x10, 0x6c, 0x64, 0xec, 0x00, 0xe4, 0xa7, 0x9d,
0x69, 0x64, 0x32, 0xe3, 0xb9, 0x2f, 0x1e, 0xac, 0x8d, 0x59, 0x2c, 0x86,
0x57, 0xa4, 0x9a, 0x2d, 0x77, 0xd0, 0x69, 0xcc, 0x0e, 0x8e, 0xe8, 0x67,
0x35, 0x47, 0x16, 0x27, 0x99, 0x23, 0xe3, 0xe1, 0xdd, 0x8c, 0xa8, 0xf6,
0xcc, 0x6b, 0x7b, 0x70, 0x3f, 0xfe, 0x6a, 0x3c, 0x4e, 0x7a, 0x8a, 0x8c,
0x98, 0x13, 0x47, 0x97, 0xf8, 0x6b, 0x50, 0x09, 0x8e, 0x7b, 0x62, 0xd0,
0x54, 0xd9, 0xeb, 0x82, 0xf5, 0x31, 0x3b, 0xb9, 0x0a, 0xcf, 0xb2, 0x03,
0x33, 0xb0, 0x42, 0x07, 0x82, 0xb6, 0x7b, 0x7d, 0x6d, 0x07, 0x67, 0xf6,
0xb5, 0xe5, 0x8e, 0x02, 0xe6, 0x93, 0x22, 0x29, 0x16, 0x29, 0x8d, 0x2b,
0x93, 0x7c, 0x69, 0x1c, 0xaa, 0xa1, 0x07, 0x11, 0x3a, 0xd2, 0xeb, 0x2a,
0x1c, 0x9d, 0x82, 0xed, 0xbf, 0x30, 0xbb, 0xa6, 0x67, 0x83, 0x16, 0xa5,
0x69, 0xe1, 0xa9, 0x9c, 0x44, 0x48, 0xa8, 0x8b, 0x65, 0xf2, 0x6e, 0x6d,
0xa7, 0xe3, 0xde, 0xe2, 0xfa, 0x9e, 0xa5, 0xd0, 0xa3, 0x52, 0x6e, 0x52,
0x93, 0x31, 0x0f, 0x75, 0x6b, 0x7a, 0xa9, 0x58, 0xc4, 0x7f, 0x43, 0xe4,
0xa4, 0xcd, 0x21, 0x52, 0xca, 0x81, 0xb2, 0x46, 0x64, 0x8d, 0x17, 0x7a,
0x28, 0xa6, 0x40, 0xcf, 0xd2, 0x30, 0x11, 0x6f, 0x49, 0x67, 0x64, 0xd2,
0xd3, 0x7a, 0xa2, 0x9c, 0xb6, 0x68, 0x9f, 0x09, 0xdd, 0xa1, 0x15, 0x60,
0x2d, 0xe3, 0xd0, 0x43, 0xec, 0xb2, 0x5c, 0x33, 0x95, 0xeb, 0x90, 0xbf,
0x0d, 0xa9, 0xc2, 0x58, 0x2f, 0x46, 0x07, 0xb6, 0xb3, 0xf0, 0x8f, 0x52,
0x0b, 0xed, 0x1e, 0x8f, 0xf5, 0xd5, 0xea, 0xea, 0xe7, 0xf9, 0x33, 0xd1,
0x43, 0x2b, 0x2a, 0xa7, 0x2a, 0x77, 0x26, 0xe2, 0xc5, 0x84, 0xee, 0x4c,
0xb5, 0x3a, 0xf5, 0x66, 0x22, 0xbe, 0x4b, 0x2e, 0x77, 0x59, 0x32, 0xb9,
0xcb, 0x12, 0x7a, 0x33, 0xad, 0x2c, 0x57, 0xa8, 0x37, 0x53, 0xb5, 0x42,
0x9d, 0x99, 0xea, 0x95, 0x22, 0x75, 0x66, 0x5a, 0xae, 0x56, 0xb9, 0x0f,
0xd3, 0x55, 0xe8, 0xc3, 0x64, 0x8a, 0x3e, 0x4c, 0x49, 0x47, 0xa3, 0x2b,
0x7d, 0xa4, 0x77, 0xf5, 0x9e, 0x3e, 0xd4, 0x6f, 0xf4, 0x6b, 0x7d, 0x73,
0xaa, 0xab, 0x11, 0x75, 0xd8, 0x63, 0x6e, 0x15, 0x86, 0x52, 0xb3, 0x45,
0xae, 0x41, 0xa0, 0x74, 0x71, 0xd8, 0xc7, 0xfd, 0x82, 0x62, 0x3e, 0x46,
0xdd, 0x74, 0x4f, 0xa2, 0x1b, 0x85, 0x37, 0x88, 0xb1, 0xc9, 0xd1, 0xb4,
0x00, 0x12, 0x46, 0xd9, 0x44, 0xef, 0x1b, 0x73, 0x92, 0xf7, 0xcd, 0xa9,
0xf5, 0xf5, 0x08, 0xf4, 0xfd, 0xa9, 0x85, 0x33, 0xa3, 0xa2, 0xb0, 0xab,
0xf6, 0xba, 0x51, 0x14, 0x8b, 0x23, 0x93, 0xbc, 0x6c, 0xf8, 0x89, 0xbd,
0x78, 0x28, 0x34, 0x7b, 0x6d, 0x69, 0x65, 0x95, 0x68, 0x63, 0xf5, 0xce,
0xea, 0x5e, 0x94, 0x52, 0xf5, 0x27, 0xbb, 0x17, 0x31, 0xd1, 0xde, 0x9e,
0xba, 0xcc, 0x26, 0xd6, 0x8e, 0xe8, 0x81, 0xc0, 0xcc, 0x27, 0x2f, 0x52,
0xe9, 0xbe, 0x71, 0x81, 0x24, 0x76, 0x0a, 0x58, 0x99, 0xa0, 0xea, 0xd5,
0x87, 0xe4, 0x92, 0x7c, 0xea, 0x45, 0x7d, 0x5b, 0x25, 0xa1, 0x6a, 0xf7,
0xa5, 0x1e, 0x0c, 0x80, 0x34, 0x49, 0x84, 0x91, 0xa1, 0x53, 0x67, 0xae,
0x98, 0xaf, 0xd8, 0xcc, 0xa4, 0x94, 0x26, 0x10, 0xa2, 0xa8, 0xef, 0x5a,
0x4d, 0x23, 0x23, 0x63, 0x50, 0x38, 0xb4, 0x9d, 0xf7, 0x1f, 0x49, 0x41,
0x59, 0xb7, 0x67, 0x67, 0xc6, 0x74, 0x56, 0xf4, 0x0b, 0xd4, 0x79, 0xe5,
0x23, 0xa9, 0xa8, 0xa8, 0x47, 0xdf, 0xec, 0x94, 0x0d, 0x27, 0x31, 0x6d,
0x53, 0xbb, 0x24, 0xc7, 0x02, 0x54, 0xfe, 0xac, 0x39, 0xb7, 0x3b, 0x97,
0x14, 0x28, 0x8d, 0xec, 0xe5, 0xc8, 0x5e, 0x09, 0xd6, 0x27, 0xfa, 0x21,
0x50, 0x79, 0xed, 0xc0, 0xa4, 0xe1, 0xe0, 0x6c, 0x4f, 0xf6, 0x89, 0x1c,
0x36, 0x9d, 0x51, 0xce, 0xec, 0x84, 0x79, 0x91, 0x4b, 0x21, 0x35, 0xed,
0x9e, 0xd9, 0x77, 0xd6, 0xe0, 0x14, 0xbd, 0xe2, 0x26, 0x6e, 0xf6, 0xb2,
0x32, 0xd4, 0x9d, 0x27, 0xc2, 0x16, 0x22, 0x4b, 0xea, 0xc1, 0xc8, 0xf9,
0xc2, 0x2b, 0xb0, 0xdc, 0x9d, 0xa8, 0x46, 0x91, 0xa0, 0x24, 0x73, 0x22,
0xb7, 0xd4, 0xf4, 0xcd, 0x23, 0x3a, 0x69, 0xeb, 0x59, 0x62, 0x76, 0x72,
0x9b, 0x02, 0x2c, 0x0d, 0xca, 0x13, 0x65, 0x55, 0x04, 0x34, 0xe1, 0xd0,
0x95, 0x5a, 0x83, 0xeb, 0xbc, 0x22, 0x75, 0x50, 0x0d, 0x27, 0xfa, 0xaf,
0x7d, 0x67, 0xad, 0xb5, 0x3e, 0xa5, 0x3d, 0x6a, 0x27, 0x35, 0x53, 0xe9,
0xa4, 0x36, 0x5d, 0x2e, 0xa1, 0xbb, 0x49, 0x29, 0x30, 0x9d, 0x9a, 0x80,
0x86, 0xbb, 0xb2, 0xf1, 0xe8, 0x2f, 0x7b, 0x9e, 0x7b, 0xbd, 0x8d, 0x0e,
0xc6, 0x71, 0x07, 0x21, 0xea, 0xea, 0x86, 0x06, 0x6f, 0x20, 0xfb, 0x1d,
0x48, 0x66, 0x6f, 0xb2, 0xdd, 0xa1, 0xaf, 0x32, 0xf3, 0x30, 0xdb, 0x89,
0x89, 0x25, 0xe3, 0xbe, 0xec, 0xd9, 0x12, 0x65, 0xcf, 0x1b, 0x13, 0xe5,
0x36, 0x34, 0xac, 0x3e, 0x41, 0xda, 0x29, 0x3d, 0xa7, 0xd4, 0xb5, 0x26,
0x6d, 0xf5, 0x94, 0xea, 0xbc, 0xa5, 0x71, 0xdf, 0x3b, 0x86, 0x80, 0xac,
0x8e, 0xd2, 0x46, 0xd1, 0x0c, 0xfa, 0xc2, 0x2a, 0x78, 0x02, 0x25, 0xd1,
0x60, 0xe7, 0x1e, 0x0e, 0x92, 0x86, 0x8b, 0xfb, 0xaa, 0xc4, 0xca, 0x4c,
0xf2, 0x5c, 0x51, 0xe1, 0x89, 0x1c, 0x58, 0x26, 0x20, 0x8a, 0xdc, 0x59,
0xb8, 0x5f, 0x21, 0x33, 0xbd, 0xb8, 0xa3, 0x1b, 0x6b, 0xfe, 0x67, 0xb2,
0x55, 0xf6, 0x68, 0x64, 0x8c, 0x1a, 0x39, 0x27, 0x43, 0x8b, 0xfa, 0xf6,
0x92, 0x71, 0x6a, 0x15, 0x44, 0xa8, 0xb0, 0x2b, 0xb8, 0xe3, 0xe3, 0x94,
0x52, 0x0c, 0x2c, 0x2c, 0x36, 0xd5, 0xe9, 0x51, 0xc6, 0xe4, 0x1b, 0xeb,
0xa9, 0xce, 0xab, 0xd4, 0x80, 0x0f, 0x17, 0x01, 0xaa, 0xf3, 0x91, 0xd0,
0x83, 0x72, 0x0f, 0x64, 0x93, 0x1e, 0x94, 0xf0, 0x7d, 0xc0, 0xb8, 0x81,
0xd7, 0xb5, 0x3d, 0x2b, 0xfb, 0x40, 0xae, 0xd1, 0x34, 0x60, 0xe5, 0xef,
0xf0, 0x35, 0xb3, 0xca, 0x95, 0x70, 0xac, 0xa9, 0xdc, 0x3d, 0xa7, 0x70,
0x42, 0x84, 0xd5, 0x98, 0x5b, 0xd1, 0xa4, 0x52, 0xcc, 0x7f, 0x17, 0x57,
0x6a, 0x52, 0x2e, 0x2c, 0x6d, 0x23, 0x09, 0x0f, 0xd2, 0x24, 0x3c, 0x1b,
0x68, 0x63, 0x9a, 0x72, 0x0a, 0x24, 0xd3, 0x11, 0x13, 0x15, 0xb3, 0x53,
0x8a, 0xd9, 0x0a, 0x9f, 0x4a, 0x2c, 0xaa, 0x74, 0x82, 0x9a, 0x65, 0x9c,
0x29, 0xca, 0x8d, 0x15, 0x63, 0x96, 0x78, 0x61, 0x2a, 0x17, 0x19, 0x40,
0x90, 0xff, 0xd2, 0x1c, 0xd8, 0x1d, 0x4c, 0x93, 0x1d, 0x57, 0xad, 0x19,
0x8e, 0x54, 0x85, 0xe1, 0x95, 0xf0, 0xaf, 0xa3, 0x3e, 0x4f, 0xdd, 0x81,
0xeb, 0x7a, 0x59, 0x75, 0xdd, 0x04, 0x6c, 0x91, 0x2f, 0x30, 0x52, 0x70,
0xb1, 0x01, 0x1d, 0x39, 0x50, 0xa5, 0xb4, 0x83, 0x80, 0x4d, 0x42, 0x16,
0xf9, 0x08, 0x26, 0x28, 0x9b, 0x58, 0xf5, 0xe2, 0x34, 0xa3, 0x1c, 0xcf,
0xd3, 0xa4, 0x2d, 0xa7, 0x14, 0x74, 0x81, 0x3b, 0x34, 0xa2, 0x7d, 0x83,
0x59, 0xf0, 0x6d, 0x14, 0x1b, 0x84, 0x54, 0x32, 0xb2, 0xb2, 0xa9, 0xb4,
0x46, 0x2d, 0xcb, 0x4f, 0x6f, 0x8e, 0xb6, 0x54, 0x9e, 0xcc, 0x23, 0xda,
0x79, 0x53, 0xbb, 0x37, 0x27, 0x50, 0x36, 0xb5, 0x45, 0x16, 0xae, 0x93,
0x5e, 0xe0, 0x05, 0x76, 0xa7, 0x37, 0x99, 0x49, 0xe8, 0x45, 0x99, 0x94,
0x9c, 0x19, 0x51, 0x4f, 0x6a, 0x9a, 0xe4, 0x43, 0x99, 0xa6, 0x7b, 0x16,
0xa7, 0xb3, 0x78, 0x4a, 0x05, 0x02, 0xf7, 0x52, 0x37, 0x30, 0x27, 0x31,
0x3e, 0x81, 0x3e, 0x31, 0x6d, 0x19, 0x71, 0xc6, 0x4f, 0x69, 0xec, 0x92,
0x62, 0x4c, 0xc4, 0x27, 0xd5, 0xd9, 0x71, 0x12, 0xf0, 0x54, 0x94, 0xc2,
0x18, 0x9b, 0xda, 0x8e, 0xa5, 0xb4, 0x4e, 0x48, 0x47, 0xad, 0x16, 0xcd,
0x78, 0x63, 0x94, 0x88, 0x91, 0xfb, 0xe3, 0x59, 0x8c, 0xd4, 0x84, 0xdd,
0xa0, 0x16, 0xa0, 0x99, 0xc4, 0xc0, 0xfa, 0x16, 0x8c, 0x25, 0x4f, 0x9c,
0x46, 0x5f, 0xb2, 0x48, 0x2d, 0x59, 0xe2, 0x6d, 0xaf, 0xcc, 0xe0, 0x76,
0xff, 0xe7, 0xcd, 0xbf, 0xe3, 0xc4, 0x26, 0xdc, 0xd5, 0x58, 0x5f, 0x59,
0xfe, 0xcc, 0x7b, 0x8a, 0x89, 0x15, 0x70, 0x72, 0x6b, 0xaf, 0x5a, 0x63,
0x5b, 0x7b, 0x64, 0x03, 0xcf, 0xe1, 0x77, 0x0e, 0x71, 0x6f, 0x6f, 0x79,
0xa5, 0x4c, 0xf7, 0xf6, 0x56, 0x8b, 0x15, 0xbe, 0x71, 0xd7, 0x17, 0x36,
0xee, 0x62, 0x7b, 0xdb, 0x8a, 0xdd, 0x3b, 0x1f, 0x1d, 0x0f, 0xf5, 0xbe,
0x3e, 0xd0, 0xdb, 0x7a, 0x87, 0xef, 0xdd, 0x61, 0x56, 0x86, 0xde, 0x21,
0xce, 0x00, 0xcc, 0x7c, 0x51, 0xef, 0x10, 0xb0, 0xb6, 0x3e, 0x48, 0xdb,
0xfa, 0x12, 0xd7, 0x7a, 0x7c, 0x9b, 0x2d, 0x74, 0x85, 0x21, 0x98, 0xb6,
0x30, 0xe2, 0xe4, 0x0b, 0xdc, 0x48, 0x3d, 0x32, 0x1d, 0xb3, 0x67, 0x79,
0x8a, 0x5d, 0x24, 0x2f, 0x7d, 0xaf, 0x0d, 0xa5, 0xdd, 0xa0, 0x3b, 0x4d,
0x78, 0xa0, 0xb1, 0x63, 0x06, 0xfc, 0xc2, 0x21, 0xdd, 0x9c, 0x7d, 0xb8,
0x83, 0x4e, 0xbc, 0x87, 0xff, 0x6c, 0x9f, 0x58, 0x80, 0x56, 0xa7, 0x31,
0x5f, 0xd2, 0x89, 0x05, 0xdc, 0xc8, 0x64, 0x74, 0x16, 0x8f, 0x68, 0x2c,
0x91, 0xc4, 0x7b, 0xd2, 0x37, 0x1e, 0x5a, 0xa6, 0xd7, 0x10, 0x45, 0x71,
0xcb, 0xf4, 0x68, 0xd7, 0x14, 0x5a, 0x36, 0xd3, 0x00, 0x9a, 0x4e, 0xae,
0xb4, 0xcb, 0x60, 0x98, 0x92, 0x04, 0x0c, 0xe3, 0x3e, 0x48, 0xc0, 0xa1,
0x63, 0x5f, 0xb2, 0x00, 0xbf, 0x36, 0x2d, 0x82, 0x9f, 0xd0, 0xb4, 0x04,
0xf0, 0x38, 0xb6, 0x5c, 0x34, 0x61, 0xad, 0x4b, 0x75, 0x3f, 0x5f, 0xeb,
0x46, 0xdb, 0xf4, 0xd4, 0xb8, 0x62, 0x33, 0x43, 0x68, 0xca, 0x47, 0x26,
0xac, 0x3a, 0x5f, 0xb8, 0x91, 0x40, 0x04, 0xa2, 0x10, 0x7e, 0x7f, 0x0a,
0xcb, 0xc7, 0xcc, 0xae, 0xe4, 0x67, 0x60, 0xc4, 0x0f, 0x8a, 0x34, 0x2a,
0x3a, 0x01, 0x53, 0x4b, 0x08, 0x5d, 0x97, 0x6f, 0x90, 0x23, 0x35, 0x18,
0xa5, 0x24, 0x7f, 0xd3, 0xb1, 0xaf, 0xa9, 0x59, 0x3a, 0xa5, 0x0d, 0x8a,
0x95, 0xc6, 0x94, 0x6a, 0x86, 0xe6, 0x48, 0x38, 0x73, 0x98, 0xa4, 0x2e,
0x54, 0x8a, 0x82, 0x7b, 0x7d, 0xa4, 0x6a, 0x12, 0x0e, 0x30, 0x56, 0x2f,
0x68, 0xa6, 0xf3, 0x60, 0x74, 0xfd, 0xa3, 0xa1, 0x2e, 0x85, 0xa3, 0x53,
0x4f, 0xd6, 0x84, 0x16, 0x6c, 0xcc, 0xd0, 0xa6, 0xf0, 0x6c, 0x7f, 0x22,
0x14, 0xbf, 0x4f, 0xaa, 0x86, 0x11, 0x65, 0x9d, 0x8e, 0x9a, 0xec, 0x7c,
0x51, 0x38, 0xa5, 0x89, 0xdb, 0xe9, 0x5a, 0xe8, 0xaa, 0x92, 0x52, 0x27,
0x5b, 0x24, 0xfd, 0xc8, 0x64, 0x40, 0xb1, 0x9e, 0xfb, 0xb4, 0xc1, 0x90,
0x76, 0xf5, 0x6f, 0x7e, 0xa6, 0x9e, 0x98, 0x01, 0xa8, 0x60, 0xfb, 0xcf,
0x70, 0x80, 0x74, 0x36, 0x64, 0x76, 0x97, 0xa6, 0xb1, 0x94, 0x96, 0x4e,
0x23, 0x9b, 0xe3, 0xb1, 0xa4, 0x25, 0x59, 0x34, 0x8b, 0x40, 0xb5, 0x94,
0x47, 0x07, 0x8e, 0x1d, 0xd8, 0xb0, 0x2e, 0xfb, 0x60, 0x75, 0x42, 0x7a,
0x15, 0x60, 0x4f, 0x48, 0xc8, 0x05, 0xb6, 0x6e, 0x9b, 0x23, 0x93, 0xa9,
0x42, 0xef, 0xc4, 0x6e, 0x22, 0xaa, 0x3b, 0x09, 0x83, 0x1d, 0xe7, 0x26,
0x76, 0xb3, 0x6d, 0xb0, 0xf5, 0xc5, 0x04, 0x0f, 0x30, 0x74, 0xe5, 0xb2,
0xd7, 0x8a, 0x8f, 0x8f, 0xf6, 0x7a, 0xaa, 0x91, 0x3d, 0x23, 0xb9, 0xec,
0xd2, 0xcc, 0xb5, 0xed, 0x28, 0xb7, 0x5e, 0x58, 0xad, 0x77, 0xca, 0xed,
0x17, 0xb4, 0xf6, 0xf2, 0x25, 0xc1, 0xaf, 0x4d, 0x59, 0x16, 0x27, 0x1c,
0xe2, 0xbd, 0x05, 0xab, 0xf9, 0xc2, 0xc0, 0x35, 0x3b, 0xc4, 0xb3, 0x58,
0x74, 0x25, 0xd3, 0x74, 0x6a, 0xa0, 0x44, 0x5b, 0x77, 0x68, 0x86, 0xb2,
0x08, 0x1b, 0xf1, 0x3e, 0x8c, 0x2d, 0x92, 0xc3, 0x79, 0x62, 0xe2, 0x5c,
0xa0, 0xf2, 0x6f, 0x9f, 0xc5, 0x35, 0x95, 0xca, 0x1f, 0xda, 0xbe, 0xb1,
0xe5, 0xfa, 0x34, 0x8d, 0x45, 0x10, 0xeb, 0xc1, 0x8c, 0xd0, 0x07, 0x0e,
0x8d, 0x1f, 0x48, 0x5d, 0xe8, 0xf9, 0xfe, 0xe8, 0xc2, 0x42, 0x06, 0x43,
0x9e, 0x64, 0x90, 0x2d, 0xa1, 0xe3, 0x97, 0x6c, 0x64, 0x5c, 0x04, 0x97,
0xc0, 0x49, 0x5b, 0xe2, 0x65, 0xd4, 0xc2, 0xd0, 0x6d, 0x44, 0x9c, 0x62,
0x0b, 0x77, 0xa1, 0x61, 0x45, 0xbf, 0xef, 0x0d, 0x5b, 0xfa, 0x0e, 0x39,
0x6a, 0xcc, 0x97, 0xa4, 0x0c, 0x32, 0x0b, 0x1b, 0x16, 0xe9, 0x2c, 0xf1,
0x20, 0x5e, 0x5a, 0x8d, 0x91, 0xae, 0x8b, 0x7c, 0x1e, 0xb5, 0xb1, 0xd0,
0x7b, 0xdf, 0x86, 0xbe, 0xa0, 0x3d, 0xfb, 0x12, 0x83, 0xfc, 0x0d, 0xe8,
0xf8, 0x16, 0x28, 0x89, 0x7f, 0x43, 0x5b, 0x0d, 0xf4, 0x78, 0x94, 0x9b,
0x6b, 0x18, 0xb6, 0x9c, 0x14, 0xb5, 0x78, 0xc2, 0xde, 0x71, 0x08, 0x24,
0x97, 0xa5, 0x4c, 0x99, 0xc5, 0x75, 0x37, 0x14, 0x0b, 0x19, 0x01, 0x65,
0x9e, 0x91, 0xc2, 0x3e, 0xd9, 0x7b, 0x50, 0x14, 0xed, 0x71, 0x9a, 0x68,
0xc7, 0x25, 0x64, 0x76, 0xc2, 0x1e, 0x1f, 0x33, 0xc4, 0x1c, 0xcd, 0xfc,
0xc8, 0x85, 0xea, 0xa3, 0x06, 0xd5, 0x6c, 0x92, 0x37, 0xb6, 0x06, 0xbe,
0xa5, 0x52, 0x7c, 0xe3, 0xb1, 0xfc, 0xfd, 0x20, 0x20, 0x5c, 0x58, 0xc8,
0x3a, 0x48, 0x2b, 0xcc, 0xc9, 0x5d, 0xf7, 0x4e, 0x9c, 0x13, 0x92, 0x7b,
0x73, 0x6b, 0xa1, 0xfb, 0x6c, 0x78, 0xb7, 0xa0, 0x21, 0x56, 0x47, 0xdc,
0xf2, 0x25, 0x1e, 0xc9, 0x1c, 0x4a, 0x36, 0x44, 0x2f, 0x7d, 0x92, 0x31,
0x1c, 0x4e, 0x78, 0xe1, 0x02, 0x23, 0xe9, 0xb9, 0xfe, 0x99, 0xda, 0x8f,
0x15, 0x4c, 0xb9, 0xb5, 0x32, 0x5b, 0xef, 0x31, 0x1f, 0x65, 0x85, 0x24,
0x8d, 0x93, 0x2b, 0x9f, 0xef, 0xb2, 0x05, 0xc2, 0x85, 0x09, 0x41, 0x5e,
0xf4, 0xd2, 0xa7, 0x21, 0xdf, 0x6c, 0xb7, 0x49, 0x64, 0x0f, 0xb9, 0x0a,
0xe9, 0x1e, 0x81, 0x8d, 0x77, 0xe1, 0x27, 0xb6, 0x3c, 0xb6, 0x8c, 0xfb,
0x2e, 0x5b, 0xaf, 0xbc, 0x5c, 0x3a, 0x91, 0x38, 0x69, 0xd1, 0x38, 0x03,
0x69, 0xc9, 0x2b, 0x62, 0x33, 0x11, 0xa7, 0xbe, 0x7c, 0x94, 0xda, 0x43,
0x11, 0x99, 0x63, 0xd5, 0x96, 0x47, 0x7f, 0xac, 0xd7, 0x96, 0xab, 0x0d,
0x76, 0x78, 0xfa, 0x29, 0xdb, 0x28, 0xc4, 0xec, 0xc5, 0xd3, 0xc8, 0xd0,
0x47, 0x4c, 0x48, 0x22, 0xfb, 0x22, 0xd2, 0xde, 0x47, 0xe8, 0xab, 0x87,
0xd9, 0x17, 0x97, 0xe1, 0x7a, 0x97, 0x9f, 0x59, 0xa0, 0x43, 0xae, 0x6d,
0x14, 0x9b, 0xf6, 0x9a, 0xd5, 0xb4, 0xf1, 0x4e, 0x60, 0x04, 0xce, 0xfc,
0xf1, 0xd7, 0xc2, 0x79, 0x89, 0xa6, 0x0e, 0x47, 0x78, 0xfd, 0xed, 0x52,
0x0c, 0x1e, 0x10, 0xe5, 0x5e, 0xd8, 0x97, 0x61, 0xc0, 0x80, 0xb5, 0x20,
0x0a, 0x1a, 0x10, 0x66, 0x92, 0xd2, 0xcc, 0x5f, 0xac, 0xa9, 0x2a, 0x67,
0x04, 0xe3, 0x04, 0x09, 0x86, 0x15, 0x1e, 0xe9, 0x28, 0x22, 0x16, 0x88,
0x90, 0xa4, 0x46, 0xf9, 0xae, 0xa3, 0x50, 0x89, 0x15, 0x12, 0x17, 0xc8,
0x84, 0x59, 0x97, 0x60, 0xb2, 0x30, 0x86, 0xa2, 0x13, 0x5b, 0xf5, 0x33,
0xf7, 0xba, 0x62, 0x1e, 0x27, 0xc9, 0x9d, 0xae, 0xd2, 0x2a, 0xdb, 0xe9,
0x22, 0xa1, 0xb8, 0x1c, 0x79, 0x5f, 0xcb, 0x0d, 0xf7, 0xb5, 0x9c, 0x99,
0xf6, 0xb5, 0x78, 0x00, 0xac, 0xbe, 0xb4, 0xab, 0x85, 0xb6, 0x0a, 0xdb,
0xd3, 0xea, 0x73, 0x90, 0xf8, 0xf9, 0x3b, 0x3a, 0x2e, 0xbd, 0xe8, 0xbb,
0xb7, 0x48, 0x6f, 0x38, 0xd8, 0xc9, 0x19, 0x99, 0xb8, 0xe1, 0x90, 0x84,
0xb0, 0xb4, 0xe4, 0x59, 0x3e, 0xe2, 0x82, 0x25, 0x89, 0x35, 0x19, 0x57,
0x12, 0x82, 0xe0, 0x9a, 0x71, 0x1f, 0x86, 0xf5, 0x90, 0x7a, 0x9b, 0x05,
0xa3, 0xf9, 0x22, 0xea, 0xac, 0x36, 0x56, 0xa4, 0x25, 0x6c, 0xb2, 0xc9,
0x93, 0xa2, 0x6c, 0x0e, 0xdc, 0xcb, 0x9f, 0x64, 0x85, 0x11, 0x03, 0x2f,
0x69, 0x31, 0x5b, 0x9c, 0x95, 0x2c, 0xe7, 0x65, 0x44, 0xf9, 0x52, 0xd3,
0x5a, 0x0f, 0x83, 0x9f, 0x08, 0xd5, 0x17, 0x63, 0x35, 0xe6, 0x92, 0x75,
0xea, 0xd1, 0x1e, 0x61, 0x6a, 0xb9, 0xb2, 0x6c, 0x00, 0x95, 0xe3, 0xb3,
0x37, 0x17, 0xf2, 0x09, 0x7d, 0x4b, 0xc2, 0xda, 0x14, 0xba, 0x3d, 0x30,
0xff, 0xbc, 0xc2, 0xc1, 0xf1, 0xcb, 0xdd, 0xd3, 0xb3, 0xdd, 0x9d, 0xab,
0x9d, 0xdd, 0xbd, 0xcd, 0xf3, 0xc3, 0xb3, 0xab, 0xed, 0x93, 0xc3, 0x93,
0x53, 0xe1, 0x0e, 0xdf, 0xc7, 0xdf, 0xa5, 0x6b, 0x20, 0x72, 0xe2, 0xc2,
0xef, 0x83, 0x55, 0x53, 0xae, 0xd5, 0xc9, 0x7c, 0xa4, 0x91, 0x3a, 0xb5,
0x8f, 0xc4, 0x6c, 0x3a, 0xbe, 0x7d, 0x81, 0x05, 0x2f, 0x09, 0xe6, 0x8f,
0x2b, 0xdc, 0x0d, 0x4f, 0xae, 0x89, 0xc2, 0x47, 0xae, 0x43, 0x9b, 0x91,
0x89, 0xda, 0xc4, 0x99, 0x09, 0xfb, 0x9b, 0x08, 0x05, 0x32, 0x38, 0x8f,
0x9f, 0x5a, 0x13, 0xed, 0xba, 0x87, 0x59, 0x4b, 0x11, 0x01, 0xa2, 0xe5,
0x22, 0x65, 0x45, 0x3b, 0x1d, 0x34, 0x16, 0x12, 0x10, 0x69, 0xa8, 0x14,
0x74, 0xd0, 0xed, 0x0c, 0x11, 0x3f, 0x2c, 0x48, 0x83, 0x23, 0x42, 0x81,
0x94, 0x72, 0xe3, 0x9c, 0x0a, 0x82, 0x35, 0x9e, 0x30, 0x24, 0xd3, 0x87,
0xd6, 0x38, 0xa9, 0xdd, 0xdc, 0xb1, 0x5e, 0xaf, 0x14, 0x3f, 0x4f, 0x63,
0xaa, 0x5c, 0x05, 0x93, 0x6a, 0x53, 0x50, 0x92, 0x5e, 0xa8, 0x24, 0xfd,
0x8f, 0x51, 0x92, 0x92, 0x8a, 0x0c, 0x5d, 0x18, 0x98, 0x9e, 0x34, 0x01,
0xce, 0x05, 0x38, 0x4f, 0x1a, 0x66, 0x64, 0xc1, 0x17, 0x2a, 0x15, 0xf6,
0x25, 0x9a, 0xe7, 0x06, 0xdb, 0x27, 0x63, 0x13, 0x32, 0xee, 0x88, 0xb1,
0x9f, 0xf1, 0x40, 0x5d, 0x3c, 0x9d, 0x6c, 0x97, 0x34, 0xf8, 0x50, 0x9c,
0xaa, 0xfb, 0x26, 0xc5, 0x10, 0x0b, 0x97, 0x6d, 0xe9, 0x41, 0xc4, 0x22,
0xaf, 0x6d, 0xa1, 0x01, 0x0c, 0xb7, 0x47, 0xb6, 0xfb, 0x42, 0xee, 0xff,
0x48, 0xa3, 0x96, 0x69, 0x31, 0x45, 0xce, 0x97, 0x5e, 0x62, 0xab, 0x48,
0x92, 0x35, 0xb9, 0x0d, 0xd1, 0x4a, 0x47, 0xb5, 0x17, 0x2e, 0xc5, 0x6a,
0xfb, 0x27, 0x6d, 0xaf, 0x6a, 0x33, 0xfc, 0xc7, 0x8e, 0xba, 0x14, 0x57,
0x20, 0x26, 0x9a, 0x13, 0x61, 0x52, 0x1a, 0xc1, 0xe3, 0xa7, 0xa9, 0xd3,
0x85, 0x7d, 0xb4, 0x8e, 0xdd, 0x21, 0x1d, 0xcb, 0x0e, 0x77, 0xe8, 0xc8,
0xa5, 0x59, 0xe9, 0x9b, 0x8e, 0xe1, 0x66, 0x44, 0x74, 0x8d, 0x35, 0x8a,
0x48, 0x34, 0x6f, 0x3d, 0x3e, 0xce, 0x07, 0x69, 0x7b, 0x8e, 0x4c, 0x8a,
0x42, 0xfd, 0x62, 0x5d, 0x94, 0x2e, 0xa7, 0x6e, 0x72, 0x82, 0xd5, 0x16,
0xcc, 0x04, 0xe7, 0xb0, 0x2d, 0x4c, 0xf3, 0x2e, 0xeb, 0xeb, 0x45, 0x3c,
0xc5, 0x0c, 0xb7, 0x34, 0x3d, 0x65, 0xab, 0x58, 0x28, 0x35, 0x6c, 0x88,
0x93, 0xbe, 0x81, 0xfa, 0xf8, 0xe8, 0xae, 0x15, 0x35, 0x69, 0xca, 0xc7,
0xea, 0x26, 0x6e, 0xef, 0x92, 0xcd, 0x59, 0x32, 0x41, 0x45, 0x4c, 0x92,
0xa6, 0xc8, 0x74, 0xe7, 0xd2, 0x70, 0x8d, 0xbf, 0x91, 0x3e, 0x8d, 0x86,
0x92, 0xb5, 0x15, 0x4e, 0xf3, 0x91, 0x9b, 0x3a, 0x3f, 0x3e, 0x98, 0x58,
0x90, 0xef, 0x34, 0x2a, 0x11, 0x68, 0x64, 0x72, 0xb6, 0xa3, 0x10, 0x38,
0xd6, 0x45, 0xf1, 0x52, 0xf7, 0xa1, 0x1b, 0x8a, 0x97, 0x79, 0x1b, 0xfa,
0xc3, 0xcd, 0x3b, 0xb9, 0x92, 0x30, 0x09, 0xd2, 0x89, 0xcf, 0x06, 0x45,
0x0e, 0x6a, 0x9f, 0xee, 0xb8, 0x84, 0x65, 0x7d, 0x98, 0xe0, 0x9d, 0x0d,
0xc4, 0xd0, 0x00, 0x7d, 0x6f, 0x38, 0x68, 0xe3, 0x6c, 0x20, 0x26, 0xe5,
0x21, 0x06, 0x4e, 0xaf, 0x4a, 0xc4, 0x26, 0x54, 0x1c, 0x5a, 0x7c, 0xfd,
0xa8, 0xa7, 0x81, 0x94, 0x7c, 0x09, 0x7a, 0x3b, 0x92, 0xc6, 0xa8, 0x5c,
0x51, 0x77, 0x72, 0x4a, 0xcf, 0x76, 0x6a, 0xdb, 0xf5, 0x61, 0x1d, 0x30,
0x6f, 0x18, 0x2e, 0x6f, 0xa7, 0x65, 0x78, 0x40, 0x9c, 0xfb, 0x91, 0xc4,
0x15, 0x61, 0x02, 0xb3, 0x80, 0xb4, 0xb1, 0x38, 0xd7, 0x53, 0x9d, 0x6a,
0x5c, 0x10, 0xc6, 0xa1, 0x94, 0x5f, 0x4a, 0x46, 0x22, 0xa8, 0x57, 0xe3,
0x02, 0xab, 0xd1, 0x83, 0x44, 0x5e, 0x5c, 0x4d, 0xc4, 0x36, 0xd0, 0x66,
0x93, 0x3d, 0xb0, 0x36, 0x95, 0x63, 0xdb, 0xe7, 0x5e, 0xb7, 0x4c, 0x01,
0x40, 0x77, 0x6f, 0xbb, 0xae, 0xd7, 0xb1, 0x1d, 0x80, 0xf4, 0x77, 0xbf,
0x1e, 0x99, 0x64, 0xb9, 0x1d, 0x6f, 0x88, 0x86, 0x83, 0x3a, 0xb5, 0x40,
0x10, 0x6f, 0x1b, 0x80, 0xdb, 0xf3, 0xd2, 0x4d, 0xa8, 0x44, 0xab, 0x1e,
0x1f, 0xfd, 0x18, 0x04, 0xa5, 0x3b, 0x8d, 0xa2, 0x90, 0xee, 0x2c, 0xd3,
0x30, 0x0b, 0x0b, 0xc8, 0x5b, 0xdc, 0x2f, 0x85, 0x3f, 0xf8, 0x51, 0xa2,
0x1f, 0xa5, 0x4b, 0x34, 0x98, 0x94, 0xc6, 0x8d, 0x37, 0xd6, 0x97, 0xab,
0xd5, 0xcf, 0xb3, 0x9a, 0x62, 0xd7, 0x3c, 0x92, 0x06, 0x53, 0x6d, 0x99,
0xad, 0x33, 0x4b, 0x55, 0xb6, 0xce, 0x24, 0x8e, 0x14, 0x2e, 0x8b, 0xe2,
0x1c, 0x7a, 0x54, 0x90, 0xdb, 0x52, 0xb5, 0xe5, 0xf0, 0x4e, 0xd4, 0xe0,
0x23, 0x5d, 0x2b, 0x3c, 0xb2, 0x00, 0x4d, 0xba, 0x56, 0xa0, 0x8f, 0x75,
0x86, 0x40, 0x74, 0x08, 0x0c, 0x40, 0x88, 0xb7, 0xad, 0x61, 0xd4, 0x5b,
0xde, 0x53, 0x17, 0xa3, 0x58, 0x72, 0x57, 0x0a, 0x33, 0x9e, 0x2d, 0x87,
0x37, 0x0e, 0x93, 0xf1, 0x2a, 0xa7, 0x91, 0xc9, 0xc4, 0x93, 0xd9, 0x55,
0x61, 0xba, 0x1d, 0xf2, 0xc0, 0x9d, 0x20, 0x6e, 0x5d, 0xef, 0xfd, 0x36,
0x77, 0xab, 0x70, 0xd4, 0x6e, 0x15, 0xf4, 0x9e, 0x46, 0xb8, 0x97, 0x12,
0x5b, 0xdd, 0xba, 0xb8, 0x52, 0x1e, 0x5a, 0x6d, 0xbb, 0x6b, 0xb7, 0x25,
0x17, 0x84, 0x4c, 0xe2, 0x5a, 0x4e, 0x46, 0x8f, 0x16, 0xbd, 0xc9, 0x98,
0xa1, 0x13, 0x17, 0xbb, 0xb1, 0xc3, 0x3a, 0x39, 0x9a, 0x47, 0x53, 0xc9,
0x18, 0x43, 0x15, 0xde, 0x50, 0xbc, 0x90, 0x1f, 0x71, 0x0b, 0x04, 0x32,
0x3a, 0x89, 0x96, 0xb1, 0xa4, 0x87, 0x48, 0x94, 0x51, 0x04, 0x53, 0xf8,
0x2d, 0x6f, 0xbf, 0xcb, 0x47, 0xcc, 0x34, 0xcd, 0xfb, 0x64, 0x87, 0x6a,
0x95, 0xb1, 0x28, 0xd7, 0x20, 0xc4, 0x93, 0xbd, 0x82, 0x75, 0xd5, 0x2e,
0x10, 0x25, 0xc6, 0x30, 0x8a, 0xe2, 0xaa, 0x59, 0x4d, 0x6f, 0xcd, 0x08,
0xc4, 0xc0, 0x6a, 0xa0, 0x6d, 0x27, 0x1e, 0x80, 0x92, 0x29, 0x7d, 0xe2,
0x21, 0x6a, 0x74, 0xa0, 0x68, 0xe1, 0x48, 0x9b, 0x24, 0xe4, 0x08, 0x45,
0x12, 0x48, 0xfc, 0x0a, 0x92, 0x8f, 0xf1, 0x52, 0x95, 0xe1, 0x38, 0x15,
0x3a, 0xdf, 0x22, 0xfb, 0x74, 0xd1, 0xa1, 0xa5, 0x15, 0x93, 0x72, 0x7a,
0xcd, 0xde, 0x34, 0xe4, 0x54, 0x18, 0xe2, 0x20, 0x47, 0x03, 0x68, 0x3b,
0xcc, 0x4d, 0x78, 0xa8, 0x69, 0x8a, 0x27, 0x3a, 0x68, 0x19, 0x38, 0x3c,
0x02, 0x47, 0x11, 0x34, 0x18, 0xce, 0x93, 0xa0, 0xcb, 0xe0, 0xff, 0xb5,
0x07, 0x28, 0x59, 0x0c, 0x77, 0x37, 0x9c, 0x82, 0xdf, 0xb7, 0xbb, 0xd0,
0x11, 0x4d, 0x93, 0x79, 0x2c, 0xb0, 0xa6, 0xb0, 0x41, 0x95, 0x8d, 0x55,
0x1b, 0x14, 0xc8, 0x6b, 0x4b, 0x03, 0xe8, 0xae, 0x33, 0x1e, 0x04, 0x1a,
0xd6, 0x5a, 0xe1, 0x5c, 0xa4, 0x91, 0x7f, 0xf3, 0xf8, 0x8d, 0x77, 0x35,
0xc9, 0x47, 0x69, 0x3c, 0x1f, 0xca, 0xb0, 0xed, 0x0b, 0xd7, 0xff, 0xb3,
0x26, 0xa8, 0xda, 0xc1, 0x5a, 0xc0, 0x28, 0xcd, 0x97, 0x00, 0x8a, 0x47,
0xdb, 0x78, 0x86, 0x6f, 0x40, 0x64, 0x07, 0xb9, 0x92, 0x86, 0xf3, 0x66,
0xe1, 0xf8, 0x1c, 0x63, 0x6d, 0xf0, 0x80, 0x1b, 0xb0, 0x7e, 0x30, 0xf9,
0xd9, 0xed, 0x82, 0x91, 0x2f, 0x95, 0x6b, 0x2b, 0xe5, 0xd5, 0x52, 0x45,
0x0f, 0x13, 0x1f, 0x8d, 0xf2, 0xda, 0x5a, 0x19, 0x74, 0xa3, 0x9d, 0x35,
0x61, 0x06, 0x85, 0x25, 0xa0, 0x65, 0x0c, 0xc6, 0xe3, 0x31, 0x0d, 0xb1,
0x12, 0x19, 0x26, 0x54, 0xfd, 0x73, 0x73, 0x22, 0x34, 0xa6, 0x74, 0x5f,
0x29, 0x1b, 0xa4, 0xbf, 0xb0, 0x37, 0x1c, 0xd0, 0x60, 0xae, 0x41, 0x4c,
0x8e, 0xd1, 0x60, 0xd0, 0xb4, 0xe5, 0xfd, 0xe9, 0xb8, 0xb0, 0x92, 0xdb,
0x35, 0x60, 0x11, 0xc0, 0xac, 0x80, 0x85, 0x07, 0xb4, 0x10, 0x5a, 0x63,
0x07, 0x0e, 0xde, 0x95, 0x86, 0x92, 0x1b, 0xc0, 0x2a, 0xb4, 0xce, 0x7a,
0x3b, 0xf4, 0x95, 0xb0, 0xac, 0x36, 0xc1, 0x42, 0x93, 0x37, 0x3a, 0x1a,
0xb4, 0xe0, 0xe9, 0xfe, 0x16, 0x14, 0xfa, 0xca, 0xeb, 0xb5, 0xb2, 0x5f,
0x3c, 0x78, 0x85, 0xcd, 0x00, 0xfa, 0xa6, 0x35, 0x0a, 0x2c, 0xec, 0xc4,
0x42, 0xe0, 0xd2, 0x98, 0x22, 0x00, 0x43, 0xc4, 0x75, 0xaf, 0x47, 0x0f,
0x0d, 0x34, 0xad, 0xf0, 0x0e, 0xf8, 0x9c, 0xcd, 0xe8, 0x19, 0x6d, 0xac,
0x7d, 0x35, 0xc1, 0xb8, 0x63, 0x3b, 0x33, 0x62, 0xd9, 0xcb, 0xb0, 0xf6,
0x2d, 0x56, 0xfb, 0xc0, 0x98, 0xb1, 0xfe, 0xad, 0x94, 0xfa, 0x29, 0xb2,
0x67, 0x26, 0x71, 0x05, 0xce, 0x62, 0x78, 0x87, 0xc1, 0xf4, 0xdd, 0x22,
0x11, 0x1f, 0xa1, 0x89, 0x8e, 0x98, 0x36, 0x46, 0x3c, 0x62, 0x4b, 0x91,
0x78, 0x0c, 0xf6, 0x02, 0xeb, 0xa2, 0x9d, 0x30, 0x83, 0x1d, 0x07, 0xcc,
0x10, 0x18, 0xa7, 0xcf, 0x1c, 0x09, 0xc8, 0xbc, 0xf0, 0x90, 0x09, 0xdc,
0x21, 0x1e, 0x9e, 0x5b, 0x05, 0x97, 0xbb, 0x31, 0xe3, 0xb4, 0xba, 0xb0,
0xd0, 0x06, 0xe5, 0x6c, 0x09, 0x5b, 0x65, 0x9c, 0x01, 0xa4, 0x4d, 0xaa,
0x0c, 0x42, 0xb9, 0xde, 0x36, 0x08, 0x46, 0x23, 0x81, 0x11, 0x6f, 0x3a,
0xe9, 0x28, 0x38, 0x90, 0x65, 0xe2, 0x11, 0x22, 0x68, 0x6f, 0xd7, 0x00,
0x33, 0xb3, 0x8f, 0x66, 0xe6, 0x46, 0xd6, 0x16, 0x16, 0x00, 0xe6, 0xe3,
0x63, 0x38, 0x97, 0x46, 0xc6, 0x24, 0xee, 0x98, 0xf8, 0x79, 0x07, 0xb7,
0x10, 0x79, 0xe1, 0x86, 0x09, 0x85, 0x07, 0x80, 0x6d, 0xb6, 0xd2, 0x81,
0x5c, 0x1a, 0xc4, 0x7f, 0xc0, 0xa9, 0x9a, 0xa7, 0x54, 0x49, 0x78, 0x26,
0x50, 0x00, 0x03, 0x53, 0x0a, 0x20, 0x08, 0x83, 0x32, 0xba, 0x78, 0x22,
0xde, 0x5a, 0x52, 0x8f, 0x25, 0x3b, 0x74, 0x9e, 0x8a, 0x47, 0x4c, 0xd2,
0x52, 0x1d, 0x8a, 0x8a, 0x71, 0xab, 0x51, 0x38, 0x68, 0x88, 0xf6, 0x23,
0x78, 0xa8, 0x8f, 0x64, 0x10, 0x1c, 0x12, 0xff, 0x62, 0xcf, 0x33, 0xaf,
0x63, 0x5b, 0x15, 0xe1, 0xc6, 0x5c, 0xfa, 0x62, 0x20, 0xc8, 0x5b, 0xb9,
0x70, 0xe3, 0x56, 0xa1, 0x80, 0x84, 0x9c, 0x18, 0x17, 0x30, 0x8c, 0xbb,
0xa4, 0x31, 0xe9, 0x7e, 0x6e, 0x89, 0x48, 0x5c, 0xe2, 0x08, 0x1f, 0x04,
0x9e, 0x6c, 0xf6, 0x86, 0x01, 0x8b, 0xd6, 0xca, 0xb5, 0x7a, 0x94, 0xc7,
0xcd, 0x11, 0x31, 0x98, 0x94, 0xb0, 0xd0, 0x56, 0x19, 0x01, 0x78, 0xa9,
0xe4, 0xe4, 0xd6, 0x89, 0xec, 0x57, 0x5e, 0xd5, 0xdc, 0x84, 0x42, 0x17,
0xc1, 0x65, 0x6a, 0x28, 0x22, 0x39, 0xc0, 0x99, 0x64, 0x8e, 0x34, 0xb9,
0x1a, 0x4e, 0xde, 0x36, 0xc1, 0x60, 0x89, 0xf4, 0x3d, 0x47, 0x12, 0xa6,
0x0b, 0x16, 0x91, 0xc4, 0xa8, 0xd1, 0xd6, 0x55, 0xe6, 0x4f, 0x53, 0xa6,
0x50, 0xe1, 0x4e, 0x90, 0x46, 0x35, 0x2c, 0x87, 0x6c, 0xb4, 0xf0, 0xe3,
0x86, 0xf8, 0x60, 0xac, 0x97, 0x97, 0x3f, 0xd3, 0xb8, 0x4f, 0x3c, 0x2c,
0x91, 0x34, 0xef, 0x89, 0x0d, 0x4f, 0xcc, 0x7b, 0x7c, 0xc8, 0x85, 0x07,
0x43, 0xa0, 0x81, 0xb5, 0x60, 0xac, 0x15, 0x75, 0x34, 0x9c, 0x07, 0x38,
0xef, 0xa3, 0x6e, 0xd3, 0x89, 0x9b, 0xc3, 0x15, 0x9e, 0x8a, 0x29, 0x90,
0x27, 0xcf, 0x0e, 0x85, 0xad, 0x53, 0x3e, 0xb8, 0x12, 0x31, 0x0e, 0xa8,
0xc6, 0xe1, 0xc6, 0x7b, 0x62, 0x37, 0x4a, 0x78, 0x24, 0xc4, 0x88, 0xe2,
0x83, 0xc5, 0xdf, 0x47, 0x49, 0xbf, 0x3e, 0x1b, 0x06, 0x6a, 0x94, 0xa2,
0x1a, 0x38, 0xdc, 0x38, 0xc7, 0x38, 0x57, 0xc6, 0x43, 0xb7, 0x07, 0x6b,
0xf9, 0x16, 0xfe, 0x03, 0xbd, 0xc0, 0xdc, 0x70, 0xc3, 0xb0, 0x65, 0x36,
0xbe, 0x09, 0xc3, 0x45, 0x36, 0x8c, 0xae, 0x85, 0xfa, 0xb4, 0x27, 0x62,
0xc1, 0xe3, 0x0e, 0x2b, 0x0c, 0xaa, 0x15, 0x45, 0xd0, 0x32, 0xca, 0xf5,
0x95, 0x6a, 0xa5, 0x56, 0xad, 0xd5, 0x17, 0xb0, 0xc8, 0x86, 0x55, 0xa0,
0x0b, 0x23, 0xab, 0x53, 0x20, 0x95, 0x11, 0x0e, 0x23, 0xa7, 0xdb, 0xd4,
0xba, 0xe2, 0x5c, 0x76, 0xd3, 0x67, 0x21, 0xec, 0x01, 0x5d, 0x18, 0x72,
0x30, 0x32, 0xfd, 0x84, 0xb5, 0x52, 0x25, 0xfa, 0x3c, 0xac, 0x2b, 0x74,
0xb3, 0x26, 0x8a, 0x32, 0x32, 0x5a, 0xc3, 0x8d, 0x87, 0x92, 0x9e, 0x72,
0x6f, 0xe6, 0x53, 0x43, 0xcc, 0x2c, 0x95, 0x6a, 0x9a, 0xd6, 0xbc, 0x32,
0x82, 0xc5, 0xd1, 0xf7, 0xb3, 0xe5, 0x45, 0xe1, 0x8e, 0x88, 0x45, 0xdd,
0xa7, 0x3e, 0x7e, 0xa2, 0xb4, 0xf5, 0x0c, 0x7d, 0xb6, 0x8c, 0xae, 0x90,
0x1e, 0x52, 0x26, 0xbb, 0xbe, 0x7a, 0xb2, 0xc3, 0x07, 0xe3, 0xd6, 0xd7,
0x57, 0x16, 0x4a, 0xf5, 0xe5, 0xe5, 0xe5, 0x72, 0xa9, 0x86, 0x1c, 0x07,
0xa1, 0xb7, 0x04, 0xe3, 0x46, 0x40, 0x62, 0x1a, 0xaa, 0x8c, 0x24, 0x92,
0x01, 0x22, 0xc1, 0x29, 0xa9, 0x63, 0xa4, 0x8b, 0x2e, 0x3a, 0x78, 0x41,
0x13, 0xe8, 0x32, 0x3e, 0x7c, 0xda, 0x23, 0xba, 0xba, 0x8f, 0x7b, 0x9f,
0x1d, 0x22, 0x65, 0xf5, 0xe5, 0x52, 0x71, 0x65, 0xa5, 0x5e, 0x5d, 0x90,
0x45, 0xeb, 0xf1, 0x11, 0xe6, 0x92, 0x6c, 0xad, 0x58, 0xa9, 0x94, 0xea,
0xd5, 0x95, 0x05, 0x59, 0x16, 0xb5, 0x49, 0x25, 0x35, 0xff, 0xd6, 0x0e,
0xda, 0x7d, 0x75, 0x59, 0xc8, 0x7e, 0x68, 0xc3, 0xea, 0x7c, 0x8e, 0x35,
0xa7, 0xde, 0x20, 0x5f, 0x95, 0x4a, 0xad, 0x56, 0xad, 0x56, 0xca, 0x8d,
0xfe, 0x34, 0x53, 0xa8, 0x5c, 0xab, 0xc5, 0x10, 0x5e, 0x12, 0x16, 0x35,
0x5b, 0x9e, 0x65, 0xbe, 0x6f, 0x12, 0x6c, 0xbc, 0x66, 0xc0, 0x96, 0xe5,
0x6c, 0x8b, 0x53, 0xb1, 0xb6, 0xb6, 0xf2, 0x08, 0xb8, 0x58, 0x31, 0xf6,
0x6e, 0xed, 0xc4, 0xea, 0x05, 0x8b, 0x14, 0x2b, 0xa4, 0x6e, 0x51, 0x93,
0xda, 0xda, 0xfa, 0xb6, 0xdb, 0xda, 0xfa, 0x94, 0xb6, 0xb6, 0xc2, 0xb6,
0x8e, 0xfb, 0x86, 0x47, 0xca, 0x17, 0x5a, 0x60, 0x11, 0x74, 0xb2, 0x7d,
0xbd, 0x5a, 0x5e, 0xad, 0xae, 0xd6, 0x97, 0x8b, 0xd5, 0xe2, 0xc2, 0x2c,
0xfb, 0xa9, 0xae, 0x6a, 0xdf, 0xf4, 0x64, 0x68, 0x7e, 0x0d, 0x33, 0x80,
0x3b, 0x69, 0x6b, 0x94, 0xc2, 0x68, 0xa4, 0xf2, 0xc7, 0x52, 0x79, 0x45,
0x13, 0x05, 0x9a, 0x32, 0xb2, 0x3f, 0xd3, 0x8e, 0xee, 0xb7, 0x42, 0x81,
0x58, 0x39, 0x9a, 0x06, 0x38, 0x2a, 0x75, 0x57, 0x7d, 0x3b, 0x18, 0x46,
0xa5, 0x32, 0x27, 0x65, 0x58, 0xea, 0x24, 0x3e, 0x44, 0x80, 0xf1, 0x21,
0x48, 0xd8, 0xb7, 0x4d, 0x7f, 0x4b, 0x56, 0x0b, 0x9a, 0x68, 0xb9, 0x4c,
0x1c, 0x46, 0x0b, 0x0b, 0x45, 0x63, 0xc2, 0x00, 0x34, 0xff, 0x89, 0xf8,
0xc5, 0xf7, 0xe4, 0x3f, 0x65, 0xf0, 0x4f, 0x1b, 0x10, 0xe6, 0xb7, 0x3a,
0x20, 0xcc, 0xe9, 0x03, 0x62, 0xea, 0x10, 0x9e, 0xa6, 0xae, 0x3e, 0x9a,
0xe2, 0x89, 0xea, 0x2a, 0x8d, 0xe2, 0x54, 0x75, 0x35, 0xa9, 0xfa, 0xb8,
0xba, 0x32, 0xe5, 0xc1, 0x6f, 0xfe, 0x98, 0x0c, 0x7e, 0x1c, 0x36, 0x7c,
0xe7, 0xff, 0x23, 0x67, 0x66, 0x5c, 0x43, 0xfe, 0x18, 0x4e, 0xcb, 0x6d,
0x52, 0x73, 0x67, 0x23, 0xcf, 0x65, 0x86, 0x98, 0x61, 0x0b, 0xf9, 0x52,
0xa5, 0x5a, 0x2e, 0x41, 0xc2, 0xea, 0x63, 0xff, 0x31, 0xec, 0x72, 0x19,
0x48, 0xc8, 0xd1, 0xf4, 0x01, 0xa9, 0x5c, 0x04, 0x00, 0xa5, 0x90, 0x67,
0xe3, 0xae, 0xf6, 0x68, 0x0a, 0xa0, 0xa9, 0x2a, 0x24, 0x0b, 0xc4, 0xcc,
0x53, 0x44, 0x93, 0xb4, 0xc9, 0x46, 0x48, 0x5c, 0x5c, 0xfc, 0x1f, 0x43,
0x81, 0x74, 0x45, 0x97, 0x18, 0xd6, 0x7a, 0xb1, 0x1d, 0x69, 0x08, 0x18,
0x6d, 0x95, 0x58, 0x9d, 0x4c, 0x5f, 0xce, 0x03, 0x81, 0x03, 0xc2, 0xb0,
0x54, 0xfa, 0xd0, 0xc3, 0x26, 0xaf, 0x6c, 0x61, 0x4b, 0x22, 0xaf, 0x9b,
0x50, 0xce, 0x02, 0x79, 0x69, 0xe5, 0x95, 0xd4, 0x81, 0x4d, 0x4d, 0x44,
0x02, 0x4f, 0x1d, 0xc4, 0xb0, 0x76, 0x91, 0x2d, 0xde, 0xde, 0xe8, 0x37,
0x62, 0xed, 0x89, 0x59, 0xe6, 0x83, 0x0d, 0xb3, 0x11, 0xc3, 0x19, 0xb3,
0xd3, 0x17, 0x8c, 0x5a, 0xa5, 0xbe, 0xb2, 0x5c, 0x5c, 0x2d, 0x95, 0xe2,
0x59, 0x8f, 0xc6, 0xd5, 0xda, 0x5a, 0x79, 0x75, 0xa1, 0xb2, 0x5c, 0x5b,
0x29, 0xae, 0xd6, 0x2b, 0x2b, 0x55, 0x74, 0xf1, 0xab, 0x97, 0x97, 0x3f,
0x6f, 0x79, 0x96, 0x12, 0x6f, 0xc6, 0x08, 0x54, 0xcf, 0x54, 0x29, 0x4e,
0x66, 0x8a, 0xab, 0x6c, 0xe9, 0xb6, 0x4a, 0x4e, 0x66, 0x2e, 0x60, 0x05,
0xac, 0x2c, 0xd9, 0x1d, 0x39, 0xc2, 0x79, 0x39, 0x75, 0xf4, 0x23, 0xe7,
0x28, 0x6c, 0x11, 0xd0, 0xa1, 0xd1, 0x7c, 0x78, 0xc4, 0xc1, 0x6d, 0xd7,
0xe9, 0xda, 0x3d, 0x2d, 0xcb, 0xe1, 0xb0, 0x4c, 0x3b, 0xfe, 0xfe, 0x83,
0x23, 0xfa, 0x41, 0x86, 0x9b, 0x99, 0x0e, 0x2c, 0x68, 0x75, 0xa0, 0xad,
0xe0, 0xde, 0x3a, 0x56, 0x67, 0xeb, 0xbe, 0x40, 0x9e, 0x81, 0x3e, 0xe9,
0xe2, 0xd6, 0x34, 0x4c, 0x52, 0xfe, 0x3a, 0x3e, 0xf3, 0x02, 0x3f, 0x48,
0x7d, 0x6d, 0x52, 0x0f, 0x39, 0x11, 0xf3, 0xb5, 0xac, 0xcd, 0xbe, 0xc1,
0x0c, 0xe6, 0xcb, 0x7d, 0xbb, 0x60, 0x22, 0xfd, 0x4d, 0x74, 0xa9, 0x8a,
0x50, 0xd2, 0x7a, 0x71, 0xf3, 0x89, 0xe4, 0x46, 0x41, 0x7c, 0x60, 0xa6,
0xf7, 0x87, 0x03, 0x50, 0x53, 0xc0, 0xf5, 0x92, 0xa6, 0x35, 0xa2, 0x22,
0x2c, 0xd9, 0xc7, 0x03, 0x57, 0xa2, 0xb1, 0xc7, 0xe3, 0x59, 0x5b, 0xd3,
0xfc, 0x08, 0x6a, 0x79, 0x75, 0xc4, 0x43, 0xd5, 0xc2, 0xed, 0x26, 0x42,
0x21, 0x0d, 0x7d, 0x39, 0x77, 0x05, 0x8a, 0x8b, 0x3e, 0x07, 0x37, 0x32,
0x1e, 0x48, 0x46, 0x83, 0x6e, 0x7e, 0x4b, 0x01, 0x38, 0x3a, 0xec, 0x45,
0x45, 0x7c, 0x8b, 0x14, 0xd6, 0x6c, 0x76, 0x1b, 0x2c, 0x13, 0x7e, 0x1f,
0x4f, 0xa7, 0x75, 0x36, 0x3a, 0x3a, 0xab, 0xa9, 0x71, 0x61, 0x5d, 0x8e,
0xf9, 0xd6, 0x83, 0x43, 0xeb, 0x1d, 0x69, 0xfa, 0x88, 0xd5, 0x3b, 0x41,
0xc4, 0x22, 0x91, 0x88, 0x0e, 0x35, 0xa6, 0xb1, 0x22, 0xa5, 0x53, 0xf3,
0xb8, 0x31, 0x64, 0x6b, 0x0f, 0x25, 0xb2, 0xdf, 0x2f, 0x80, 0xf1, 0x8e,
0x22, 0x89, 0x53, 0xfa, 0x4a, 0x2a, 0xc8, 0x72, 0x6c, 0xa1, 0xbb, 0x60,
0xb8, 0x81, 0x94, 0x7f, 0xde, 0x70, 0x8b, 0x1c, 0x05, 0x61, 0x84, 0x89,
0xdd, 0x69, 0x04, 0x31, 0xd9, 0x57, 0x78, 0xdb, 0xd6, 0xd1, 0xd9, 0x38,
0x0e, 0x16, 0x1b, 0x58, 0xa1, 0x83, 0x18, 0x3f, 0xd4, 0x7f, 0x88, 0x74,
0x60, 0x43, 0x54, 0x88, 0x7a, 0xa4, 0xba, 0x1b, 0xa2, 0x1e, 0xd7, 0xd9,
0x5b, 0xd4, 0x7c, 0x31, 0x8f, 0x7e, 0x92, 0xba, 0xe8, 0x8d, 0x2f, 0xe7,
0x28, 0xec, 0xe0, 0x14, 0x00, 0xb5, 0x5b, 0xc5, 0x34, 0x58, 0x66, 0x4d,
0xa8, 0xc1, 0x26, 0x3a, 0x5c, 0xcc, 0x5c, 0x46, 0x55, 0x05, 0x1a, 0x6a,
0xc0, 0x16, 0xfc, 0x53, 0xf0, 0x89, 0x24, 0x10, 0xc9, 0x0f, 0x3c, 0xd3,
0x0f, 0x88, 0xf4, 0x42, 0xa6, 0xf4, 0xad, 0xf7, 0xcd, 0x41, 0x77, 0x3b,
0x06, 0x91, 0x48, 0xe3, 0x03, 0xe5, 0x41, 0x7c, 0x6c, 0xa0, 0xe1, 0x48,
0x6f, 0x0f, 0xe8, 0xf1, 0xe0, 0x59, 0x0d, 0x53, 0x97, 0x42, 0x84, 0x34,
0x1c, 0x39, 0x64, 0x88, 0x1e, 0x45, 0x5b, 0xc1, 0xac, 0xf0, 0x43, 0x8f,
0x05, 0x19, 0x6e, 0x58, 0x7a, 0x3c, 0xc0, 0x70, 0x23, 0x04, 0xe2, 0xcf,
0xcc, 0x35, 0x6c, 0x21, 0x85, 0x01, 0x79, 0x7a, 0x14, 0x83, 0x17, 0x6a,
0x88, 0x3e, 0x74, 0xbe, 0x07, 0xc3, 0x52, 0xc9, 0x03, 0x04, 0x51, 0xa0,
0x60, 0x96, 0x4a, 0x3f, 0xf4, 0x58, 0xbc, 0x61, 0x27, 0x16, 0x80, 0x58,
0x4f, 0x9c, 0x40, 0x03, 0x48, 0x22, 0x4d, 0x27, 0xbb, 0xc8, 0x00, 0x8e,
0x0a, 0xeb, 0xc0, 0xd9, 0xf2, 0xb0, 0x38, 0x7d, 0xf2, 0x14, 0xc0, 0xd3,
0x33, 0x75, 0xd0, 0x3d, 0xf6, 0xf5, 0xe8, 0x9a, 0xf7, 0x06, 0x65, 0xac,
0x53, 0x50, 0x25, 0xeb, 0xd4, 0x5a, 0x6e, 0xf4, 0xc7, 0xa8, 0xbd, 0xa4,
0x41, 0x2a, 0x0e, 0xb6, 0xc4, 0xcd, 0x03, 0xd1, 0xc8, 0xe7, 0x0a, 0x0c,
0x2f, 0x23, 0x90, 0xad, 0x69, 0x71, 0x01, 0x60, 0x53, 0x7b, 0x1f, 0xf7,
0xe5, 0x55, 0xe9, 0xd1, 0xc6, 0x35, 0xd3, 0xaa, 0xfc, 0x58, 0x5b, 0x88,
0xa7, 0x86, 0x45, 0xe3, 0x89, 0x0b, 0x60, 0x0e, 0x8a, 0x82, 0x44, 0x80,
0xe4, 0x57, 0x2d, 0x2c, 0x41, 0x3c, 0x48, 0x76, 0xf4, 0x49, 0x32, 0x45,
0xb1, 0xa2, 0xf9, 0x62, 0x0a, 0x82, 0x44, 0x9d, 0x4f, 0xf2, 0xa3, 0x4f,
0x9e, 0x89, 0x32, 0x10, 0x66, 0xe1, 0x07, 0xcf, 0x78, 0x15, 0xd5, 0x1a,
0x7d, 0xca, 0x99, 0xd8, 0x77, 0x31, 0x00, 0x4c, 0x42, 0xa0, 0x84, 0x24,
0x10, 0xb8, 0x44, 0x2a, 0x82, 0xc6, 0x1f, 0x4e, 0x8c, 0x78, 0x15, 0xa6,
0xc9, 0x60, 0x02, 0x3f, 0xe2, 0x89, 0x04, 0x30, 0x55, 0xaa, 0x68, 0x91,
0xd4, 0x6c, 0x2c, 0xac, 0x12, 0x30, 0x52, 0x4c, 0x95, 0x41, 0x7a, 0x50,
0xb9, 0x54, 0x33, 0x04, 0x59, 0x89, 0x65, 0x09, 0x85, 0x62, 0xd6, 0xb8,
0x58, 0x28, 0x96, 0x35, 0x96, 0xe7, 0x22, 0x71, 0x2a, 0x66, 0x42, 0xc7,
0xd7, 0x18, 0xa2, 0x09, 0x6e, 0x69, 0x8f, 0x8f, 0x7c, 0x9d, 0x2b, 0xa7,
0xc3, 0x50, 0x29, 0x57, 0x3e, 0x73, 0x6e, 0x94, 0x5e, 0x73, 0x01, 0xca,
0x77, 0x0e, 0x8e, 0xae, 0x4e, 0x9e, 0x6d, 0x6e, 0x1f, 0x9c, 0xbd, 0x81,
0x2f, 0xb5, 0x07, 0x7f, 0x72, 0x96, 0xc4, 0x58, 0x2b, 0xcd, 0x54, 0xf0,
0x72, 0x6d, 0x59, 0x97, 0x31, 0x17, 0x6a, 0x89, 0xaa, 0x7d, 0xf1, 0x96,
0x22, 0x7e, 0x1c, 0x5a, 0x3d, 0xb3, 0x7d, 0xbf, 0xdb, 0xe9, 0x59, 0x1b,
0x7c, 0xef, 0xb7, 0x91, 0xb1, 0x3b, 0x96, 0xdb, 0xf3, 0xcc, 0x61, 0xdf,
0x6e, 0x67, 0xc6, 0x7a, 0xb5, 0xb6, 0xfc, 0x39, 0xf7, 0xa1, 0x52, 0xc2,
0x25, 0x44, 0xb7, 0xa3, 0xd2, 0x00, 0x94, 0xe7, 0x1d, 0x61, 0xcc, 0x38,
0xb2, 0xf9, 0xbb, 0x0d, 0xa3, 0x04, 0xbb, 0x5f, 0x78, 0x3c, 0x3e, 0x71,
0x40, 0xc1, 0x8e, 0x3c, 0x62, 0x57, 0x80, 0x71, 0x13, 0x6c, 0xfa, 0x36,
0x00, 0x3f, 0x32, 0x64, 0x11, 0x03, 0x0e, 0x1c, 0xd0, 0x18, 0xd0, 0xb8,
0x2c, 0x8d, 0x4f, 0xc9, 0xa3, 0x10, 0x64, 0x23, 0x6f, 0x33, 0x76, 0x5e,
0xc8, 0xda, 0xe2, 0xf1, 0x00, 0xdc, 0xfc, 0x46, 0x28, 0xc9, 0xe0, 0x58,
0xb4, 0x71, 0x68, 0xaf, 0x3d, 0x28, 0xb2, 0x17, 0x26, 0xec, 0x53, 0xf0,
0x40, 0xe3, 0x78, 0x58, 0x19, 0x12, 0xa5, 0xaa, 0x42, 0x57, 0x24, 0xf2,
0x68, 0xe0, 0x7a, 0x0a, 0xb1, 0xb3, 0x56, 0xcc, 0x43, 0xb1, 0xa7, 0xa0,
0x49, 0xc5, 0x1f, 0xab, 0xdf, 0xe4, 0x11, 0x18, 0xc8, 0x41, 0xec, 0x2c,
0x95, 0x9b, 0x4e, 0xdb, 0x1a, 0x6c, 0x4a, 0xc5, 0xb2, 0x2a, 0x5c, 0xea,
0x1a, 0x78, 0xf5, 0xe3, 0x94, 0x30, 0x10, 0x0f, 0x4c, 0x5c, 0x68, 0xdf,
0x86, 0xfe, 0x58, 0x21, 0x12, 0x6c, 0xc5, 0x29, 0x2d, 0x6a, 0x75, 0x8c,
0x1d, 0x3c, 0x77, 0x76, 0xdc, 0x5b, 0x7e, 0x10, 0x99, 0x2a, 0x66, 0x32,
0x11, 0x49, 0xb4, 0x94, 0xb6, 0x69, 0x6d, 0x67, 0x61, 0xa5, 0x62, 0x8d,
0x17, 0xdf, 0x0d, 0x97, 0x07, 0x46, 0x76, 0x22, 0x0f, 0xc6, 0x1a, 0x8d,
0xb0, 0x18, 0x93, 0x6e, 0xcb, 0xa8, 0x17, 0x8b, 0x3f, 0x5e, 0x32, 0x39,
0x95, 0x31, 0xf1, 0xa7, 0x01, 0x22, 0x47, 0x6a, 0x75, 0xc7, 0x45, 0x27,
0x74, 0xd0, 0xd6, 0x7c, 0x36, 0xea, 0xc6, 0xfc, 0xc4, 0x52, 0xcd, 0x29,
0x68, 0xb9, 0x56, 0xb3, 0xd6, 0x8b, 0x0a, 0xa7, 0xf6, 0x04, 0xa3, 0xd9,
0x85, 0x9f, 0x84, 0xd0, 0x94, 0xd4, 0xbd, 0xf6, 0x23, 0x97, 0x0e, 0x65,
0x57, 0xcd, 0xd0, 0x15, 0x61, 0x0b, 0xbf, 0xd3, 0xbe, 0x90, 0x9c, 0x02,
0x26, 0xf7, 0xc7, 0xa7, 0x74, 0x82, 0x2a, 0xf5, 0xc7, 0xa4, 0x5f, 0x60,
0x62, 0xc5, 0x21, 0x0a, 0x7f, 0x80, 0x7a, 0x16, 0x2b, 0xea, 0x41, 0xdd,
0x8a, 0xa2, 0xaa, 0x0f, 0xff, 0xff, 0xb9, 0xe5, 0xbb, 0x9f, 0x5b, 0x48,
0x88, 0x2c, 0xda, 0x29, 0x72, 0x34, 0xaf, 0xc9, 0x92, 0x9a, 0x62, 0x70,
0x84, 0x7b, 0xa6, 0xca, 0xc8, 0x45, 0x60, 0xa3, 0xae, 0xd4, 0x3f, 0xf3,
0x82, 0x5f, 0xe2, 0x39, 0x40, 0xb0, 0x4c, 0x87, 0xee, 0x2d, 0xf5, 0x6a,
0xd8, 0x41, 0x44, 0xe4, 0xb9, 0x23, 0xdc, 0xce, 0x69, 0xb9, 0x77, 0x08,
0x0a, 0xeb, 0xa6, 0x58, 0x3a, 0x06, 0x62, 0x60, 0x11, 0x9f, 0xc5, 0x9c,
0xa4, 0x25, 0x8b, 0x4e, 0x30, 0xe9, 0xf0, 0x0f, 0x99, 0xff, 0xe7, 0xd7,
0xff, 0xef, 0x4c, 0xe3, 0x22, 0x0c, 0x64, 0x71, 0xdb, 0x58, 0xd1, 0xfb,
0x8d, 0xea, 0xf8, 0x52, 0x87, 0x9c, 0x9f, 0x88, 0x72, 0x96, 0x59, 0x4e,
0x89, 0xe6, 0xfc, 0x64, 0x94, 0x53, 0x67, 0x39, 0x65, 0x9a, 0xf3, 0x53,
0x51, 0x4e, 0x8d, 0xe5, 0x54, 0x68, 0xce, 0x4f, 0x47, 0x39, 0x55, 0xb9,
0x9e, 0x9f, 0x89, 0x72, 0x2a, 0x2c, 0xa7, 0x46, 0x73, 0x7e, 0x36, 0xca,
0x29, 0xb3, 0x9c, 0x3a, 0xcd, 0xf9, 0xb9, 0x28, 0xa7, 0xc4, 0x72, 0x96,
0x69, 0xce, 0xcf, 0x27, 0xdb, 0xb3, 0x42, 0x73, 0x7e, 0x41, 0xce, 0x59,
0x8e, 0x72, 0x7e, 0x51, 0xce, 0xa9, 0x47, 0x39, 0xbf, 0x24, 0xe7, 0xd4,
0xa2, 0x9c, 0x7f, 0x2e, 0xe7, 0x54, 0xa3, 0x9c, 0x5f, 0x96, 0x73, 0x2a,
0x51, 0xce, 0xbf, 0x90, 0x73, 0xca, 0x51, 0xce, 0xbf, 0x94, 0x73, 0x4a,
0x51, 0xce, 0xbf, 0xa2, 0x39, 0xd5, 0x64, 0x3d, 0x3f, 0x4c, 0xb6, 0x94,
0xf5, 0xcf, 0x37, 0x34, 0x67, 0x39, 0x89, 0xed, 0xd7, 0xe5, 0x5e, 0xa8,
0x46, 0xbd, 0xf0, 0x1b, 0x51, 0x3d, 0xb1, 0x9c, 0xdf, 0x4c, 0xb6, 0x94,
0xe5, 0xfc, 0x96, 0x8a, 0x07, 0xba, 0xba, 0x97, 0x7f, 0x5b, 0x85, 0x45,
0x57, 0xd7, 0xf8, 0x3b, 0x69, 0x78, 0xab, 0x49, 0x1a, 0x7e, 0x57, 0x25,
0xbf, 0x71, 0x58, 0xd6, 0xfa, 0xdf, 0x4b, 0xf2, 0x92, 0x61, 0xf9, 0xd7,
0xaa, 0x1c, 0x5d, 0xcd, 0xa9, 0xdf, 0x57, 0xf5, 0x88, 0xb2, 0xd5, 0xff,
0xef, 0xef, 0xff, 0xc1, 0x1f, 0x51, 0xe0, 0x52, 0xbc, 0x2b, 0x20, 0xeb,
0x8f, 0x69, 0x56, 0x59, 0x91, 0xf5, 0x27, 0x34, 0xab, 0xa2, 0xc8, 0xfa,
0x53, 0xb9, 0x76, 0x31, 0xeb, 0xcf, 0x68, 0x56, 0x4d, 0x91, 0xf5, 0xe7,
0x34, 0xab, 0xae, 0xc8, 0xfa, 0x8b, 0xe4, 0x50, 0x2a, 0xb1, 0xac, 0xbf,
0x4c, 0x8e, 0x3f, 0x9e, 0xf5, 0x57, 0xc9, 0x41, 0xcb, 0xb3, 0xfe, 0x3a,
0x39, 0xd2, 0x79, 0xd6, 0xdf, 0x24, 0xd5, 0x03, 0xcf, 0xfa, 0xdb, 0xa4,
0x4e, 0xe1, 0x59, 0x7f, 0xa7, 0x1a, 0x1c, 0x9c, 0xe1, 0xcb, 0x31, 0xe0,
0xbf, 0x9f, 0x04, 0x5c, 0x8c, 0x01, 0xff, 0x83, 0x6a, 0xa0, 0xa4, 0x01,
0xff, 0xe3, 0x24, 0xe0, 0x18, 0x19, 0x7f, 0xa8, 0x50, 0xab, 0xa5, 0x54,
0xe0, 0x9f, 0x98, 0x04, 0x5c, 0x4e, 0xa4, 0x54, 0xa7, 0x22, 0xfc, 0xc9,
0x24, 0xc2, 0x32, 0xcb, 0xfa, 0xa9, 0x64, 0x56, 0x85, 0x65, 0xfd, 0x74,
0x32, 0xab, 0xc6, 0xb2, 0x7e, 0x26, 0x99, 0x55, 0x67, 0x59, 0x3f, 0x9b,
0xcc, 0x5a, 0x66, 0x59, 0x3f, 0x27, 0x4b, 0x5d, 0x39, 0x92, 0xba, 0x3f,
0xfc, 0x79, 0x59, 0x56, 0x2b, 0x42, 0xd6, 0x2f, 0xc8, 0xc2, 0x5f, 0x13,
0xb2, 0x7e, 0x51, 0x1e, 0x32, 0x75, 0x21, 0xeb, 0x97, 0xe4, 0x81, 0xb6,
0x2c, 0x64, 0x7d, 0x93, 0x54, 0xbb, 0x65, 0x49, 0x45, 0x44, 0x29, 0x65,
0xc6, 0xf0, 0x28, 0xa5, 0x9e, 0x48, 0xe1, 0x5d, 0x20, 0xe3, 0xa9, 0x26,
0xf0, 0xd4, 0x13, 0x78, 0xa2, 0x14, 0x4a, 0xd8, 0xaf, 0xcb, 0xcd, 0x91,
0x81, 0x8b, 0x89, 0x4a, 0xcb, 0x89, 0x4a, 0xcb, 0x89, 0x4a, 0xab, 0x09,
0x3c, 0xd5, 0x04, 0x9e, 0x7a, 0x02, 0x4f, 0x9c, 0xb0, 0xdf, 0x48, 0x0e,
0x7c, 0xb9, 0x38, 0x93, 0xa8, 0x71, 0xf8, 0xe6, 0x3b, 0x9a, 0x12, 0xbf,
0x02, 0xa5, 0x2e, 0x4a, 0x3a, 0xbe, 0x91, 0x5d, 0xbc, 0xd4, 0x2f, 0x8a,
0xd2, 0xaf, 0x92, 0x94, 0x46, 0x14, 0xe9, 0xaf, 0x32, 0x78, 0x9a, 0x4e,
0xfe, 0x2d, 0xb1, 0xdf, 0x24, 0xff, 0xd7, 0x30, 0x9f, 0xa6, 0x95, 0xd8,
0xbf, 0x45, 0xf6, 0x1b, 0x6a, 0x4e, 0x33, 0x8f, 0x80, 0x92, 0x1f, 0xc2,
0xe8, 0x7b, 0x28, 0x35, 0x32, 0x47, 0x45, 0xbd, 0x50, 0x9b, 0x3b, 0x2c,
0xc1, 0xbf, 0x99, 0x31, 0x60, 0xfc, 0x21, 0x0c, 0xb4, 0x87, 0x8a, 0x22,
0xfd, 0x27, 0x19, 0x7c, 0xa1, 0xa6, 0x17, 0xe7, 0x0e, 0xe1, 0xdf, 0x12,
0x4d, 0xff, 0x29, 0x06, 0x1f, 0x4f, 0xff, 0xe7, 0x1c, 0x3f, 0x26, 0x91,
0x0c, 0x19, 0xdf, 0xbf, 0xe4, 0xf5, 0xa4, 0xe4, 0xff, 0x2b, 0x89, 0x3e,
0x96, 0x1d, 0xa1, 0xff, 0x35, 0x89, 0xcc, 0x44, 0xf6, 0x0f, 0xe3, 0xd4,
0xca, 0xc8, 0x7f, 0x23, 0x4e, 0xb4, 0x9c, 0xfd, 0x9b, 0xaa, 0xd2, 0xc5,
0x30, 0xfb, 0x77, 0x54, 0xa5, 0xa3, 0xec, 0xdf, 0x4d, 0x70, 0x6a, 0xee,
0x28, 0x51, 0xc5, 0xbf, 0x4f, 0xb0, 0x4d, 0x01, 0xf4, 0x1f, 0xd2, 0x31,
0x45, 0xd5, 0xfd, 0xf7, 0x74, 0x4c, 0x11, 0xd0, 0xff, 0x48, 0xf4, 0x76,
0x08, 0x14, 0x31, 0xed, 0x4f, 0x13, 0x5d, 0xaf, 0x00, 0xfa, 0xb3, 0x89,
0x98, 0x8a, 0x14, 0xe8, 0x6f, 0x27, 0x62, 0x62, 0x40, 0x7f, 0xa7, 0xc6,
0x24, 0x4a, 0xd1, 0x37, 0xbf, 0xa4, 0x46, 0x24, 0xc1, 0xfc, 0x59, 0xc4,
0x25, 0xa9, 0xd1, 0xdf, 0xfc, 0x55, 0xc4, 0x19, 0x39, 0xe3, 0xcf, 0xe5,
0x12, 0x21, 0x49, 0xdf, 0xfc, 0xb5, 0x5c, 0x22, 0xca, 0xf8, 0x0b, 0xb9,
0x44, 0xd8, 0x45, 0xdf, 0xfc, 0x8d, 0x5c, 0x22, 0xca, 0xf8, 0xcb, 0x44,
0x1d, 0x8c, 0xdc, 0xbf, 0x4d, 0xd4, 0xc1, 0x32, 0xa8, 0xc4, 0xb3, 0xed,
0xed, 0xaf, 0xa0, 0xc9, 0x5f, 0x3c, 0x14, 0x6a, 0xf9, 0x60, 0x8c, 0x58,
0xf9, 0x4f, 0x96, 0x9a, 0x8b, 0x52, 0xe1, 0xe7, 0x57, 0xa4, 0xf8, 0xaf,
0xc8, 0xc5, 0x49, 0x09, 0x6b, 0x8c, 0xac, 0xe2, 0x3f, 0x41, 0x30, 0x48,
0x89, 0x28, 0x15, 0x7f, 0x96, 0x68, 0xf1, 0x5f, 0x95, 0x8b, 0x87, 0xa3,
0x52, 0x45, 0x04, 0x4b, 0x56, 0x51, 0xf1, 0x6b, 0x6a, 0x2a, 0x4a, 0x11,
0x15, 0x51, 0x47, 0x72, 0x0a, 0x30, 0x25, 0x46, 0xcd, 0x0f, 0x65, 0x34,
0x51, 0xdd, 0x21, 0x9a, 0x44, 0x02, 0xb4, 0xae, 0x14, 0x91, 0xc5, 0xf1,
0x25, 0x12, 0x58, 0x05, 0xdf, 0xa4, 0x32, 0x5b, 0x6c, 0x33, 0x1d, 0x4d,
0x02, 0xcf, 0xa3, 0x96, 0x53, 0x34, 0xbf, 0x9e, 0x6c, 0x6e, 0x2e, 0x6a,
0x2e, 0x6f, 0x5c, 0x31, 0x6c, 0x6e, 0x5e, 0x68, 0x6e, 0x3e, 0xa2, 0xe6,
0x37, 0x54, 0xd4, 0xe4, 0xe2, 0xcd, 0xcd, 0xc5, 0x9a, 0x5b, 0x94, 0x99,
0x90, 0x8b, 0x73, 0x45, 0x68, 0xee, 0x6f, 0x26, 0x7a, 0xb7, 0x28, 0x36,
0x46, 0xe8, 0xc6, 0xb0, 0x77, 0xe5, 0x4e, 0xa7, 0x68, 0x7e, 0x2b, 0xde,
0x2d, 0x62, 0x5b, 0xc4, 0xdf, 0x45, 0x75, 0xef, 0x16, 0x29, 0x9a, 0xdf,
0x9e, 0xd8, 0xbb, 0xca, 0x76, 0x14, 0x13, 0xbd, 0xab, 0xe4, 0x0a, 0xab,
0xe0, 0x77, 0x52, 0xf9, 0x29, 0xb6, 0x99, 0x70, 0x41, 0xdd, 0xf5, 0x14,
0xcd, 0xef, 0xc6, 0xd1, 0x88, 0x6d, 0x91, 0xda, 0xa5, 0xee, 0x5d, 0x46,
0xcd, 0xef, 0xa5, 0xca, 0x5a, 0xaa, 0x30, 0x17, 0xe7, 0xe2, 0x42, 0xa0,
0x14, 0x66, 0x56, 0xc1, 0xbf, 0x4e, 0xe9, 0xdd, 0x52, 0x4a, 0x67, 0x4e,
0x1c, 0xc1, 0xbf, 0xff, 0xa9, 0x7a, 0x44, 0xee, 0x72, 0x94, 0x0d, 0x8a,
0xf0, 0xdf, 0xcc, 0x82, 0x70, 0xa6, 0xa1, 0x3b, 0x37, 0x9b, 0xa8, 0xd0,
0x6a, 0xff, 0x6d, 0x3a, 0x53, 0xd4, 0xa3, 0x7d, 0xd2, 0x38, 0xff, 0x77,
0x69, 0x92, 0xc0, 0xba, 0xfc, 0xa3, 0xd5, 0xed, 0xbf, 0x57, 0x2b, 0x0e,
0x99, 0x9f, 0x9f, 0xa6, 0x07, 0xd4, 0x02, 0x45, 0xab, 0xfd, 0x0f, 0x9f,
0x3a, 0xc7, 0xc8, 0x22, 0x83, 0x6c, 0xa4, 0x08, 0xff, 0xa3, 0x8a, 0x31,
0xa5, 0x74, 0x7d, 0x37, 0x51, 0xeb, 0xff, 0xa7, 0x8f, 0xa4, 0x6e, 0x12,
0x53, 0x3e, 0x62, 0x2e, 0xf8, 0xcf, 0x13, 0x94, 0xa3, 0x50, 0xe5, 0xec,
0x53, 0xf1, 0x7f, 0xf9, 0x38, 0xa6, 0x4c, 0x56, 0x96, 0xff, 0x35, 0x55,
0x97, 0x09, 0x9d, 0x33, 0xa3, 0x4e, 0xf9, 0x88, 0xe1, 0xf3, 0xdf, 0x66,
0x1a, 0x3e, 0x33, 0xb1, 0xe3, 0xbf, 0x4f, 0x67, 0xc7, 0xac, 0xc3, 0xe6,
0x7f, 0x7c, 0xd2, 0x44, 0x39, 0xa3, 0x72, 0xf9, 0xf6, 0x99, 0xf8, 0xc7,
0xcc, 0x08, 0x2c, 0x61, 0x53, 0x8a, 0xdc, 0xd0, 0xfb, 0x93, 0xd0, 0xf0,
0x2d, 0x22, 0x1f, 0x58, 0xea, 0x9f, 0xc6, 0x60, 0xe7, 0x62, 0xf9, 0xdc,
0x5c, 0x16, 0xad, 0x59, 0x5d, 0x69, 0x7a, 0xfe, 0xbd, 0xc2, 0xbc, 0xd5,
0x95, 0x26, 0xe7, 0x3f, 0x28, 0xcc, 0x5a, 0x5d, 0x69, 0x32, 0xff, 0xa3,
0xc2, 0x9c, 0xd5, 0x55, 0xa6, 0xf2, 0x0f, 0x7f, 0x79, 0x0a, 0x64, 0xb4,
0xbc, 0xf9, 0x17, 0x53, 0x6a, 0x8f, 0x16, 0x1d, 0xbf, 0x32, 0x05, 0x67,
0xb4, 0xd0, 0xf9, 0xd5, 0x29, 0x5c, 0x8a, 0x70, 0x7e, 0x33, 0x85, 0x4b,
0x11, 0x9d, 0xbf, 0x3e, 0x9d, 0x4e, 0xd6, 0xf6, 0xdf, 0x9a, 0x82, 0x33,
0xa2, 0xf3, 0xb7, 0xa7, 0xd3, 0xc9, 0x70, 0xfe, 0x5e, 0x72, 0xe1, 0xad,
0x26, 0xf3, 0x5f, 0xa7, 0xaf, 0xb8, 0xd5, 0x98, 0x7f, 0x3f, 0x75, 0x91,
0xac, 0xe6, 0xd8, 0xbf, 0x99, 0xc0, 0x07, 0x69, 0xed, 0xff, 0x6f, 0x27,
0x74, 0x97, 0x6a, 0xbd, 0xfd, 0xef, 0xd2, 0xd8, 0x96, 0xb6, 0x39, 0xf0,
0x1f, 0x27, 0xf3, 0x24, 0x62, 0xf3, 0x7f, 0x4a, 0xdd, 0x45, 0x50, 0xb3,
0xe4, 0x3f, 0xa7, 0xae, 0xfc, 0xd5, 0x2c, 0xf9, 0x2f, 0x13, 0xba, 0x51,
0x62, 0xc9, 0x7f, 0x9d, 0x89, 0x25, 0x11, 0xe1, 0xff, 0x2d, 0x95, 0x25,
0x89, 0x96, 0x10, 0xf8, 0x3f, 0x98, 0xad, 0xf3, 0xa3, 0x0a, 0xfe, 0x70,
0x26, 0xce, 0x44, 0x2c, 0xff, 0x9f, 0x69, 0x0d, 0x88, 0x6f, 0x14, 0xfd,
0x51, 0x72, 0x63, 0x49, 0xcd, 0xbb, 0x3f, 0x4e, 0x13, 0xa7, 0x94, 0x26,
0xfe, 0x49, 0x1a, 0xaf, 0xd3, 0xa4, 0xe4, 0xcf, 0x67, 0x92, 0xef, 0x88,
0x25, 0x7f, 0x31, 0x53, 0xe7, 0x47, 0xf8, 0x93, 0x4b, 0xfc, 0xa2, 0x9a,
0x25, 0x7f, 0x35, 0x95, 0x25, 0x4c, 0xfc, 0xfe, 0x7a, 0xea, 0x08, 0x93,
0x29, 0xfe, 0x9b, 0xa9, 0xe2, 0x27, 0x13, 0xf2, 0xf7, 0x89, 0x71, 0x33,
0xa7, 0xac, 0x4b, 0xae, 0xe5, 0x1f, 0xd2, 0x4b, 0x4d, 0xe0, 0xce, 0x3f,
0xa6, 0x8c, 0xd1, 0x18, 0x73, 0xbe, 0x49, 0x6e, 0x44, 0xce, 0x29, 0x47,
0x89, 0xbc, 0x21, 0xf3, 0x13, 0x49, 0xde, 0xcf, 0x4d, 0x15, 0xb9, 0x6f,
0x7e, 0x32, 0xbd, 0x23, 0xa4, 0x2d, 0xa5, 0x9f, 0x9a, 0x3e, 0x9a, 0x14,
0xdd, 0xf1, 0xcd, 0x4f, 0x4f, 0x1d, 0x53, 0x8a, 0x4e, 0xf9, 0xe6, 0x67,
0x26, 0x8b, 0xa9, 0x7a, 0x34, 0x7c, 0xf3, 0xb3, 0x93, 0x85, 0x35, 0x65,
0x4c, 0x7c, 0xf3, 0x73, 0x33, 0xcc, 0xe3, 0x73, 0x89, 0x3e, 0xfa, 0xf9,
0xe9, 0x92, 0x9e, 0xdc, 0x2a, 0xfc, 0xe6, 0x17, 0xa6, 0xcf, 0x17, 0xc9,
0xad, 0xca, 0x6f, 0x7e, 0x71, 0xba, 0x4a, 0x4d, 0x6e, 0x95, 0x7e, 0xc3,
0xb7, 0x9b, 0x0b, 0x74, 0x4f, 0xa2, 0x50, 0xa5, 0x24, 0xd5, 0xe9, 0xd7,
0x6a, 0x08, 0xf7, 0xcb, 0x7c, 0xf7, 0x6d, 0x32, 0xdc, 0x0f, 0x79, 0x57,
0x16, 0x8a, 0xf5, 0xfa, 0x32, 0xcd, 0x2c, 0xb3, 0x5f, 0x47, 0xb4, 0xd0,
0x21, 0x2d, 0x74, 0x54, 0x58, 0xae, 0x54, 0x2a, 0xac, 0x38, 0xfd, 0x45,
0x31, 0xfc, 0x0c, 0xaf, 0xe9, 0x93, 0x31, 0x84, 0x5c, 0x2f, 0x32, 0xce,
0x96, 0x29, 0x38, 0x83, 0xad, 0xd6, 0x18, 0xdb, 0x59, 0x2e, 0x43, 0xbd,
0xc2, 0x30, 0xd5, 0x42, 0x3c, 0xbf, 0x10, 0x52, 0xf2, 0x59, 0x78, 0xbe,
0x11, 0xed, 0x35, 0x26, 0x5b, 0x55, 0xda, 0x15, 0x75, 0xfa, 0xb5, 0x4a,
0xe1, 0xf8, 0xd6, 0xfe, 0x14, 0xb8, 0x1f, 0x0a, 0x22, 0x4c, 0x98, 0x44,
0x33, 0x91, 0x49, 0x14, 0xba, 0x4a, 0x13, 0xea, 0xf4, 0x0b, 0x99, 0xc4,
0x8a, 0xc3, 0x2f, 0x8a, 0xe1, 0xe7, 0x84, 0x9a, 0x3e, 0x0d, 0x83, 0x28,
0x6d, 0x45, 0x36, 0xce, 0xca, 0x14, 0x9c, 0xc1, 0x56, 0xf9, 0xe8, 0x63,
0x22, 0xce, 0x2a, 0x59, 0x65, 0xcc, 0xfd, 0x25, 0x91, 0x84, 0x4f, 0x40,
0xf0, 0xcd, 0x1f, 0x4c, 0xd8, 0x78, 0xcd, 0x05, 0x4b, 0x85, 0x52, 0x6d,
0xb1, 0x50, 0x1b, 0xcf, 0x6d, 0x27, 0x92, 0x74, 0x82, 0x54, 0x8f, 0x36,
0x5a, 0xfe, 0xf0, 0x33, 0x31, 0x15, 0x43, 0x4c, 0xff, 0x73, 0xe2, 0x8a,
0x38, 0x81, 0x29, 0x9f, 0x8e, 0xe9, 0x8f, 0x3e, 0x13, 0x13, 0x6d, 0x1d,
0x3a, 0xd2, 0x2b, 0x1d, 0x80, 0x1e, 0x32, 0xff, 0xeb, 0x27, 0xb1, 0x8a,
0x4e, 0xb4, 0x9c, 0xa2, 0x4a, 0x03, 0xb4, 0x5a, 0x70, 0x3f, 0xb4, 0x1a,
0x45, 0x9d, 0x5c, 0x15, 0x78, 0x66, 0x76, 0x3a, 0x78, 0xa9, 0xa7, 0x0c,
0x44, 0xfd, 0xaf, 0x9f, 0xfc, 0x63, 0x56, 0x22, 0x5f, 0xd2, 0xf3, 0xa1,
0xfe, 0x3a, 0x84, 0xaf, 0x12, 0xea, 0x1a, 0x52, 0xae, 0xa4, 0xe3, 0x03,
0xc3, 0xbc, 0x58, 0x49, 0xc6, 0x52, 0x22, 0x58, 0xfe, 0x84, 0x61, 0x61,
0x0b, 0x36, 0x8a, 0x28, 0xaa, 0x57, 0x2c, 0x4f, 0xab, 0xfd, 0x53, 0x56,
0xa0, 0x4c, 0x6b, 0xa5, 0x45, 0xca, 0x1f, 0x57, 0xe9, 0x9f, 0x89, 0x8d,
0xc5, 0x55, 0xe2, 0x36, 0x68, 0xfa, 0x1a, 0x20, 0xc1, 0xd3, 0xc3, 0xc2,
0xf2, 0x72, 0x9d, 0x70, 0x6c, 0x6e, 0x1b, 0xbf, 0xca, 0xe5, 0xaa, 0x4e,
0x73, 0xc9, 0x89, 0xa2, 0x9a, 0x23, 0x14, 0xed, 0x9f, 0x33, 0xb4, 0xa0,
0x1a, 0x00, 0x65, 0xa1, 0x5a, 0x46, 0x8c, 0xa8, 0x02, 0x56, 0xca, 0xa0,
0xa3, 0x96, 0x89, 0x2e, 0xd8, 0xc6, 0xef, 0xd2, 0x32, 0xe2, 0xc4, 0x7c,
0x20, 0xbf, 0x1c, 0x22, 0x55, 0xd2, 0xfa, 0x17, 0x22, 0x83, 0x4a, 0x94,
0xd6, 0x6a, 0x75, 0x45, 0x27, 0xe7, 0x9f, 0x84, 0x56, 0xc2, 0x82, 0xed,
0x62, 0x48, 0x2b, 0xe6, 0x92, 0x73, 0x50, 0x25, 0x17, 0x29, 0xd6, 0xbf,
0xe4, 0xa4, 0xae, 0xb0, 0xd6, 0x2f, 0x13, 0x8c, 0xa8, 0xd4, 0x08, 0xb1,
0xe5, 0x32, 0x45, 0x8a, 0xd4, 0x31, 0x72, 0x11, 0x04, 0x2b, 0x59, 0x11,
0xe8, 0x4d, 0x22, 0xfe, 0x2b, 0x2e, 0x15, 0x20, 0x76, 0x54, 0x2c, 0x50,
0xfe, 0x88, 0x64, 0xd0, 0x1f, 0x9c, 0x28, 0x02, 0xfd, 0xd7, 0x29, 0xd0,
0xb3, 0x77, 0xe5, 0xdf, 0x70, 0xf6, 0x70, 0x0c, 0x79, 0x5e, 0x5f, 0x49,
0x51, 0xdf, 0xdf, 0xa5, 0x42, 0x33, 0x0a, 0x24, 0xe8, 0xbf, 0x4f, 0x81,
0x9e, 0x9d, 0xba, 0x7f, 0x48, 0xe5, 0x46, 0x29, 0x56, 0x5f, 0xda, 0xe0,
0xbc, 0x00, 0x2c, 0x7f, 0x9b, 0xb9, 0x4c, 0xf1, 0xdd, 0xbb, 0x20, 0x54,
0x5e, 0x4e, 0x28, 0xfb, 0x8f, 0x13, 0xcb, 0xfe, 0x35, 0x29, 0x9b, 0xf4,
0x14, 0x14, 0x2e, 0x8f, 0xd9, 0x34, 0x88, 0x2c, 0x5e, 0xb0, 0xc5, 0xc0,
0x4e, 0xf4, 0x1c, 0xbe, 0x9b, 0xee, 0x1c, 0x78, 0x61, 0x93, 0x4b, 0xc0,
0x5d, 0xee, 0x2e, 0x1d, 0xbb, 0xf4, 0xc9, 0x82, 0x5b, 0xf1, 0xfb, 0x68,
0xae, 0x51, 0x6c, 0xba, 0x61, 0x74, 0xc9, 0xa6, 0x1b, 0x5d, 0xa2, 0x35,
0x8d, 0xe0, 0xc2, 0xbd, 0xd4, 0xfb, 0x86, 0xb7, 0xb4, 0xa2, 0x0f, 0x0c,
0x67, 0x69, 0xa5, 0x69, 0x91, 0xc8, 0x75, 0xf8, 0x32, 0x50, 0xd6, 0xce,
0x99, 0x85, 0xbb, 0xc5, 0xbe, 0xee, 0xc3, 0xdf, 0xfb, 0xc5, 0x81, 0x6e,
0x16, 0x6e, 0xe1, 0xcb, 0x2c, 0xf4, 0x17, 0x07, 0xda, 0x78, 0x0c, 0x75,
0x75, 0x39, 0xd9, 0x9a, 0x1e, 0x86, 0xd2, 0xec, 0x19, 0x1e, 0xa3, 0xae,
0x97, 0x42, 0x9d, 0x47, 0x2f, 0xa4, 0x22, 0x65, 0x7d, 0xc3, 0x61, 0x8f,
0x15, 0x36, 0xfb, 0x8f, 0x8f, 0xd9, 0x3e, 0x09, 0xbd, 0x79, 0x64, 0x0e,
0xf1, 0x2a, 0x2e, 0x26, 0xeb, 0x7d, 0x8d, 0x47, 0x8f, 0xc5, 0x60, 0x81,
0x61, 0x4c, 0x3d, 0x44, 0x9f, 0xf1, 0x49, 0xd4, 0xcd, 0xcc, 0xbc, 0x81,
0xbd, 0xeb, 0x76, 0xe7, 0x06, 0x5a, 0xd0, 0xf7, 0xdc, 0xdb, 0x39, 0xc4,
0xb1, 0xeb, 0x79, 0xd0, 0xf8, 0xaf, 0xce, 0x1d, 0xeb, 0x6e, 0x48, 0xa2,
0x1b, 0xcd, 0x85, 0x65, 0xe7, 0x10, 0x7c, 0x2e, 0xf3, 0xc5, 0xc3, 0x60,
0x9c, 0xf9, 0x8a, 0x87, 0x48, 0xec, 0x13, 0x32, 0x06, 0xc4, 0x55, 0x7d,
0xbe, 0x2d, 0x44, 0xc2, 0xbc, 0x28, 0xf2, 0xd7, 0x75, 0x30, 0x44, 0x3a,
0xff, 0xe9, 0x18, 0xe1, 0xb3, 0xd8, 0x78, 0x41, 0xd8, 0xdb, 0x61, 0x37,
0xa4, 0x0b, 0x6d, 0x0c, 0xeb, 0x62, 0xb1, 0x0e, 0xcb, 0x66, 0x28, 0x4c,
0x46, 0x6b, 0x3a, 0xec, 0xf5, 0x34, 0x1b, 0x5a, 0xc6, 0xde, 0xdb, 0xf6,
0x58, 0xc3, 0x5c, 0x83, 0x3c, 0x19, 0x42, 0x68, 0x3f, 0xe8, 0xee, 0x99,
0x03, 0xff, 0x5e, 0xcb, 0x3a, 0x34, 0x02, 0x8c, 0x83, 0x91, 0x86, 0xb3,
0x99, 0x72, 0x27, 0xa3, 0x61, 0x94, 0x41, 0x6c, 0xd9, 0xc1, 0xb5, 0xd9,
0x23, 0xc1, 0x24, 0xb3, 0xc0, 0x49, 0x4a, 0x3e, 0x91, 0x1a, 0xbd, 0x8b,
0xb4, 0x0f, 0x68, 0x2c, 0x69, 0xff, 0x95, 0x1d, 0xf4, 0xb3, 0x99, 0xef,
0x41, 0xb1, 0x8e, 0x31, 0x34, 0x3d, 0xdf, 0x3a, 0xc0, 0x20, 0xa2, 0xec,
0xea, 0x6a, 0x49, 0xaf, 0x68, 0x7a, 0xa9, 0xae, 0xe9, 0x57, 0xc9, 0xbc,
0x8a, 0x5e, 0xa3, 0x79, 0xa3, 0x64, 0x5e, 0x4d, 0x5f, 0xa6, 0x79, 0x5d,
0x63, 0xc0, 0x83, 0xaa, 0x2e, 0x2f, 0x2c, 0x24, 0xe0, 0x96, 0xf5, 0x55,
0x02, 0xf7, 0xf8, 0x58, 0x0a, 0x63, 0xc1, 0xcc, 0xcb, 0x94, 0xe1, 0x9d,
0x33, 0x20, 0x6e, 0xb6, 0x0e, 0x23, 0x57, 0xd6, 0xe6, 0x40, 0x9a, 0xaf,
0xcd, 0x80, 0x75, 0xdc, 0xdc, 0x6d, 0xdf, 0x72, 0xe6, 0x3a, 0xd4, 0x61,
0x64, 0x6e, 0x68, 0xe2, 0xad, 0x44, 0x67, 0xae, 0x87, 0xd7, 0x1a, 0xa1,
0x4f, 0x2f, 0x18, 0x47, 0x2e, 0x81, 0x4e, 0x7f, 0xd4, 0xa2, 0x82, 0x02,
0xe4, 0x0f, 0xc2, 0x00, 0xab, 0x1a, 0xb9, 0xd0, 0x1d, 0x90, 0x80, 0x9b,
0x85, 0x6b, 0x73, 0x48, 0x5e, 0xf4, 0x21, 0x0d, 0xd9, 0x1b, 0xb8, 0x66,
0x40, 0x22, 0x1a, 0x8f, 0xe5, 0xc0, 0xb5, 0x9e, 0xf4, 0x0a, 0x93, 0x0f,
0x69, 0xfe, 0x9a, 0xdd, 0xf4, 0x21, 0xcd, 0x2c, 0x74, 0xa0, 0x3f, 0x2e,
0xaa, 0x8b, 0x59, 0x6b, 0xd1, 0xce, 0xf9, 0xda, 0xa5, 0xd1, 0xd1, 0xe3,
0x69, 0xb9, 0xd2, 0xa5, 0x71, 0x95, 0x4c, 0x2d, 0x5f, 0x1a, 0xa3, 0x64,
0x6a, 0x05, 0xd4, 0x09, 0xbe, 0xde, 0xe4, 0x5f, 0x2e, 0x66, 0xcb, 0xb5,
0xda, 0x62, 0x57, 0x6b, 0xba, 0x85, 0xe1, 0x28, 0x88, 0xfa, 0xde, 0xc4,
0x59, 0x02, 0xa3, 0x64, 0x2a, 0x64, 0xc7, 0x62, 0x52, 0xf8, 0x8c, 0x72,
0x25, 0xeb, 0x90, 0xc0, 0x94, 0x20, 0x40, 0x7d, 0x32, 0xa8, 0x30, 0xc8,
0xc2, 0x58, 0x18, 0x4b, 0x46, 0x5b, 0x17, 0xc7, 0x3c, 0x1b, 0x9e, 0x38,
0xbc, 0x7b, 0x8a, 0xe1, 0x3d, 0x4c, 0xf3, 0x64, 0x66, 0x83, 0x7e, 0x38,
0x49, 0x25, 0xe9, 0xae, 0xf6, 0x60, 0x49, 0x4f, 0x96, 0x89, 0x63, 0x3a,
0x7c, 0x58, 0xfe, 0x02, 0x2a, 0xbd, 0x84, 0x01, 0xcd, 0xfc, 0xb1, 0x61,
0x24, 0x79, 0xb6, 0xe5, 0x63, 0xcc, 0x45, 0xa2, 0x34, 0x02, 0xd0, 0x51,
0x24, 0x08, 0x25, 0x34, 0x10, 0x5f, 0x2a, 0xa3, 0x97, 0x58, 0xe9, 0xdd,
0x4e, 0x77, 0xf1, 0x78, 0x74, 0xdd, 0xb2, 0xbc, 0x42, 0x24, 0x94, 0x9a,
0x1e, 0x18, 0x19, 0x4e, 0x4d, 0xc6, 0xe0, 0xda, 0xa2, 0xbd, 0xd1, 0xce,
0x82, 0x01, 0x07, 0x76, 0x42, 0x6d, 0xc9, 0x59, 0xf4, 0xb4, 0x46, 0x5b,
0x78, 0xd9, 0x7e, 0x40, 0x5e, 0xb6, 0xe7, 0x32, 0x32, 0x07, 0x92, 0xfa,
0xc0, 0x83, 0x46, 0x0e, 0x30, 0xc2, 0x6f, 0xdb, 0x30, 0x59, 0x1c, 0x06,
0xae, 0x2c, 0xdc, 0x81, 0x55, 0xb0, 0xa8, 0x0c, 0x6f, 0xbb, 0xa3, 0x41,
0x67, 0xce, 0x71, 0x41, 0x83, 0xdb, 0x4e, 0x27, 0x14, 0x52, 0x9b, 0x5d,
0xc9, 0x43, 0x66, 0xa1, 0x30, 0xa3, 0x24, 0x07, 0x44, 0x05, 0xe1, 0xc5,
0x71, 0xdb, 0x19, 0x59, 0x63, 0x1e, 0xfa, 0x42, 0x94, 0x5a, 0x49, 0x54,
0x9b, 0x1d, 0x12, 0x88, 0xbd, 0x73, 0x51, 0x82, 0x7f, 0xdb, 0xc0, 0xda,
0x7e, 0xb6, 0x43, 0x18, 0x8b, 0x0c, 0xc6, 0x08, 0x55, 0x1a, 0x76, 0x2d,
0x65, 0x30, 0xe1, 0x4c, 0x7b, 0xe0, 0xfa, 0x16, 0xe5, 0x13, 0xd1, 0xd8,
0xc3, 0x70, 0xa2, 0x19, 0x09, 0x9d, 0x7a, 0x93, 0x36, 0x7b, 0x41, 0x9f,
0xb2, 0x4b, 0x7a, 0xf3, 0x37, 0x0b, 0x0b, 0x59, 0x75, 0x9f, 0xea, 0x03,
0xce, 0x9d, 0x36, 0xd1, 0x50, 0x58, 0x5d, 0x79, 0xa7, 0xd9, 0x2e, 0x78,
0x54, 0xa0, 0xe8, 0x6c, 0x44, 0x88, 0xb1, 0x87, 0xd9, 0x36, 0xfe, 0x12,
0xba, 0xaf, 0xc9, 0x1b, 0xed, 0x2e, 0x95, 0xca, 0x4d, 0xb1, 0x2f, 0x07,
0x8b, 0x1d, 0xa1, 0x4b, 0x5c, 0xda, 0x25, 0x1d, 0x45, 0xa7, 0xb4, 0x0d,
0x17, 0x3b, 0xe5, 0x0a, 0x3a, 0xa5, 0x4d, 0x3b, 0xe5, 0xea, 0x73, 0x3a,
0xa5, 0xad, 0xea, 0x94, 0x11, 0xc6, 0xf8, 0x4a, 0xe9, 0x94, 0x11, 0xe9,
0x94, 0x11, 0xe9, 0x94, 0x2b, 0xd2, 0x29, 0xa3, 0xa8, 0x53, 0xc0, 0x80,
0xd1, 0xb3, 0x38, 0x71, 0x84, 0x56, 0xcc, 0xc6, 0x46, 0x51, 0x5b, 0xcc,
0x76, 0x96, 0xca, 0x1a, 0x66, 0x88, 0x06, 0x4d, 0x94, 0x03, 0xfd, 0x58,
0x22, 0xd7, 0x75, 0x51, 0x5a, 0x37, 0xb2, 0xa9, 0x83, 0x46, 0x8f, 0x7a,
0x5b, 0x6b, 0xd0, 0xf4, 0x44, 0xbf, 0x03, 0x45, 0x37, 0x92, 0x7d, 0xa1,
0x63, 0x14, 0x22, 0xc6, 0x77, 0x87, 0x4f, 0xb9, 0x4d, 0xde, 0xb9, 0x73,
0x2e, 0xed, 0x5e, 0x0c, 0x8b, 0xc2, 0xc6, 0x72, 0x18, 0x8f, 0x31, 0x7c,
0xeb, 0x83, 0x44, 0x6b, 0xb5, 0xb5, 0x31, 0x37, 0x23, 0x1e, 0xb6, 0xf9,
0xca, 0x09, 0x3b, 0xf7, 0x83, 0x6d, 0xe1, 0xfb, 0x4a, 0x37, 0xd6, 0x99,
0x9b, 0x0d, 0x5f, 0x60, 0x80, 0x7f, 0xca, 0xf8, 0x4f, 0x05, 0xff, 0xa9,
0xe2, 0x3f, 0xb5, 0x4b, 0x4d, 0x3f, 0x8c, 0xca, 0x61, 0xcf, 0x8b, 0x05,
0x34, 0xfd, 0x28, 0xca, 0x24, 0x21, 0x43, 0xc4, 0xcc, 0x71, 0x44, 0x70,
0x5f, 0x92, 0x47, 0x93, 0x85, 0x07, 0x2d, 0x46, 0xe2, 0x61, 0xa9, 0x55,
0xfc, 0xe3, 0x63, 0xa8, 0x25, 0x50, 0xdf, 0x93, 0x38, 0x6f, 0xfc, 0x79,
0xc0, 0x72, 0x62, 0x6e, 0xca, 0x9c, 0xb9, 0xee, 0x5c, 0x17, 0x3e, 0x4d,
0xaf, 0x47, 0x26, 0x7b, 0x2a, 0x30, 0x82, 0x04, 0x65, 0xe2, 0xb1, 0xce,
0xdb, 0xd1, 0xfb, 0x7d, 0x46, 0x59, 0x6b, 0x83, 0x4a, 0x5f, 0x34, 0x82,
0x7c, 0x7f, 0xd1, 0xcc, 0x0f, 0x16, 0x4d, 0xdd, 0x59, 0x58, 0xc0, 0x58,
0xbc, 0x98, 0x8c, 0x51, 0x98, 0xe0, 0x8f, 0xe1, 0x66, 0x85, 0x88, 0x94,
0x98, 0x92, 0x2b, 0xd4, 0x34, 0xb4, 0x6b, 0x03, 0x1d, 0x43, 0x0d, 0x91,
0x14, 0xc3, 0xcf, 0x01, 0x06, 0xa1, 0xa6, 0x52, 0x4a, 0x4d, 0xf6, 0x47,
0xd5, 0x60, 0x0b, 0x35, 0x78, 0xfc, 0x96, 0x58, 0x1b, 0x4c, 0xe6, 0x5a,
0xfd, 0xf3, 0xae, 0xc8, 0xb8, 0x2d, 0xdf, 0x02, 0x51, 0xd8, 0x89, 0xa2,
0x13, 0xec, 0xd8, 0xc0, 0x3e, 0x5f, 0x7d, 0xc9, 0x65, 0xa5, 0x46, 0xae,
0x6b, 0x4f, 0x2c, 0x24, 0xab, 0x21, 0x3a, 0x29, 0x78, 0x44, 0x8e, 0x83,
0xc2, 0x29, 0x09, 0xc4, 0x7f, 0x42, 0x8b, 0x7b, 0xd9, 0x6c, 0x00, 0x44,
0x73, 0xec, 0x41, 0x01, 0xc7, 0x3e, 0x49, 0x83, 0x81, 0x05, 0xdd, 0x68,
0xe1, 0x25, 0x7f, 0x8b, 0xf6, 0xfc, 0xbc, 0x2f, 0x3c, 0xb9, 0x33, 0x9f,
0xcd, 0x08, 0xd1, 0x14, 0xb6, 0x69, 0x2c, 0xf5, 0x2d, 0xf7, 0x0e, 0xe3,
0x17, 0x64, 0x6c, 0x67, 0xce, 0x0f, 0x23, 0xec, 0x78, 0x1b, 0x18, 0x40,
0x06, 0x6a, 0x70, 0x50, 0xd9, 0xd1, 0xc7, 0xb5, 0xb3, 0xfc, 0x9e, 0xb6,
0x16, 0x0e, 0x32, 0xbf, 0x90, 0x8a, 0x0f, 0x2d, 0x4c, 0xdb, 0x21, 0x51,
0x50, 0x31, 0x5c, 0x86, 0x3b, 0x0d, 0x96, 0x2c, 0x09, 0xf0, 0xa3, 0xe9,
0x60, 0x48, 0x7b, 0x17, 0xff, 0xb1, 0x31, 0xa4, 0x34, 0x46, 0x16, 0x6b,
0xc2, 0x32, 0xe3, 0xc1, 0xe3, 0xec, 0x03, 0x06, 0x3d, 0xc0, 0x64, 0xdd,
0xb8, 0x60, 0xad, 0xc9, 0x0f, 0x11, 0x65, 0x9e, 0xc5, 0x86, 0xcf, 0x43,
0x56, 0xe6, 0x72, 0x0c, 0x83, 0xd8, 0x0c, 0xda, 0x7d, 0x28, 0x25, 0x35,
0xc4, 0x8b, 0x9e, 0x25, 0xc4, 0x86, 0x52, 0x3b, 0xc3, 0xdd, 0x21, 0x97,
0xaf, 0x4d, 0x7c, 0x0e, 0x9a, 0x5e, 0xc5, 0x8b, 0xb5, 0x5f, 0xc3, 0x9b,
0xff, 0x15, 0xe1, 0x2d, 0xd0, 0x70, 0x90, 0xda, 0x42, 0x2c, 0x81, 0xda,
0x72, 0xad, 0xb8, 0xb2, 0x66, 0x60, 0x28, 0x88, 0x35, 0x03, 0x3e, 0x6a,
0x2b, 0xe3, 0x10, 0xce, 0x17, 0xe0, 0xac, 0x75, 0xa3, 0x54, 0x5e, 0xa9,
0x95, 0xca, 0x04, 0x10, 0x7f, 0xae, 0x96, 0x1e, 0x1f, 0x49, 0xea, 0xf2,
0x72, 0xb5, 0x1a, 0xa6, 0x96, 0x78, 0xea, 0x4a, 0xbd, 0x5a, 0xe4, 0xa9,
0xcb, 0xf5, 0x65, 0x92, 0xba, 0x8a, 0x01, 0xc7, 0x30, 0x6d, 0x75, 0x75,
0xa5, 0x42, 0x53, 0x56, 0x57, 0x58, 0xd9, 0x62, 0x69, 0xb9, 0x46, 0x92,
0xea, 0xb5, 0x62, 0x99, 0xa6, 0xc1, 0xaf, 0xca, 0x2a, 0x43, 0xb7, 0x5a,
0x5e, 0xe1, 0xe8, 0x56, 0x6b, 0x95, 0x1a, 0xaf, 0xba, 0x5a, 0xe7, 0x04,
0x2d, 0x57, 0x57, 0x96, 0xc7, 0x9f, 0x30, 0x26, 0xda, 0xee, 0x35, 0x98,
0x73, 0xd6, 0x31, 0x58, 0xf7, 0x2f, 0x4d, 0xcf, 0x36, 0x9d, 0xe0, 0xa4,
0xdb, 0x05, 0xe3, 0xcc, 0xe0, 0x2b, 0x08, 0x1a, 0xa6, 0x55, 0x90, 0xf9,
0x60, 0x52, 0xc4, 0x48, 0x1e, 0xf9, 0x02, 0x84, 0xbf, 0x6d, 0x0e, 0x30,
0x56, 0x07, 0x46, 0x73, 0xd8, 0xbd, 0x76, 0xdf, 0xd9, 0xe4, 0x17, 0xde,
0x97, 0xf3, 0x6c, 0xb4, 0xaa, 0x9f, 0xf1, 0x59, 0x9e, 0x20, 0x22, 0x99,
0x89, 0x24, 0xd1, 0x9a, 0x8c, 0x02, 0x0e, 0x48, 0xa9, 0x62, 0x7c, 0x08,
0x1c, 0x2e, 0x56, 0x52, 0x5b, 0x92, 0xf6, 0xce, 0x5d, 0x8f, 0x50, 0xfc,
0x61, 0xd6, 0x6d, 0x59, 0x73, 0x5d, 0x2c, 0x9a, 0x09, 0x6f, 0xa0, 0x5a,
0x34, 0xe6, 0x44, 0xac, 0x7a, 0x5b, 0x9f, 0x48, 0xb0, 0x22, 0x30, 0x05,
0xc8, 0x4f, 0xb9, 0x28, 0x08, 0x53, 0x79, 0x99, 0x22, 0xa6, 0xcd, 0xf7,
0xf5, 0x04, 0x6f, 0x24, 0xf5, 0x41, 0x16, 0xca, 0x3c, 0xc4, 0x85, 0x41,
0x1e, 0x7f, 0xf7, 0xd6, 0x89, 0x8a, 0x6c, 0x5b, 0xf6, 0x20, 0x5b, 0x2a,
0xd4, 0x16, 0x1d, 0x6d, 0x61, 0x81, 0xb2, 0x01, 0xa3, 0x8d, 0x43, 0x35,
0xeb, 0x18, 0xb1, 0x71, 0x61, 0x1e, 0x25, 0x15, 0xfe, 0xd8, 0xf4, 0x8f,
0x92, 0xb2, 0x4a, 0xb5, 0xca, 0x29, 0xab, 0xc3, 0xa8, 0xa8, 0x8c, 0xf1,
0xe2, 0xac, 0x3e, 0xb9, 0x2f, 0x15, 0x88, 0x6c, 0x32, 0x59, 0x29, 0x32,
0x56, 0xab, 0xcb, 0x65, 0x5e, 0xc1, 0x6a, 0xbd, 0x52, 0xe2, 0xf8, 0x53,
0x84, 0x28, 0xc4, 0xc0, 0x11, 0x3c, 0xe0, 0xcb, 0x05, 0x0f, 0x74, 0x95,
0xda, 0x78, 0x60, 0x6f, 0x5c, 0xeb, 0x74, 0x81, 0x8a, 0xfb, 0x33, 0xf8,
0xcc, 0xb7, 0x22, 0x7d, 0xcc, 0x62, 0x02, 0x7d, 0x42, 0x51, 0x1d, 0x63,
0x8e, 0x27, 0xd3, 0xc9, 0x2e, 0x0f, 0xfc, 0x09, 0xdc, 0x21, 0xe2, 0x67,
0x91, 0x76, 0x52, 0x06, 0x89, 0xac, 0xff, 0x23, 0x3b, 0x25, 0x6b, 0xe5,
0xe5, 0x98, 0xce, 0x81, 0x96, 0xb7, 0x35, 0xed, 0xfb, 0xf1, 0x44, 0x12,
0x9d, 0x64, 0xb5, 0xfe, 0x39, 0xf1, 0x39, 0x28, 0x83, 0x5f, 0xa8, 0x02,
0x82, 0xf3, 0x29, 0x8d, 0xbc, 0x38, 0x64, 0x2b, 0x9f, 0x2d, 0xa6, 0xcf,
0xbb, 0x84, 0xaf, 0xff, 0x92, 0xc4, 0xbe, 0xe9, 0x87, 0xe8, 0xc2, 0xbb,
0xec, 0x89, 0x77, 0xaa, 0x78, 0xc6, 0x8d, 0x6d, 0xdd, 0x0e, 0x5d, 0x2f,
0x20, 0xd7, 0x78, 0x4f, 0xdd, 0x5b, 0xfe, 0x92, 0x10, 0x4f, 0xdf, 0x75,
0x3a, 0x8a, 0xd4, 0x6d, 0x73, 0x38, 0xb4, 0x3a, 0x69, 0x65, 0x68, 0xae,
0x5c, 0x92, 0xac, 0xd9, 0x41, 0x2e, 0xf9, 0xb7, 0x45, 0xa4, 0x34, 0xcc,
0x95, 0xde, 0xec, 0x93, 0x2e, 0xe3, 0x8a, 0x4f, 0xf5, 0xf1, 0x99, 0x64,
0x34, 0xec, 0xe0, 0xd3, 0x74, 0xcc, 0x58, 0x83, 0xb6, 0x44, 0x21, 0xcc,
0x63, 0x98, 0x02, 0x05, 0x12, 0x5b, 0x9f, 0x0f, 0x1e, 0x1f, 0xe7, 0xed,
0xc7, 0xc7, 0x80, 0x3e, 0x4a, 0x65, 0x13, 0xb3, 0x3b, 0xa0, 0x8f, 0x52,
0xd9, 0x68, 0x13, 0x26, 0x82, 0x07, 0x30, 0x0e, 0x87, 0x17, 0x5b, 0xf8,
0x13, 0x16, 0x7e, 0x81, 0x06, 0xfd, 0x0a, 0x1f, 0xb5, 0x23, 0x8f, 0xdf,
0x79, 0xf8, 0x82, 0x14, 0xfd, 0x61, 0x46, 0x31, 0xc8, 0x1d, 0x5c, 0x68,
0xf7, 0xa3, 0x67, 0xee, 0x5c, 0x3d, 0x7a, 0xd4, 0xce, 0x5c, 0x37, 0xf8,
0xfb, 0x75, 0xfd, 0xb5, 0xe2, 0x86, 0x58, 0x67, 0x23, 0xab, 0xe8, 0xd6,
0x62, 0x4a, 0xb7, 0xfa, 0x29, 0xbd, 0xea, 0x28, 0x7b, 0xd5, 0x9d, 0xd8,
0xab, 0xe6, 0x84, 0x5e, 0xed, 0xc7, 0x7a, 0x95, 0x9a, 0xd3, 0x42, 0xc7,
0x22, 0x4f, 0xb5, 0x71, 0x2c, 0x30, 0x38, 0x33, 0xb3, 0xf8, 0x4a, 0x30,
0xd1, 0x2e, 0x7c, 0xef, 0x22, 0x1f, 0xf2, 0x96, 0xb3, 0x96, 0x13, 0xf0,
0x46, 0xdd, 0xe6, 0x0d, 0x89, 0x92, 0x35, 0x43, 0xa0, 0x62, 0x23, 0x60,
0x0f, 0x05, 0xf2, 0x5c, 0x30, 0x70, 0x58, 0x8a, 0xba, 0xcd, 0x20, 0x05,
0x6b, 0x42, 0x79, 0x00, 0x5f, 0x53, 0x81, 0x53, 0x26, 0x34, 0x18, 0xec,
0x47, 0x20, 0x5f, 0x37, 0x66, 0xc7, 0x6e, 0xaf, 0x2b, 0xbb, 0x12, 0x4b,
0x29, 0xfa, 0x92, 0xc5, 0xb8, 0x49, 0x74, 0xbc, 0x61, 0x28, 0x80, 0x01,
0x47, 0x3c, 0x23, 0x49, 0x64, 0xd4, 0x2c, 0x89, 0x27, 0x29, 0x15, 0xa9,
0x68, 0x52, 0x54, 0xc3, 0x33, 0xbe, 0x45, 0x94, 0xe9, 0x94, 0x93, 0xd7,
0x78, 0x27, 0x28, 0xd8, 0xc4, 0x2c, 0x46, 0xcc, 0x0e, 0x1b, 0x97, 0x2a,
0xc5, 0xd5, 0xcf, 0x7f, 0x79, 0x2e, 0x3d, 0xb8, 0x29, 0x79, 0xd5, 0x1c,
0x83, 0x9b, 0xae, 0x88, 0xef, 0x52, 0x90, 0x67, 0xe7, 0xc8, 0x4b, 0x15,
0xf8, 0xec, 0x5c, 0xa5, 0x5a, 0xa3, 0xcf, 0xce, 0x55, 0x57, 0x6a, 0xf8,
0xf0, 0x13, 0xa4, 0xe0, 0x8f, 0x36, 0x7f, 0xac, 0xae, 0xc3, 0xdf, 0xb7,
0xb8, 0x32, 0x1e, 0x02, 0x5a, 0xdb, 0x33, 0xb3, 0x87, 0xe7, 0x47, 0xfc,
0xcb, 0xf5, 0xc9, 0xe6, 0x4b, 0x83, 0x5f, 0x72, 0x1c, 0xc7, 0x73, 0xb6,
0x07, 0xf6, 0x10, 0x23, 0xb0, 0x59, 0x02, 0x88, 0x4b, 0x66, 0x46, 0x21,
0x01, 0x57, 0x41, 0xb1, 0x4f, 0x45, 0xb9, 0x31, 0xd9, 0x3f, 0x1e, 0xb1,
0xc9, 0xaa, 0xfb, 0x80, 0x01, 0x9a, 0x86, 0x40, 0x8e, 0x1f, 0xf1, 0x96,
0x86, 0x56, 0x20, 0x89, 0xe3, 0xc4, 0x33, 0x1a, 0x3c, 0xde, 0x0d, 0x8f,
0x10, 0x2a, 0x84, 0x94, 0x22, 0xc1, 0x28, 0xf9, 0xcb, 0x19, 0x72, 0xd0,
0xd0, 0xe8, 0xcd, 0x0c, 0xbb, 0xf3, 0xca, 0xf4, 0xae, 0xcf, 0x87, 0x51,
0xf0, 0x16, 0xf2, 0x1a, 0xcd, 0x91, 0x39, 0x64, 0x0f, 0xd7, 0xed, 0xb9,
0x23, 0xef, 0x4b, 0xeb, 0x1e, 0x8f, 0x04, 0xe4, 0xfc, 0x6d, 0xf7, 0xba,
0x85, 0xef, 0x73, 0xa5, 0xc1, 0x11, 0x82, 0x8d, 0x0b, 0xfe, 0xec, 0x23,
0xd5, 0x49, 0xcf, 0xe4, 0x44, 0x7c, 0xcc, 0x6b, 0x0b, 0x6d, 0x02, 0xb0,
0x0a, 0x61, 0x81, 0x05, 0x1d, 0x82, 0xd6, 0x07, 0x37, 0x45, 0x68, 0x60,
0x2f, 0x7e, 0x08, 0x49, 0xfa, 0x21, 0x2c, 0x25, 0xbd, 0xea, 0x44, 0x48,
0x68, 0xcb, 0x2f, 0x3d, 0xf1, 0xf7, 0x3d, 0x68, 0xcf, 0x91, 0x18, 0x78,
0xb0, 0x8c, 0xe1, 0xaf, 0x8b, 0x38, 0x9b, 0x9d, 0x8e, 0x28, 0x6a, 0xdb,
0xc4, 0x8a, 0x22, 0x78, 0xcc, 0xc2, 0xee, 0x0d, 0x30, 0x72, 0xf7, 0xda,
0xc6, 0xcd, 0x5b, 0x5a, 0x20, 0x0d, 0x7e, 0x22, 0xb6, 0x82, 0x85, 0x78,
0xc2, 0x1a, 0x4f, 0x59, 0xd0, 0xd5, 0x8f, 0xa8, 0x34, 0xb5, 0xc8, 0x34,
0x9c, 0x52, 0xd5, 0x2c, 0x8c, 0xcb, 0x36, 0xce, 0x8a, 0x74, 0xfc, 0x46,
0x7d, 0x4d, 0xc6, 0xf8, 0xb1, 0x75, 0x8b, 0xfd, 0x12, 0x46, 0xfa, 0x08,
0xae, 0x87, 0xac, 0x9e, 0x1b, 0x10, 0xb2, 0xea, 0xa2, 0x28, 0x50, 0x85,
0x58, 0x08, 0xcb, 0x5c, 0x55, 0x4f, 0xc9, 0xa6, 0xe1, 0xfa, 0x72, 0x55,
0x11, 0x6b, 0x70, 0x67, 0xd0, 0xd8, 0xfb, 0xd2, 0x76, 0x79, 0xac, 0xd6,
0xf8, 0xc1, 0x8b, 0xfe, 0x60, 0x0e, 0x86, 0x7d, 0xb3, 0x21, 0xd5, 0x93,
0x8c, 0x43, 0x79, 0x4b, 0x36, 0xd0, 0xcd, 0xce, 0x1e, 0x69, 0xaf, 0x13,
0x0c, 0xee, 0x89, 0x4e, 0x11, 0xc3, 0x95, 0x45, 0x7b, 0x99, 0x16, 0xd9,
0xcb, 0xa4, 0x41, 0x4e, 0x40, 0x22, 0xb5, 0xf0, 0x30, 0x89, 0x86, 0xc6,
0xcd, 0xf2, 0x47, 0x11, 0xd3, 0xba, 0x36, 0xc4, 0x39, 0xbe, 0x25, 0xc3,
0x27, 0x8c, 0x85, 0x16, 0x0e, 0xa8, 0x30, 0x54, 0x56, 0xc7, 0x7d, 0xc5,
0x40, 0x92, 0x63, 0xae, 0x88, 0x2f, 0x4e, 0x85, 0xf9, 0x61, 0x3c, 0x21,
0x94, 0x88, 0x41, 0xe1, 0xa0, 0x33, 0xb0, 0xce, 0x4c, 0xff, 0xfd, 0xf3,
0x91, 0x35, 0xb2, 0x84, 0x40, 0xcb, 0x95, 0x4a, 0x33, 0x58, 0x2b, 0x95,
0xeb, 0x24, 0x16, 0x2f, 0xbe, 0x44, 0xfa, 0x35, 0x02, 0x44, 0x31, 0x8b,
0xe6, 0xe5, 0x71, 0x4a, 0x8f, 0xf7, 0xf4, 0x4e, 0x41, 0x8a, 0xbb, 0x37,
0xe1, 0x7b, 0xf7, 0xf5, 0x99, 0x16, 0xd1, 0xc2, 0x68, 0xf6, 0xcc, 0xdb,
0x33, 0x97, 0x44, 0x4c, 0xfd, 0x68, 0x5c, 0xcd, 0x18, 0x3d, 0xfe, 0xc7,
0xd3, 0x83, 0xf1, 0x82, 0xb0, 0x2b, 0xc5, 0x97, 0xaf, 0x64, 0xf5, 0x98,
0x10, 0x72, 0x6a, 0xdb, 0xb3, 0xae, 0xcb, 0x12, 0x3b, 0x37, 0x7a, 0x77,
0x8b, 0x74, 0x3a, 0x6e, 0xe5, 0xb4, 0xe9, 0x1b, 0xf4, 0x30, 0x0b, 0x16,
0xee, 0xc8, 0x63, 0x2a, 0x13, 0x00, 0xee, 0xd5, 0x02, 0x74, 0x15, 0x4a,
0x10, 0x33, 0x75, 0x63, 0xcd, 0x8d, 0x3d, 0x25, 0x19, 0xd3, 0x9e, 0xb1,
0x6c, 0x51, 0x1f, 0x8f, 0xc7, 0xf1, 0xf1, 0x89, 0x8d, 0xe8, 0xa2, 0x49,
0x4c, 0x44, 0x91, 0xe8, 0x52, 0x1e, 0xea, 0x8f, 0x10, 0xc1, 0x8f, 0x04,
0x23, 0xd3, 0xb9, 0xaa, 0xc7, 0xe0, 0x13, 0x3d, 0x4b, 0x0b, 0x76, 0xed,
0x01, 0xbe, 0x46, 0x8a, 0x1b, 0xb4, 0xe5, 0xc5, 0x70, 0x30, 0x90, 0x35,
0xe2, 0x9a, 0x41, 0xeb, 0x3c, 0x8b, 0x34, 0xe9, 0xe3, 0x63, 0xb5, 0xb8,
0x5a, 0xd7, 0x34, 0xad, 0xe0, 0x83, 0x1d, 0x91, 0xcd, 0xb2, 0x65, 0x5c,
0x20, 0x95, 0x23, 0x0f, 0x83, 0x89, 0x09, 0x1b, 0x72, 0x7e, 0x5e, 0xce,
0x6d, 0x04, 0x05, 0x30, 0x0f, 0x30, 0x9c, 0x31, 0x10, 0x74, 0xee, 0x5b,
0x1d, 0xc8, 0x97, 0x13, 0x34, 0x7a, 0xd6, 0x1a, 0x18, 0xf9, 0x12, 0xae,
0x39, 0x9b, 0xf2, 0x41, 0x20, 0x7f, 0x40, 0x8d, 0x9c, 0x07, 0x62, 0x80,
0xd7, 0x0b, 0xff, 0x32, 0x4e, 0x8f, 0xad, 0x05, 0x60, 0xe8, 0xe3, 0x43,
0xcf, 0xb1, 0x3c, 0x72, 0x48, 0x3a, 0x87, 0xb1, 0xc8, 0xf3, 0x81, 0x61,
0x54, 0x34, 0xf6, 0xee, 0x03, 0x7f, 0xbf, 0x9b, 0x9d, 0xaa, 0x82, 0x42,
0x45, 0x75, 0xe6, 0x19, 0x7e, 0xb8, 0x9b, 0x6d, 0x15, 0xc8, 0x89, 0x27,
0x11, 0x15, 0xc1, 0x98, 0x88, 0x73, 0xc6, 0x5a, 0x0f, 0x36, 0x4a, 0x8d,
0x3c, 0xbe, 0x36, 0xc7, 0x5e, 0xf0, 0x14, 0xfb, 0x2b, 0xcf, 0x7f, 0x84,
0xaf, 0x3b, 0x5d, 0x5b, 0x5e, 0x8f, 0xce, 0x95, 0x59, 0x5f, 0x77, 0xf0,
0xec, 0x11, 0x5f, 0x67, 0x04, 0xcb, 0x23, 0x97, 0x13, 0xb6, 0x9d, 0xbd,
0xf0, 0x30, 0xb5, 0x69, 0xad, 0xe3, 0x76, 0x77, 0x3e, 0xcf, 0x1e, 0xf0,
0x06, 0xf9, 0xb7, 0x02, 0x82, 0x20, 0xeb, 0x5d, 0x58, 0x97, 0x4c, 0x26,
0x69, 0x9d, 0x24, 0x1e, 0xb8, 0xab, 0xa5, 0x4f, 0x0e, 0xc5, 0xc9, 0x93,
0x24, 0xc8, 0x0a, 0x0c, 0x28, 0x97, 0xf1, 0x8f, 0x1f, 0x40, 0x50, 0xa5,
0xd5, 0x0b, 0x75, 0x1e, 0x8b, 0x57, 0x9e, 0x98, 0x84, 0x63, 0xe1, 0xcf,
0x04, 0x92, 0xa2, 0xd8, 0x54, 0x91, 0xa5, 0x10, 0xcb, 0x99, 0x48, 0x11,
0x17, 0x27, 0x4d, 0xb7, 0xc6, 0x22, 0x03, 0xa5, 0x77, 0x35, 0x41, 0xb8,
0xc9, 0xa8, 0x16, 0xfa, 0x5e, 0xf7, 0xd5, 0xa4, 0xdb, 0x3a, 0x7b, 0x39,
0x95, 0x9e, 0x88, 0x7a, 0xba, 0x83, 0x27, 0xa2, 0x56, 0x78, 0x18, 0x2a,
0x8c, 0x24, 0x6f, 0xd1, 0x91, 0x50, 0x7e, 0xdf, 0xe6, 0xaf, 0xb2, 0xd3,
0x77, 0xb3, 0xbc, 0xa5, 0xb2, 0x16, 0x81, 0xd0, 0x1d, 0x97, 0x26, 0x2c,
0xc8, 0x82, 0x3b, 0x12, 0xab, 0x96, 0x1c, 0x2a, 0x67, 0x79, 0xbe, 0x6e,
0xe9, 0xae, 0x50, 0xf1, 0x9c, 0x8f, 0x9a, 0xc6, 0x61, 0x72, 0xa6, 0xf9,
0xa2, 0x98, 0x81, 0x75, 0x07, 0x46, 0xbb, 0x68, 0x58, 0x16, 0xee, 0x0c,
0x9a, 0x52, 0xb8, 0x5b, 0xb2, 0x13, 0x99, 0xf7, 0x3c, 0xf3, 0x9e, 0x64,
0xc6, 0xac, 0xda, 0xc2, 0x5d, 0x0e, 0xac, 0xc7, 0x64, 0xf2, 0x7d, 0x0e,
0xd6, 0xbb, 0x89, 0x64, 0xb9, 0xca, 0x04, 0x2a, 0x55, 0x05, 0x32, 0x21,
0x89, 0x6a, 0x96, 0xec, 0x70, 0xd2, 0x4d, 0xb5, 0x6b, 0x48, 0x4f, 0x73,
0x4e, 0xf1, 0x5d, 0x05, 0xfe, 0xc0, 0x8a, 0x28, 0x38, 0x3c, 0x1a, 0x3d,
0x0c, 0x1e, 0x12, 0x8a, 0xde, 0xe4, 0x8a, 0x52, 0x04, 0x62, 0x21, 0xe5,
0x4d, 0x7c, 0xd7, 0x9c, 0x89, 0xa5, 0x3f, 0x16, 0x07, 0x8f, 0xc5, 0xa7,
0xf5, 0xa1, 0x08, 0x8f, 0xef, 0xa0, 0x0b, 0xf3, 0xb1, 0xd5, 0x64, 0x8b,
0x32, 0x49, 0x09, 0x8b, 0x91, 0xf2, 0x25, 0x5d, 0x8b, 0xc7, 0xd6, 0x51,
0xef, 0x06, 0x73, 0x44, 0xa8, 0x58, 0xef, 0x06, 0x62, 0xef, 0xe6, 0xf3,
0x4d, 0x2b, 0x1a, 0xf7, 0x63, 0x8c, 0xdd, 0x7a, 0x6a, 0xe2, 0xa3, 0xd1,
0xd0, 0x83, 0x1d, 0xb2, 0x75, 0xc9, 0x27, 0x11, 0x74, 0x66, 0x8a, 0x4e,
0xe0, 0x62, 0x33, 0x23, 0x3e, 0x94, 0xca, 0x23, 0xfc, 0xc3, 0xc4, 0x93,
0x55, 0xcf, 0x43, 0x7a, 0x54, 0x5c, 0x51, 0xd1, 0x27, 0x22, 0x17, 0x91,
0x26, 0x40, 0x85, 0x13, 0x43, 0xb2, 0x11, 0xc5, 0xf0, 0x8e, 0xe8, 0xa3,
0x90, 0x59, 0x5e, 0x50, 0x1f, 0x81, 0x25, 0x35, 0x52, 0x9a, 0x21, 0xc2,
0xc1, 0xb6, 0x1f, 0x95, 0xd0, 0x47, 0xa0, 0x65, 0x47, 0xa4, 0x3e, 0xb2,
0x9d, 0x8b, 0x95, 0x6e, 0x3a, 0xbe, 0x7d, 0x80, 0x12, 0xc1, 0xb6, 0xcb,
0xad, 0xf5, 0x30, 0xf8, 0x21, 0xb1, 0x26, 0x93, 0x71, 0xc2, 0x93, 0xdb,
0xe9, 0xc7, 0x6e, 0xe8, 0x06, 0x03, 0x0b, 0x16, 0x7a, 0xf2, 0xd8, 0xb9,
0x9b, 0xcb, 0xe4, 0xe2, 0x3a, 0x2d, 0x89, 0x13, 0x1f, 0x64, 0x40, 0x7a,
0x62, 0x1b, 0xcd, 0xd1, 0x6b, 0xf5, 0xd1, 0xd3, 0x97, 0x29, 0xd6, 0x2d,
0xdf, 0x58, 0x73, 0x85, 0x90, 0xf8, 0x64, 0x36, 0xf4, 0x9a, 0xec, 0x65,
0x24, 0x6b, 0xf2, 0x1b, 0x48, 0x5e, 0xf4, 0xf4, 0xb7, 0x82, 0x2b, 0x81,
0xa6, 0x7c, 0xea, 0x88, 0x4b, 0x6f, 0x3b, 0xfd, 0x11, 0x5d, 0x28, 0xe9,
0x19, 0x2e, 0x3e, 0xef, 0xed, 0x38, 0x30, 0x89, 0xf2, 0xac, 0x6c, 0xf8,
0x0c, 0x33, 0xfc, 0x53, 0xbe, 0xd4, 0x62, 0x4f, 0x22, 0xc1, 0x12, 0x7e,
0xc3, 0xa5, 0x1c, 0x2a, 0xb8, 0x24, 0xd8, 0x7f, 0x56, 0xc5, 0xbb, 0x28,
0xae, 0xb6, 0xd6, 0x50, 0xe5, 0x47, 0x21, 0xb4, 0xf9, 0xf0, 0xf5, 0xa8,
0x9c, 0xc9, 0x2f, 0x01, 0x09, 0x0f, 0x31, 0xd0, 0xb7, 0x4b, 0x3a, 0xfa,
0x15, 0x1f, 0x9a, 0xa3, 0x88, 0x2f, 0x47, 0x72, 0xfc, 0x6f, 0x55, 0xd1,
0x0e, 0x14, 0xbe, 0x22, 0x87, 0x95, 0x23, 0xde, 0x23, 0x23, 0xd2, 0x0d,
0x5d, 0xde, 0x0d, 0xce, 0xe4, 0x6e, 0x90, 0xd7, 0x4a, 0x13, 0xe2, 0x94,
0x77, 0x16, 0x16, 0xcc, 0xb5, 0x15, 0x7c, 0x13, 0x28, 0x67, 0xac, 0xa0,
0xbf, 0xd7, 0xa4, 0xee, 0x33, 0x3f, 0xb9, 0xfb, 0xa0, 0x64,
gitextract_90qmtrh_/
├── .clang-format
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── support-request.md
│ └── workflows/
│ ├── backend.yml
│ ├── docker.yml
│ ├── frontend.yml
│ └── release.yml
├── .gitignore
├── CMakeLists.txt
├── Dockerfile
├── Dockerfile.alpine
├── LICENSE
├── README.md
├── app.rc.in
├── cmake/
│ └── GetGitVersion.cmake
├── html/
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .prettierrc.js
│ ├── .yarn/
│ │ └── patches/
│ │ └── zmodem.js-npm-0.1.10-e5537fa2ed.patch
│ ├── .yarnrc.yml
│ ├── README.md
│ ├── gulpfile.js
│ ├── package.json
│ ├── src/
│ │ ├── components/
│ │ │ ├── app.tsx
│ │ │ ├── modal/
│ │ │ │ ├── index.tsx
│ │ │ │ └── modal.scss
│ │ │ └── terminal/
│ │ │ ├── index.tsx
│ │ │ └── xterm/
│ │ │ ├── addons/
│ │ │ │ ├── overlay.ts
│ │ │ │ └── zmodem.ts
│ │ │ └── index.ts
│ │ ├── index.tsx
│ │ ├── style/
│ │ │ └── index.scss
│ │ └── template.html
│ ├── tsconfig.json
│ └── webpack.config.js
├── man/
│ ├── README.md
│ ├── ttyd.1
│ └── ttyd.man.md
├── scripts/
│ └── cross-build.sh
├── snap/
│ └── snapcraft.yaml
└── src/
├── compat.h
├── html.h
├── http.c
├── protocol.c
├── pty.c
├── pty.h
├── server.c
├── server.h
├── utils.c
└── utils.h
SYMBOL INDEX (151 symbols across 13 files)
FILE: html/src/components/app.tsx
class App (line 55) | class App extends Component {
method render (line 56) | render() {
FILE: html/src/components/modal/index.tsx
type Props (line 5) | interface Props {
class Modal (line 10) | class Modal extends Component<Props> {
method constructor (line 11) | constructor(props: Props) {
method render (line 15) | render({ show, children }: Props) {
FILE: html/src/components/terminal/index.tsx
type Props (line 8) | interface Props extends XtermOptions {
type State (line 12) | interface State {
class Terminal (line 16) | class Terminal extends Component<Props, State> {
method constructor (line 20) | constructor(props: Props) {
method componentDidMount (line 25) | async componentDidMount() {
method componentWillUnmount (line 31) | componentWillUnmount() {
method render (line 35) | render({ id }: Props, { modal }: State) {
method showModal (line 49) | showModal() {
method sendFile (line 54) | sendFile(event: Event) {
FILE: html/src/components/terminal/xterm/addons/overlay.ts
class OverlayAddon (line 6) | class OverlayAddon implements ITerminalAddon {
method constructor (line 11) | constructor() {
method activate (line 33) | activate(terminal: Terminal): void {
method dispose (line 37) | dispose(): void {}
method showOverlay (line 40) | showOverlay(msg: string, timeout?: number): void {
FILE: html/src/components/terminal/xterm/addons/zmodem.ts
type ZmodeOptions (line 7) | interface ZmodeOptions {
class ZmodemAddon (line 17) | class ZmodemAddon implements ITerminalAddon {
method constructor (line 25) | constructor(private options: ZmodeOptions) {}
method activate (line 27) | activate(terminal: Terminal) {
method dispose (line 33) | dispose() {
method consume (line 40) | consume(data: ArrayBuffer) {
method reset (line 54) | private reset() {
method addDisposableListener (line 59) | private addDisposableListener(target: EventTarget, type: string, liste...
method trzszInit (line 65) | private trzszInit() {
method zmodemInit (line 94) | private zmodemInit() {
method zmodemDetect (line 115) | private zmodemDetect(detection: Zmodem.Detection): void {
method sendFile (line 131) | public sendFile(files: FileList) {
method receiveFile (line 141) | private receiveFile() {
method writeProgress (line 159) | private writeProgress(offer: Zmodem.Offer) {
method bytesHuman (line 171) | private bytesHuman(bytes: any, precision: number): string {
FILE: html/src/components/terminal/xterm/index.ts
type TtydTerminal (line 16) | interface TtydTerminal extends Terminal {
type Window (line 21) | interface Window {
type Command (line 26) | enum Command {
type Preferences (line 38) | type Preferences = ITerminalOptions & ClientOptions;
type RendererType (line 40) | type RendererType = 'dom' | 'canvas' | 'webgl';
type ClientOptions (line 42) | interface ClientOptions {
type FlowControl (line 56) | interface FlowControl {
type XtermOptions (line 62) | interface XtermOptions {
function toDisposable (line 70) | function toDisposable(f: () => void): IDisposable {
function addEventListener (line 74) | function addEventListener(target: EventTarget, type: string, listener: E...
class Xterm (line 79) | class Xterm {
method constructor (line 107) | constructor(
method dispose (line 112) | dispose() {
method register (line 120) | private register<T extends IDisposable>(d: T): T {
method sendFile (line 126) | public sendFile(files: FileList) {
method refreshToken (line 131) | public async refreshToken() {
method onWindowUnload (line 144) | private onWindowUnload(event: BeforeUnloadEvent) {
method open (line 155) | public open(parent: HTMLElement) {
method initListeners (line 173) | private initListeners() {
method writeData (line 207) | public writeData(data: string | Uint8Array) {
method sendData (line 230) | public sendData(data: string | Uint8Array) {
method connect (line 248) | public connect() {
method onSocketOpen (line 260) | private onSocketOpen() {
method onSocketClose (line 281) | private onSocketClose(event: CloseEvent) {
method parseOptsFromUrlQuery (line 309) | private parseOptsFromUrlQuery(query: string): Preferences {
method onSocketData (line 343) | private onSocketData(event: MessageEvent) {
method applyPreferences (line 371) | private applyPreferences(prefs: Preferences) {
method setRendererType (line 472) | private setRendererType(value: RendererType) {
FILE: src/http.c
function send_unauthorized (line 14) | static int send_unauthorized(struct lws *wsi, unsigned int code, enum lw...
function check_auth (line 28) | static int check_auth(struct lws *wsi, struct pss_http *pss) {
function accept_gzip (line 46) | static bool accept_gzip(struct lws *wsi) {
function uncompress_html (line 52) | static bool uncompress_html(char **output, size_t *output_len) {
function pss_buffer_free (line 82) | static void pss_buffer_free(struct pss_http *pss) {
function access_log (line 86) | static void access_log(struct lws *wsi, const char *path) {
function callback_http (line 93) | int callback_http(struct lws *wsi, enum lws_callback_reasons reason, voi...
FILE: src/protocol.c
function send_initial_message (line 17) | static int send_initial_message(struct lws *wsi, int index) {
function json_object (line 39) | static json_object *parse_window_size(const char *buf, size_t len, uint1...
function check_host_origin (line 51) | static bool check_host_origin(struct lws *wsi) {
function pty_ctx_t (line 73) | static pty_ctx_t *pty_ctx_init(struct pss_tty *pss) {
function pty_ctx_free (line 80) | static void pty_ctx_free(pty_ctx_t *ctx) { free(ctx); }
function process_read_cb (line 82) | static void process_read_cb(pty_process *process, pty_buf_t *buf, bool e...
function process_exit_cb (line 96) | static void process_exit_cb(pty_process *process) {
type pss_tty (line 115) | struct pss_tty
type pss_tty (line 132) | struct pss_tty
function spawn_process (line 154) | static bool spawn_process(struct pss_tty *pss, uint16_t columns, uint16_...
function wsi_output (line 171) | static void wsi_output(struct lws *wsi, pty_buf_t *buf) {
function check_auth (line 187) | static bool check_auth(struct lws *wsi, struct pss_tty *pss) {
function callback_tty (line 201) | int callback_tty(struct lws *wsi, enum lws_callback_reasons reason, void...
FILE: src/pty.c
function alloc_cb (line 40) | static void alloc_cb(uv_handle_t *unused, size_t suggested_size, uv_buf_...
function close_cb (line 45) | static void close_cb(uv_handle_t *handle) { free(handle); }
function async_free_cb (line 47) | static void async_free_cb(uv_handle_t *handle) {
function pty_buf_t (line 51) | pty_buf_t *pty_buf_init(char *base, size_t len) {
function pty_buf_free (line 59) | void pty_buf_free(pty_buf_t *buf) {
function read_cb (line 65) | static void read_cb(uv_stream_t *stream, ssize_t n, const uv_buf_t *buf) {
function write_cb (line 79) | static void write_cb(uv_write_t *req, int unused) {
function pty_process (line 85) | pty_process *process_init(void *ctx, uv_loop_t *loop, char *argv[], char...
function process_running (line 98) | bool process_running(pty_process *process) {
function process_free (line 102) | void process_free(pty_process *process) {
function pty_pause (line 124) | void pty_pause(pty_process *process) {
function pty_resume (line 130) | void pty_resume(pty_process *process) {
function pty_write (line 137) | int pty_write(pty_process *process, pty_buf_t *buf) {
function pty_resize (line 148) | bool pty_resize(pty_process *process) {
function pty_kill (line 160) | bool pty_kill(pty_process *process, int sig) {
function conpty_init (line 170) | bool conpty_init() {
function WCHAR (line 192) | static WCHAR *to_utf16(char *str) {
function WCHAR (line 205) | static WCHAR *join_args(char **argv) {
function conpty_setup (line 221) | static bool conpty_setup(HPCON *hnd, COORD size, STARTUPINFOEXW *si_ex, ...
function connect_cb (line 286) | static void connect_cb(uv_connect_t *req, int status) {
function conpty_exit (line 293) | static void CALLBACK conpty_exit(void *context, BOOLEAN unused) {
function async_cb (line 298) | static void async_cb(uv_async_t *async) {
function pty_spawn (line 312) | int pty_spawn(pty_process *process, pty_read_cb read_cb, pty_exit_cb exi...
function fd_set_cloexec (line 381) | static bool fd_set_cloexec(const int fd) {
function fd_duplicate (line 387) | static bool fd_duplicate(int fd, uv_pipe_t *pipe) {
function wait_cb (line 398) | static void wait_cb(void *arg) {
function async_cb (line 419) | static void async_cb(uv_async_t *async) {
function pty_spawn (line 427) | int pty_spawn(pty_process *process, pty_read_cb read_cb, pty_exit_cb exi...
FILE: src/pty.h
type pty_buf_t (line 19) | typedef struct {
type pty_process_ (line 24) | struct pty_process_
type pty_process (line 25) | typedef struct pty_process_ pty_process;
type pty_process_ (line 29) | struct pty_process_ {
FILE: src/server.c
type lws_context (line 22) | struct lws_context
type server (line 23) | struct server
type endpoints (line 24) | struct endpoints
type lws (line 26) | struct lws
type lws_callback_reasons (line 26) | enum lws_callback_reasons
type lws (line 27) | struct lws
type lws_callback_reasons (line 27) | enum lws_callback_reasons
type lws_protocols (line 30) | struct lws_protocols
type pss_http (line 30) | struct pss_http
type pss_tty (line 31) | struct pss_tty
type lws_extension (line 36) | struct lws_extension
type option (line 55) | struct option
function print_help (line 90) | static void print_help() {
function print_config (line 140) | static void print_config() {
type server (line 164) | struct server
type server (line 165) | struct server
type server (line 168) | struct server
type server (line 170) | struct server
function server_free (line 207) | static void server_free(struct server *ts) {
function signal_cb (line 233) | static void signal_cb(uv_signal_t *watcher, int signum) {
function parse_int (line 256) | static int parse_int(char *name, char *str) {
function calc_command_start (line 267) | static int calc_command_start(int argc, char **argv) {
function main (line 304) | int main(int argc, char **argv) {
FILE: src/server.h
type endpoints (line 20) | struct endpoints {
type lws_context (line 28) | struct lws_context
type server (line 29) | struct server
type endpoints (line 30) | struct endpoints
type pss_http (line 32) | struct pss_http {
type pss_tty (line 39) | struct pss_tty {
type pty_ctx_t (line 59) | typedef struct {
type server (line 64) | struct server {
FILE: src/utils.c
function endswith (line 63) | bool endswith(const char *str, const char *suffix) {
function get_sig_name (line 69) | int get_sig_name(int sig, char *buf, size_t len) {
function get_sig (line 75) | int get_sig(const char *sig_name) {
function open_uri (line 84) | int open_uri(char *uri) {
function print_error (line 181) | void print_error(char *func) {
Condensed preview — 55 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,381K chars).
[
{
"path": ".clang-format",
"chars": 92,
"preview": "BasedOnStyle: Google\nLanguage: Cpp\nColumnLimit: 120\nIndentWidth: 2\nTabWidth: 2\nUseTab: Never"
},
{
"path": ".gitattributes",
"chars": 30,
"preview": "src/html.h linguist-generated\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 33,
"preview": "github: tsl0922\npatreon: tsl0922\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 622,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Describe the "
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 604,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Is"
},
{
"path": ".github/ISSUE_TEMPLATE/support-request.md",
"chars": 148,
"preview": "---\nname: Support Request\nabout: Support request or question\ntitle: ''\nlabels: question\nassignees: ''\n\n---\n\nDescribe you"
},
{
"path": ".github/workflows/backend.yml",
"chars": 2245,
"preview": "name: backend\n\non:\n push:\n paths:\n - \".github/workflows/backend.yml\"\n - \"CMakeLists.txt\"\n - \"src/*\"\n - \""
},
{
"path": ".github/workflows/docker.yml",
"chars": 2285,
"preview": "name: docker\n\non:\n push:\n branches: main\n tags: [\"*\"]\n\njobs:\n build:\n runs-on: ubuntu-24.04\n permissions:\n"
},
{
"path": ".github/workflows/frontend.yml",
"chars": 582,
"preview": "name: frontend\n\non:\n push:\n paths:\n - \".github/workflows/frontend.yml\"\n - \"html/*\"\n pull_request:\n paths:\n"
},
{
"path": ".github/workflows/release.yml",
"chars": 1086,
"preview": "name: release\n\non:\n push:\n tags: [\"*\"]\n\njobs:\n build:\n uses: ./.github/workflows/backend.yml\n publish:\n need"
},
{
"path": ".gitignore",
"chars": 465,
"preview": "# Prerequisites\n*.d\n\n# Object files\n*.o\n*.ko\n*.obj\n*.elf\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Libraries\n*.lib\n*.a\n*.la\n"
},
{
"path": "CMakeLists.txt",
"chars": 4461,
"preview": "cmake_minimum_required(VERSION 3.12.0)\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake\")\n\nproject(ttyd"
},
{
"path": "Dockerfile",
"chars": 301,
"preview": "FROM ubuntu:24.04\n\nARG TARGETARCH\n\n# Dependencies\nRUN apt-get update && apt-get install -y --no-install-recommends tini "
},
{
"path": "Dockerfile.alpine",
"chars": 224,
"preview": "FROM alpine\n\nARG TARGETARCH\n\n# Dependencies\nRUN apk add --no-cache bash tini\n\n# Application\nCOPY ./dist/${TARGETARCH}/tt"
},
{
"path": "LICENSE",
"chars": 1094,
"preview": "MIT License\n\nCopyright (c) 2016-2026 Shuanglei Tao <tsl0922@gmail.com>\n\nPermission is hereby granted, free of charge, to"
},
{
"path": "README.md",
"chars": 5492,
"preview": "\n\n\nfunction(get_git_version var1 var2)\n if(GIT_EXECUTABLE)\n execute_process(\n COMMAND ${GIT_EXE"
},
{
"path": "html/.editorconfig",
"chars": 207,
"preview": "root = true\n\n[*]\ncharset = utf-8\nindent_size = 4\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespa"
},
{
"path": "html/.eslintignore",
"chars": 6,
"preview": "dist/\n"
},
{
"path": "html/.eslintrc.json",
"chars": 394,
"preview": "{\n \"extends\": \"./node_modules/gts/\",\n \"overrides\": [\n {\n \"files\": [\"**/*.ts\", \"**/*.tsx\"],\n \"parserOption"
},
{
"path": "html/.gitignore",
"chars": 104,
"preview": "node_modules\ndist\n*.log\n\n.yarn/cache\n.yarn/unplugged\n.yarn/build-state.yml\n.yarn/install-state.gz\n.pnp.*"
},
{
"path": "html/.prettierrc.js",
"chars": 123,
"preview": "module.exports = {\n ...require('gts/.prettierrc.json'),\n \"bracketSpacing\": true,\n \"tabWidth\": 4,\n \"printWidth\": 120,"
},
{
"path": "html/.yarn/patches/zmodem.js-npm-0.1.10-e5537fa2ed.patch",
"chars": 1648,
"preview": "diff --git a/src/zsession.js b/src/zsession.js\nindex 5f0b8f9d8afa6fba0acd6dd0477afa186f7aad9a..c7ea98e0f08c97d63d321f784"
},
{
"path": "html/.yarnrc.yml",
"chars": 25,
"preview": "nodeLinker: node-modules\n"
},
{
"path": "html/README.md",
"chars": 314,
"preview": "## Prerequisites\n\n> **NOTE:** yarn v2 is required.\n\nInstall [Yarn](https://yarnpkg.com/getting-started/install), and run"
},
{
"path": "html/gulpfile.js",
"chars": 1865,
"preview": "const { src, dest, task, series } = require('gulp');\nconst clean = require('gulp-clean');\nconst gzip = require('gulp-gzi"
},
{
"path": "html/package.json",
"chars": 2167,
"preview": "{\n \"private\": true,\n \"name\": \"ttyd\",\n \"version\": \"1.0.0\",\n \"description\": \"Share your terminal over the web\",\n \"rep"
},
{
"path": "html/src/components/app.tsx",
"chars": 2024,
"preview": "import { h, Component } from 'preact';\n\nimport { Terminal } from './terminal';\n\nimport type { ITerminalOptions, ITheme }"
},
{
"path": "html/src/components/modal/index.tsx",
"chars": 636,
"preview": "import { h, Component, ComponentChildren } from 'preact';\n\nimport './modal.scss';\n\ninterface Props {\n show: boolean;\n"
},
{
"path": "html/src/components/modal/modal.scss",
"chars": 1388,
"preview": ".modal {\n bottom: 0;\n left: 0;\n right: 0;\n top: 0;\n align-items: center;\n display: flex;\n overflow: hidden;\n pos"
},
{
"path": "html/src/components/terminal/index.tsx",
"chars": 1487,
"preview": "import { bind } from 'decko';\nimport { Component, h } from 'preact';\nimport { Xterm, XtermOptions } from './xterm';\n\nimp"
},
{
"path": "html/src/components/terminal/xterm/addons/overlay.ts",
"chars": 2362,
"preview": "// ported from hterm.Terminal.prototype.showOverlay\n// https://chromium.googlesource.com/apps/libapps/+/master/hterm/js/"
},
{
"path": "html/src/components/terminal/xterm/addons/zmodem.ts",
"chars": 6216,
"preview": "import { bind } from 'decko';\nimport { saveAs } from 'file-saver';\nimport { IDisposable, ITerminalAddon, Terminal } from"
},
{
"path": "html/src/components/terminal/xterm/index.ts",
"chars": 18444,
"preview": "import { bind } from 'decko';\nimport type { IDisposable, ITerminalOptions } from '@xterm/xterm';\nimport { Terminal } fro"
},
{
"path": "html/src/index.tsx",
"chars": 238,
"preview": "if (process.env.NODE_ENV === 'development') {\n require('preact/debug');\n}\nimport 'whatwg-fetch';\nimport { h, render }"
},
{
"path": "html/src/style/index.scss",
"chars": 239,
"preview": "html,\nbody {\n height: 100%;\n min-height: 100%;\n margin: 0;\n overflow: hidden;\n}\n\n#terminal-container {\n width: auto"
},
{
"path": "html/src/template.html",
"chars": 665,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=ed"
},
{
"path": "html/tsconfig.json",
"chars": 433,
"preview": "{\n \"extends\": \"./node_modules/gts/tsconfig-google.json\",\n \"compilerOptions\": {\n \"moduleResolution\": \"node\",\n \"es"
},
{
"path": "html/webpack.config.js",
"chars": 2837,
"preview": "const path = require('path');\nconst { merge } = require('webpack-merge');\nconst ESLintPlugin = require('eslint-webpack-p"
},
{
"path": "man/README.md",
"chars": 107,
"preview": "# Building the man page\n\n```bash\ngo get github.com/cpuguy83/go-md2man\ngo-md2man < ttyd.man.md > ttyd.1\n```"
},
{
"path": "man/ttyd.1",
"chars": 8757,
"preview": ".nh\n.TH ttyd 1 \"September 2016\" ttyd \"User Manual\"\n\n.SH NAME\n.PP\nttyd - Share your terminal over the web\n\n\n.SH SYNOPSIS\n"
},
{
"path": "man/ttyd.man.md",
"chars": 8202,
"preview": "ttyd 1 \"September 2016\" ttyd \"User Manual\"\n==================================================\n\n# NAME\n ttyd - Share you"
},
{
"path": "scripts/cross-build.sh",
"chars": 7666,
"preview": "#!/bin/bash\n#\n# Example:\n# env BUILD_TARGET=mips ./scripts/cross-build.sh\n#\nset -eo pipefail\n\nCROSS_ROOT=\"${CROS"
},
{
"path": "snap/snapcraft.yaml",
"chars": 969,
"preview": "name: ttyd\nadopt-info: ttyd\nsummary: Share your terminal over the web\ndescription: |\n ttyd is a simple command-line tool"
},
{
"path": "src/compat.h",
"chars": 404,
"preview": "/* compat.h -- MSVC compatibility shims for POSIX functions */\n#ifndef TTYD_COMPAT_H\n#define TTYD_COMPAT_H\n\n#ifdef _MSC_"
},
{
"path": "src/html.h",
"chars": 1197154,
"preview": "unsigned char index_html[] = {\n 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xec, 0xbd,\n 0x69, 0x77, 0"
},
{
"path": "src/http.c",
"chars": 8347,
"preview": "#include <libwebsockets.h>\n#include <string.h>\n#include <zlib.h>\n\n#include \"html.h\"\n#include \"server.h\"\n#include \"utils."
},
{
"path": "src/protocol.c",
"chars": 12310,
"preview": "#include <errno.h>\n#include <json.h>\n#include <libwebsockets.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib"
},
{
"path": "src/pty.c",
"chars": 13949,
"preview": "#include <errno.h>\n#include <fcntl.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#i"
},
{
"path": "src/pty.h",
"chars": 1491,
"preview": "#ifndef TTYD_PTY_H\n#define TTYD_PTY_H\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <uv.h>\n\n#ifdef _WIN32\n#ifndef H"
},
{
"path": "src/server.c",
"chars": 22506,
"preview": "#include \"server.h\"\n\n#include <errno.h>\n#include <getopt.h>\n#include <json.h>\n#include <libwebsockets.h>\n#include <signa"
},
{
"path": "src/server.h",
"chars": 2167,
"preview": "#include <libwebsockets.h>\n#include <stdbool.h>\n#include <uv.h>\n\n#include \"pty.h\"\n\n// client message\n#define INPUT '0'\n#"
},
{
"path": "src/utils.c",
"chars": 4549,
"preview": "#include <ctype.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#i"
},
{
"path": "src/utils.h",
"chars": 1002,
"preview": "#ifndef TTYD_UTIL_H\n#define TTYD_UTIL_H\n\n#define container_of(ptr, type, member) \\\n ({ "
}
]
About this extraction
This page contains the full source code of the tsl0922/ttyd GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 55 files (1.3 MB), approximately 1.0M tokens, and a symbol index with 151 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.