diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bebc02..f0cdcd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ string(TIMESTAMP RELEASE_DATE "%Y-%m-%d") # Configure version.hpp file configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/src/version.hpp.in" - "${CMAKE_CURRENT_BINARY_DIR}/src/version.hpp" + "${CMAKE_CURRENT_BINARY_DIR}/src/autogen/version.hpp" @ONLY ) @@ -56,6 +56,7 @@ target_include_directories(dropshell PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/utils ${CMAKE_CURRENT_SOURCE_DIR}/src/contrib ${CMAKE_CURRENT_SOURCE_DIR}/src/commands + ${CMAKE_CURRENT_SOURCE_DIR}/src/autogen ) if(WIN32) diff --git a/make_createagent.sh b/make_createagent.sh index a5775b6..c12b1d3 100755 --- a/make_createagent.sh +++ b/make_createagent.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -e # This script creates two files: # src/utils/createagent.hpp @@ -7,123 +8,12 @@ SCRIPT_DIR=$(dirname "$0") +# check if dehydrate is installed +if ! command -v dehydrate &> /dev/null; then + echo "dehydrate could not be found - installing" + curl -fsSL https://gitea.jde.nz/public/dehydrate/releases/download/latest/install.sh | bash +fi -# heredoc to create the createagent.hpp file. -cat < "$SCRIPT_DIR/src/utils/createagent.hpp" -#ifndef CREATEAGENT_HPP -#define CREATEAGENT_HPP +SCRIPT_DIR=$(dirname "$0") -/* - -CREATEAGENT.HPP IS AUTOMATICALLY GENERATED FROM make_createagent.sh, -and recreates the files in /agent/ on a remote server. - -DO NOT EDIT THIS FILE MANUALLY! Edit make_createagent.sh instead. - -*/ - -#include - -namespace dropshell { - int create_agent(const std::string &server_name); -} - -#endif // CREATEAGENT_HPP -EOF - - -# heredoc to create the createagent.cpp file. -cat < "$SCRIPT_DIR/src/utils/createagent.cpp" -#include "createagent.hpp" -#include "utils.hpp" -#include "directories.hpp" -#include "execute.hpp" -#include "server_env_manager.hpp" - -#include -#include -#include - - -/* - -CREATEAGENT.CPP IS AUTOMATICALLY GENERATED FROM make_createagent.sh, -and recreates the files in /agent/ on a remote server. - -DO NOT EDIT THIS FILE MANUALLY! Edit make_createagent.sh instead. - -*/ - - -namespace dropshell { - - struct AgentFile { - std::string filename; - std::string content; - }; - - - int load_agent_file_contents(std::vector &agent_files); - int remote_write_file(const sSSHInfo &ssh_info, const AgentFile &file); - - int create_agent(const std::string &server_name) { - // create the sh file on the remote server. - server_env_manager server_env(server_name); - if (!server_env.is_valid()) { - std::cerr << "Invalid server environment for " << server_name << std::endl; - return 1; - } - - // create the agent directory. - std::string agent_dir = remotepath::agent(server_name); - execute_ssh_command(server_env.get_SSH_INFO(), sCommand("","mkdir -p " + agent_dir,{}), cMode::Silent); - - std::vector agent_files; - load_agent_file_contents(agent_files); - - // create the sh file on the remote server. - for (const auto &file : agent_files) { - // write out the file contents in the file. - if (remote_write_file(server_env.get_SSH_INFO(), file) != 0) { - std::cerr << "Failed to write file " << file.filename << std::endl; - return 1; - } - std::cout << "Wrote file " << file.filename << " on " << server_name << std::endl; - } - - return 0; - } - - int remote_write_file(const sSSHInfo &ssh_info, const AgentFile &file) - { - std::string generate_command = "cat <<'GENERATE_EOF' > " + file.filename + "\n" + file.content + "\nGENERATE_EOF\n"; // use heredoc to write the file. - return execute_ssh_command(ssh_info, sCommand("",generate_command,{}), cMode::Defaults); - } - - // auto generated load_agent_file_contents function goes here, followed by closing } for namespace dropshell. - int load_agent_file_contents(std::vector &agent_files) - { - agent_files={ -CPPEOF - -AGENT_SOURCE_FOLDER="$SCRIPT_DIR/agent" - -# find all the files in the agent source folder. -find "$AGENT_SOURCE_FOLDER" -type f | while read -r file; do - # get the filename without the path. - filename=$(basename "$file") - echo " AgentFile { \"$filename\", R\"AGENTFILE(" >> "$SCRIPT_DIR/src/utils/createagent.cpp" - cat "$file" >> "$SCRIPT_DIR/src/utils/createagent.cpp" - echo ")AGENTFILE\" }," >> "$SCRIPT_DIR/src/utils/createagent.cpp" -done - -# close the namespace dropshell. -cat <> "$SCRIPT_DIR/src/utils/createagent.cpp" - }; // agent_files defined. - - return 0; - } // end of load_agent_file_contents function. - -} // namespace dropshell - -CPPEOF +dehydrate "${SCRIPT_DIR}/agent" "${SCRIPT_DIR}/src/autogen" diff --git a/src/autogen/_agent.cpp b/src/autogen/_agent.cpp new file mode 100644 index 0000000..d3c6587 --- /dev/null +++ b/src/autogen/_agent.cpp @@ -0,0 +1,1111 @@ +#include +#include +#include +#include +#include + + + +/* + + THIS FILE IS AUTO-GENERATED BY DEHYDRATE. + DO NOT EDIT THIS FILE. + +*/ + + +#include "_agent.hpp" +namespace recreate_agent { + + +// Tiny dependency-free FNV-1a 64-bit hash +static uint64_t fnv1a_64(const void* data, size_t len) { + const uint8_t* p = static_cast(data); + uint64_t h = 0xcbf29ce484222325ULL; + for (size_t i = 0; i < len; ++i) + h = (h ^ p[i]) * 0x100000001b3ULL; + return h; +} + +static const unsigned char data__common_sh[] = { + 0x23, 0x20, 0x43, 0x4f, 0x4d, 0x4d, 0x4f, 0x4e, 0x20, 0x46, 0x55, 0x4e, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x0a, 0x23, 0x20, 0x4a, 0x44, 0x45, 0x0a, 0x23, 0x20, 0x32, 0x30, 0x32, 0x35, 0x2d, + 0x30, 0x35, 0x2d, 0x30, 0x33, 0x0a, 0x0a, 0x23, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x54, 0x4f, 0x20, 0x2a, 0x2a, 0x2a, 0x41, 0x4c, 0x4c, 0x2a, 0x2a, 0x2a, 0x20, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x24, 0x7b, 0x41, 0x47, 0x45, + 0x4e, 0x54, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x7d, 0x2f, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x73, 0x68, 0x0a, 0x0a, 0x23, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x0a, 0x0a, 0x23, 0x20, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, + 0x64, 0x69, 0x65, 0x20, 0x22, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x61, + 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x69, 0x74, 0x73, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x63, 0x6f, 0x64, + 0x65, 0x20, 0x31, 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x67, 0x72, 0x65, 0x79, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3a, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x67, 0x72, 0x65, 0x79, 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x67, + 0x72, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x67, 0x72, 0x65, 0x79, 0x2e, 0x0a, 0x23, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x22, + 0x3c, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6d, 0x64, 0x3e, 0x22, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x20, 0x3a, 0x20, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x2e, 0x0a, 0x23, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, + 0x3c, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x3e, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x20, 0x28, 0x63, 0x68, 0x6d, 0x6f, 0x64, 0x20, 0x37, 0x37, 0x37, 0x29, 0x2e, 0x0a, 0x23, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x20, 0x69, 0x66, 0x20, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, + 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x31, 0x20, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x20, 0x3a, 0x20, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2e, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x31, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x0a, + 0x23, 0x20, 0x20, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3a, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x31, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x50, 0x72, + 0x69, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3c, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x3a, 0x20, + 0x50, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, + 0x53, 0x74, 0x6f, 0x70, 0x73, 0x20, 0x61, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x3e, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x53, 0x74, 0x6f, 0x70, 0x73, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2e, 0x0a, 0x23, 0x20, 0x20, 0x20, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x3c, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x20, 0x20, 0x3a, 0x20, 0x50, 0x72, + 0x69, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x0a, 0x23, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x20, 0x22, 0x56, 0x41, 0x52, + 0x31, 0x22, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x65, 0x74, 0x3b, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x73, 0x20, 0x5f, 0x64, 0x69, 0x65, 0x28, 0x29, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x0a, 0x23, 0x20, 0x20, + 0x20, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x74, 0x72, + 0x65, 0x65, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, + 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x2e, 0x0a, 0x0a, 0x23, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x23, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x73, + 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x69, + 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x31, 0x2e, 0x0a, 0x5f, 0x64, 0x69, 0x65, 0x28, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x2d, 0x65, 0x20, 0x22, 0x5c, 0x30, 0x33, + 0x33, 0x5b, 0x39, 0x31, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x24, 0x31, 0x5c, 0x30, + 0x33, 0x33, 0x5b, 0x30, 0x6d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, + 0x31, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x72, 0x65, 0x79, 0x2e, 0x0a, 0x5f, + 0x67, 0x72, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x2d, 0x65, 0x20, 0x2d, 0x6e, 0x20, 0x22, 0x5c, + 0x30, 0x33, 0x33, 0x5b, 0x39, 0x30, 0x6d, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x67, 0x72, 0x65, 0x79, 0x2e, 0x0a, 0x5f, 0x67, 0x72, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x64, 0x28, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x2d, 0x65, 0x20, + 0x2d, 0x6e, 0x20, 0x22, 0x5c, 0x30, 0x33, 0x33, 0x5b, 0x30, 0x6d, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, + 0x23, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, + 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2c, 0x20, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x2e, + 0x0a, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x28, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x2d, 0x7a, 0x20, 0x22, 0x24, 0x31, + 0x22, 0x20, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x20, 0x2d, 0x7a, 0x20, 0x22, 0x24, 0x32, 0x22, + 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x64, 0x69, 0x65, 0x20, 0x22, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x6e, + 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x20, 0x3c, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6d, 0x64, 0x3e, 0x20, 0x3c, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3e, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x69, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6d, 0x64, 0x3d, 0x22, 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x24, 0x32, 0x22, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x24, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x26, 0x26, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x20, 0x24, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x67, 0x72, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6d, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x67, 0x72, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x21, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x64, 0x69, 0x65, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x49, 0x44, 0x3d, 0x24, 0x28, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x24, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x20, 0x69, 0x73, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x49, 0x44, 0x20, 0x24, 0x7b, 0x49, 0x44, 0x7d, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, + 0x23, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6f, 0x65, 0x73, + 0x6e, 0x27, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x20, 0x28, 0x63, 0x68, 0x6d, 0x6f, 0x64, + 0x20, 0x37, 0x37, 0x37, 0x29, 0x2e, 0x0a, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x66, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x24, 0x31, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x2d, 0x64, 0x20, 0x22, 0x24, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x21, 0x20, 0x6d, + 0x6b, 0x64, 0x69, 0x72, 0x20, 0x2d, 0x70, 0x20, 0x22, 0x24, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x22, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x64, 0x69, 0x65, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x24, + 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x68, 0x6d, 0x6f, 0x64, 0x20, 0x37, 0x37, 0x37, 0x20, 0x22, 0x24, 0x66, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, + 0x22, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x3a, + 0x20, 0x24, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, + 0x69, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x2c, 0x20, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x20, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x31, 0x20, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x0a, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x64, 0x6f, 0x63, + 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x28, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x21, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x20, 0x2d, 0x76, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x26, 0x3e, 0x20, + 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x44, 0x6f, + 0x63, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x64, + 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x21, + 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x26, 0x3e, 0x20, + 0x2f, 0x64, 0x65, 0x76, 0x2f, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x44, 0x6f, + 0x63, 0x6b, 0x65, 0x72, 0x20, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x20, 0x69, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x64, + 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x21, 0x20, 0x64, + 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x2d, 0x2d, 0x72, 0x6d, 0x20, 0x68, + 0x65, 0x6c, 0x6c, 0x6f, 0x2d, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x20, 0x26, 0x3e, 0x20, 0x2f, 0x64, + 0x65, 0x76, 0x2f, 0x6e, 0x75, 0x6c, 0x6c, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x55, 0x73, 0x65, 0x72, + 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, + 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x7d, + 0x0a, 0x0a, 0x23, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x28, 0x61, 0x6e, 0x79, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2e, 0x20, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x31, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x0a, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x21, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x70, + 0x73, 0x20, 0x2d, 0x61, 0x20, 0x2d, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x22, 0x7b, + 0x7b, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x7d, 0x7d, 0x22, 0x20, 0x7c, 0x20, 0x67, 0x72, 0x65, + 0x70, 0x20, 0x2d, 0x71, 0x20, 0x22, 0x5e, 0x24, 0x31, 0x24, 0x22, 0x3b, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x20, 0x69, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x31, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x2e, 0x0a, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x21, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x70, 0x73, 0x20, 0x2d, + 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x22, 0x7b, 0x7b, 0x2e, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x7d, 0x7d, 0x22, 0x20, 0x7c, 0x20, 0x67, 0x72, 0x65, 0x70, 0x20, 0x2d, 0x71, 0x20, 0x22, + 0x5e, 0x24, 0x31, 0x24, 0x22, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, + 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x49, 0x44, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x0a, 0x5f, 0x67, 0x65, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x28, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x70, 0x73, 0x20, + 0x2d, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x22, 0x7b, 0x7b, 0x2e, 0x49, 0x44, 0x7d, + 0x7d, 0x22, 0x20, 0x2d, 0x2d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x24, 0x31, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x0a, 0x5f, 0x67, 0x65, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, + 0x20, 0x70, 0x73, 0x20, 0x2d, 0x2d, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x22, 0x7b, 0x7b, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x7d, 0x7d, 0x22, 0x20, 0x2d, 0x2d, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x24, 0x31, 0x22, 0x0a, 0x7d, 0x0a, + 0x0a, 0x23, 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x0a, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x24, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x24, 0x31, 0x20, 0x26, 0x26, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x20, 0x24, 0x31, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x53, 0x74, 0x6f, 0x70, 0x73, 0x20, 0x61, + 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x0a, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x69, 0x73, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x24, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x73, 0x74, 0x6f, + 0x70, 0x20, 0x24, 0x31, 0x0a, 0x7d, 0x20, 0x20, 0x20, 0x0a, 0x0a, 0x23, 0x20, 0x53, 0x74, 0x6f, + 0x70, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x29, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x0a, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x20, 0x24, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x24, 0x31, + 0x20, 0x7c, 0x7c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x6d, 0x20, 0x24, 0x31, 0x0a, 0x7d, + 0x0a, 0x0a, 0x23, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x6f, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x2e, 0x0a, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x21, 0x20, 0x5f, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x24, 0x31, 0x3b, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, + 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x24, 0x31, 0x20, 0x64, + 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, + 0x65, 0x72, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x24, 0x31, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x65, 0x74, 0x3b, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x5f, 0x64, 0x69, 0x65, 0x28, 0x29, 0x20, 0x69, 0x66, 0x20, + 0x61, 0x6e, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, + 0x0a, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x65, 0x6e, 0x76, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x76, 0x61, 0x72, 0x73, 0x3d, 0x28, 0x22, 0x24, 0x40, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x76, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x22, 0x24, 0x7b, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x5b, 0x40, 0x5d, 0x7d, + 0x22, 0x3b, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x5b, 0x20, 0x2d, 0x7a, 0x20, 0x22, 0x24, 0x7b, 0x21, 0x76, 0x61, 0x72, 0x7d, 0x22, 0x20, + 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x64, 0x69, 0x65, 0x20, 0x22, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x24, 0x76, 0x61, 0x72, 0x20, 0x69, 0x73, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x0a, 0x7d, 0x0a, 0x0a, + 0x23, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x44, 0x6f, + 0x63, 0x6b, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x20, 0x28, + 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x29, + 0x2e, 0x0a, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x74, + 0x72, 0x65, 0x65, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x3d, 0x22, 0x24, 0x31, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x24, 0x28, 0x64, 0x69, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x24, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x62, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x3d, 0x24, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x22, 0x24, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x3d, 0x24, 0x28, 0x62, 0x61, 0x73, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x24, + 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x2d, 0x2d, 0x72, 0x6d, 0x20, + 0x2d, 0x76, 0x20, 0x22, 0x24, 0x61, 0x62, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, + 0x3a, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x6c, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x72, 0x6d, + 0x20, 0x2d, 0x72, 0x66, 0x20, 0x22, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x24, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x23, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x61, + 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x0a, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x22, 0x24, 0x7b, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x41, 0x54, 0x48, + 0x7d, 0x2f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, + 0x73, 0x68, 0x22 +}; +static const size_t len__common_sh = 5763; +static uint64_t hash__common_sh = 11110864345927016405U; +static const char* rel__common_sh = "_common.sh"; +static const unsigned char data__nuke_other_sh[] = { + 0x23, 0x21, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x68, 0x0a, 0x0a, 0x53, 0x43, 0x52, + 0x49, 0x50, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x3d, 0x22, 0x24, 0x28, 0x20, 0x63, 0x64, 0x20, 0x22, + 0x24, 0x28, 0x20, 0x64, 0x69, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x24, 0x7b, 0x42, 0x41, + 0x53, 0x48, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5b, 0x30, 0x5d, 0x7d, 0x22, 0x20, 0x29, + 0x22, 0x20, 0x26, 0x26, 0x20, 0x70, 0x77, 0x64, 0x20, 0x29, 0x22, 0x0a, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x22, 0x24, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x2f, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x2f, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, + 0x68, 0x22, 0x0a, 0x0a, 0x0a, 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x3d, 0x22, + 0x24, 0x31, 0x22, 0x0a, 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x41, + 0x54, 0x48, 0x3d, 0x22, 0x24, 0x32, 0x22, 0x0a, 0x0a, 0x0a, 0x23, 0x20, 0x31, 0x2e, 0x20, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, + 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x0a, 0x5b, 0x20, 0x2d, 0x64, 0x20, + 0x22, 0x24, 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, + 0x22, 0x20, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x5f, 0x64, 0x69, 0x65, 0x20, 0x22, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x3a, 0x20, 0x24, 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x22, 0x0a, 0x0a, 0x23, 0x20, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x0a, 0x69, 0x66, 0x20, 0x5b, + 0x20, 0x2d, 0x66, 0x20, 0x22, 0x24, 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x50, 0x41, 0x54, 0x48, 0x2f, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x2e, 0x73, + 0x68, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x24, + 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x2f, 0x75, + 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x2e, 0x73, 0x68, 0x0a, 0x66, 0x69, 0x0a, 0x0a, + 0x23, 0x20, 0x6e, 0x75, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x0a, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x2d, 0x66, 0x20, 0x22, 0x24, 0x41, 0x5f, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x2f, 0x6e, 0x75, 0x6b, 0x65, + 0x2e, 0x73, 0x68, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x24, 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, + 0x2f, 0x6e, 0x75, 0x6b, 0x65, 0x2e, 0x73, 0x68, 0x0a, 0x66, 0x69, 0x0a, 0x0a, 0x23, 0x20, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x0a, 0x72, 0x6d, 0x20, 0x2d, + 0x72, 0x66, 0x20, 0x22, 0x24, 0x41, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, + 0x41, 0x54, 0x48, 0x22, 0x0a +}; +static const size_t len__nuke_other_sh = 533; +static uint64_t hash__nuke_other_sh = 14046958915324057884U; +static const char* rel__nuke_other_sh = "_nuke_other.sh"; +static const unsigned char data__allservicesstatus_sh[] = { + 0x23, 0x21, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x68, 0x0a, 0x0a, 0x23, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x20, 0x41, 0x4c, 0x4c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x2e, 0x0a, 0x0a, 0x23, 0x20, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, + 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x45, 0x4e, 0x56, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x3a, 0x0a, 0x23, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x3d, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x7c, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x7c, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x0a, 0x23, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x3d, 0x70, 0x6f, 0x72, 0x74, 0x31, + 0x2c, 0x70, 0x6f, 0x72, 0x74, 0x32, 0x2c, 0x70, 0x6f, 0x72, 0x74, 0x33, 0x0a, 0x0a, 0x23, 0x20, + 0x47, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x0a, 0x53, + 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x3d, 0x22, 0x24, 0x28, 0x64, 0x69, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x22, 0x24, 0x30, 0x22, 0x29, 0x22, 0x0a, 0x0a, 0x23, 0x20, 0x2f, + 0x2f, 0x20, 0x44, 0x52, 0x4f, 0x50, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x5f, 0x44, 0x49, 0x52, 0x0a, + 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x73, 0x0a, 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x0a, 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x20, 0x3c, 0x2d, + 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, + 0x20, 0x61, 0x73, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x0a, 0x23, 0x20, 0x2f, 0x2f, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, + 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x65, 0x6e, 0x76, 0x0a, 0x23, + 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x2d, + 0x2d, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x0a, 0x23, 0x20, 0x2f, 0x2f, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x2d, + 0x2d, 0x20, 0x28, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29, + 0x0a, 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x0a, 0x23, + 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x5f, 0x61, 0x6c, 0x6c, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x73, 0x68, 0x0a, + 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x0a, 0x23, 0x20, + 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x65, 0x6e, 0x76, 0x0a, 0x23, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x2d, 0x2d, 0x20, + 0x28, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x26, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x29, + 0x0a, 0x0a, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, + 0x3d, 0x22, 0x22, 0x0a, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x49, 0x54, + 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x3d, 0x30, 0x0a, 0x0a, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x64, 0x6f, + 0x74, 0x65, 0x6e, 0x76, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x24, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x2d, 0x66, 0x20, 0x22, 0x24, 0x7b, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x20, 0x22, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x28, 0x29, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x24, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3d, 0x24, + 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3d, 0x24, 0x7b, 0x33, 0x3a, 0x2d, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x7d, 0x20, 0x20, 0x23, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x23, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x21, 0x20, 0x2d, 0x66, 0x20, + 0x22, 0x24, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, + 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x24, 0x7b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x7d, 0x2e, 0x73, 0x68, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x72, + 0x75, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x20, 0x73, 0x75, 0x62, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, + 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x3d, 0x24, + 0x28, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x20, 0x2d, 0x61, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x64, 0x6f, + 0x74, 0x65, 0x6e, 0x76, 0x20, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x5f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x65, 0x6e, 0x76, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x64, 0x6f, 0x74, 0x65, 0x6e, 0x76, + 0x20, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x65, 0x6e, 0x76, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x74, 0x20, 0x2b, 0x61, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, + 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, + 0x5f, 0x50, 0x41, 0x54, 0x48, 0x3d, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x20, + 0x69, 0x73, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x3d, 0x22, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x41, 0x4d, + 0x45, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x22, 0x24, 0x63, 0x61, 0x70, 0x74, + 0x75, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3d, 0x20, 0x22, 0x74, + 0x72, 0x75, 0x65, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x43, 0x61, 0x70, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x61, 0x73, 0x68, 0x20, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, + 0x24, 0x7b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x7d, 0x2e, 0x73, 0x68, 0x22, 0x20, 0x32, + 0x3e, 0x26, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x52, + 0x75, 0x6e, 0x20, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, + 0x68, 0x20, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x7d, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x24, 0x7b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x7d, 0x2e, 0x73, 0x68, 0x22, 0x20, 0x3e, 0x20, 0x2f, 0x64, 0x65, + 0x76, 0x2f, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x32, 0x3e, 0x26, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x5f, 0x43, 0x4f, + 0x44, 0x45, 0x3d, 0x24, 0x3f, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, + 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x24, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x3d, 0x24, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x21, 0x20, 0x2d, + 0x66, 0x20, 0x22, 0x24, 0x7b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x7d, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2f, 0x24, 0x7b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x7d, 0x2e, 0x73, 0x68, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x20, 0x47, 0x65, 0x74, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x0a, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x3d, 0x24, 0x28, 0x72, 0x65, 0x61, 0x6c, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x22, 0x24, 0x7b, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x5f, 0x44, + 0x49, 0x52, 0x7d, 0x2f, 0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x22, 0x29, 0x0a, + 0x0a, 0x23, 0x20, 0x47, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, + 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x3d, 0x24, 0x28, 0x6c, 0x73, 0x20, 0x22, 0x24, 0x7b, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x7d, 0x22, 0x29, 0x0a, + 0x0a, 0x23, 0x20, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x41, + 0x4d, 0x45, 0x20, 0x69, 0x6e, 0x20, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x4e, 0x41, 0x4d, 0x45, 0x53, 0x7d, 0x3b, 0x20, 0x64, 0x6f, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x3d, 0x24, 0x28, 0x72, + 0x65, 0x61, 0x6c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x22, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x53, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x7d, 0x2f, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x7d, 0x22, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x23, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x47, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x21, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x22, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x7d, 0x22, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x3d, + 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x7d, 0x22, 0x20, 0x22, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0x20, 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x22, 0x24, 0x7b, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, + 0x54, 0x5f, 0x45, 0x58, 0x49, 0x54, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x7d, 0x22, 0x20, 0x2d, 0x65, + 0x71, 0x20, 0x30, 0x20, 0x5d, 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x3d, 0x22, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x3d, 0x22, 0x75, 0x6e, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x23, 0x20, 0x47, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x21, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x73, 0x20, 0x22, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, + 0x48, 0x7d, 0x22, 0x20, 0x22, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x22, 0x3b, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x3d, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x7d, 0x22, 0x20, 0x22, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x22, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x3d, 0x22, + 0x24, 0x7b, 0x43, 0x55, 0x52, 0x52, 0x45, 0x4e, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, + 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x24, 0x7b, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x7d, 0x5f, 0x48, 0x45, 0x41, + 0x4c, 0x54, 0x48, 0x3d, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x48, 0x45, + 0x41, 0x4c, 0x54, 0x48, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, + 0x22, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x7d, + 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x3d, 0x24, 0x7b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, + 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x53, 0x7d, 0x22, 0x0a, 0x64, 0x6f, 0x6e, 0x65, 0x0a +}; +static const size_t len__allservicesstatus_sh = 3230; +static uint64_t hash__allservicesstatus_sh = 1995642360604494489U; +static const char* rel__allservicesstatus_sh = "_allservicesstatus.sh"; +static const unsigned char data__autocommands_sh[] = { + 0x23, 0x21, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x62, 0x61, 0x73, 0x68, 0x0a, 0x0a, 0x23, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x2e, 0x0a, 0x0a, 0x4d, 0x59, 0x49, 0x44, 0x3d, + 0x24, 0x28, 0x69, 0x64, 0x20, 0x2d, 0x75, 0x29, 0x0a, 0x4d, 0x59, 0x47, 0x52, 0x50, 0x3d, 0x24, + 0x28, 0x69, 0x64, 0x20, 0x2d, 0x67, 0x29, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x75, 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x28, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3d, 0x22, 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x22, 0x24, 0x32, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x24, + 0x33, 0x22, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x22, 0x24, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x24, 0x7b, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x24, 0x7b, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6b, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x4e, 0x75, 0x6b, 0x69, + 0x6e, 0x67, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x20, 0x72, 0x6d, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x75, + 0x70, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x20, + 0x2d, 0x2d, 0x72, 0x6d, 0x20, 0x2d, 0x76, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x2d, + 0x76, 0x20, 0x24, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x7d, 0x3a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x62, 0x69, 0x61, + 0x6e, 0x20, 0x62, 0x61, 0x73, 0x68, 0x20, 0x2d, 0x63, 0x20, 0x22, 0x74, 0x61, 0x72, 0x20, 0x2d, + 0x63, 0x7a, 0x76, 0x66, 0x20, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x2e, 0x74, 0x67, 0x7a, 0x20, 0x2d, 0x43, 0x20, 0x2f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x20, 0x2e, 0x20, 0x26, 0x26, 0x20, 0x63, 0x68, 0x6f, 0x77, 0x6e, 0x20, 0x2d, 0x52, + 0x20, 0x24, 0x4d, 0x59, 0x49, 0x44, 0x3a, 0x24, 0x4d, 0x59, 0x47, 0x52, 0x50, 0x20, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x20, 0x72, 0x6d, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x2d, 0x2d, 0x72, + 0x6d, 0x20, 0x2d, 0x76, 0x20, 0x24, 0x7b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x3a, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x2d, 0x76, 0x20, 0x24, + 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x3a, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x62, + 0x61, 0x73, 0x68, 0x20, 0x2d, 0x63, 0x20, 0x22, 0x74, 0x61, 0x72, 0x20, 0x2d, 0x78, 0x7a, 0x76, + 0x66, 0x20, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x74, 0x67, 0x7a, 0x20, 0x2d, 0x43, 0x20, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, + 0x2d, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x3d, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x73, 0x61, 0x63, 0x0a, 0x7d, 0x20, + 0x20, 0x20, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x72, 0x75, 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3d, 0x22, + 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x3d, 0x22, 0x24, 0x32, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, + 0x22, 0x24, 0x33, 0x22, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x22, + 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x24, 0x7b, 0x70, + 0x61, 0x74, 0x68, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x2d, 0x70, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, + 0x68, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6b, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, + 0x20, 0x22, 0x4e, 0x75, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x24, 0x7b, + 0x70, 0x61, 0x74, 0x68, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x24, 0x28, 0x64, 0x69, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x24, + 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x24, 0x28, 0x62, 0x61, 0x73, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x2d, 0x64, 0x20, 0x22, 0x24, 0x7b, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x2f, 0x24, 0x7b, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x7d, 0x22, 0x20, 0x5d, 0x3b, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x2d, + 0x2d, 0x72, 0x6d, 0x20, 0x2d, 0x76, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x3a, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x64, 0x65, + 0x62, 0x69, 0x61, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x68, 0x20, 0x2d, 0x63, 0x20, 0x22, 0x72, 0x6d, + 0x20, 0x2d, 0x72, 0x66, 0x20, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2f, 0x24, 0x7b, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x7d, 0x22, 0x20, 0x7c, 0x7c, 0x20, 0x65, + 0x63, 0x68, 0x6f, 0x20, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6e, + 0x75, 0x6b, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x50, 0x61, 0x74, 0x68, 0x20, 0x24, 0x7b, + 0x70, 0x61, 0x74, 0x68, 0x7d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x20, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x20, 0x6e, 0x75, 0x6b, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, + 0x75, 0x70, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x5b, 0x20, 0x2d, 0x64, 0x20, 0x22, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x22, 0x20, 0x5d, + 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x75, + 0x6e, 0x20, 0x2d, 0x2d, 0x72, 0x6d, 0x20, 0x2d, 0x76, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, + 0x7d, 0x3a, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2d, 0x76, 0x20, 0x24, 0x7b, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x3a, 0x2f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x68, 0x20, + 0x2d, 0x63, 0x20, 0x22, 0x74, 0x61, 0x72, 0x20, 0x2d, 0x63, 0x7a, 0x76, 0x66, 0x20, 0x2f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x74, 0x67, 0x7a, + 0x20, 0x2d, 0x43, 0x20, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x20, 0x26, 0x26, 0x20, 0x63, + 0x68, 0x6f, 0x77, 0x6e, 0x20, 0x2d, 0x52, 0x20, 0x24, 0x4d, 0x59, 0x49, 0x44, 0x3a, 0x24, 0x4d, + 0x59, 0x47, 0x52, 0x50, 0x20, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x63, 0x68, 0x6f, 0x20, 0x22, 0x50, 0x61, 0x74, 0x68, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, + 0x7d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x20, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x72, 0x20, 0x2d, + 0x78, 0x7a, 0x76, 0x66, 0x20, 0x24, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x74, 0x67, 0x7a, + 0x20, 0x2d, 0x43, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x20, 0x2d, 0x2d, 0x73, 0x74, + 0x72, 0x69, 0x70, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x3d, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x73, 0x61, 0x63, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3d, 0x22, 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x22, + 0x24, 0x32, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x24, 0x33, 0x22, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x22, 0x24, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x75, 0x6b, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x6d, 0x20, 0x2d, 0x66, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, + 0x74, 0x68, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x63, 0x68, 0x6f, 0x20, 0x22, 0x42, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x70, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x7d, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, + 0x24, 0x28, 0x64, 0x69, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, + 0x70, 0x61, 0x74, 0x68, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x24, 0x28, 0x62, 0x61, 0x73, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x24, 0x7b, + 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x20, 0x2d, 0x66, 0x20, 0x22, + 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x2f, 0x24, + 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x20, 0x5d, 0x3b, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x20, + 0x2d, 0x2d, 0x72, 0x6d, 0x20, 0x2d, 0x76, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x7d, 0x3a, 0x2f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x2d, + 0x76, 0x20, 0x24, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x7d, 0x3a, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x64, 0x65, 0x62, 0x69, 0x61, + 0x6e, 0x20, 0x62, 0x61, 0x73, 0x68, 0x20, 0x2d, 0x63, 0x20, 0x22, 0x63, 0x70, 0x20, 0x2f, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2f, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x7d, 0x20, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x24, 0x7b, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x26, 0x26, 0x20, 0x63, 0x68, 0x6f, 0x77, 0x6e, + 0x20, 0x2d, 0x52, 0x20, 0x24, 0x4d, 0x59, 0x49, 0x44, 0x3a, 0x24, 0x4d, 0x59, 0x47, 0x52, 0x50, + 0x20, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, + 0x22, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, + 0x7d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x20, 0x2d, 0x20, 0x6e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, + 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x24, + 0x28, 0x62, 0x61, 0x73, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, + 0x70, 0x61, 0x74, 0x68, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x70, 0x20, 0x24, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x66, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x2f, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x7d, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x73, 0x61, 0x63, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, 0x6f, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2c, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x74, 0x77, + 0x6f, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, + 0x79, 0x20, 0x70, 0x61, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x3a, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x23, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x23, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x63, 0x61, + 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6f, 0x72, 0x20, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x20, 0x77, 0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x3a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x20, 0x20, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x72, 0x75, 0x6e, + 0x20, 0x3c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3e, 0x20, 0x3c, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x66, 0x69, 0x6c, 0x65, 0x3e, 0x20, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x20, 0x3c, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3d, 0x22, 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x68, 0x69, 0x66, 0x74, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x3d, 0x22, 0x24, 0x31, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x68, 0x69, + 0x66, 0x74, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x61, 0x75, + 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x70, 0x61, 0x72, 0x73, 0x65, 0x3a, 0x20, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x3d, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x3d, 0x24, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x20, 0x70, 0x61, 0x74, + 0x68, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x3d, 0x28, 0x22, 0x24, 0x40, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x3d, 0x24, 0x7b, 0x23, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x40, 0x5d, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x28, 0x69, 0x3d, + 0x30, 0x3b, 0x20, 0x69, 0x3c, 0x24, 0x61, 0x72, 0x67, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x3b, + 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x29, 0x3b, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x3d, 0x22, 0x24, + 0x7b, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x69, 0x5d, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x53, + 0x6b, 0x69, 0x70, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6b, 0x65, + 0x79, 0x3d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5b, 0x5b, 0x20, 0x22, 0x24, 0x70, + 0x61, 0x69, 0x72, 0x22, 0x20, 0x21, 0x3d, 0x20, 0x2a, 0x22, 0x3d, 0x22, 0x2a, 0x20, 0x5d, 0x5d, + 0x3b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, + 0x79, 0x3d, 0x22, 0x24, 0x7b, 0x70, 0x61, 0x69, 0x72, 0x25, 0x25, 0x3d, 0x2a, 0x7d, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x24, 0x7b, 0x70, 0x61, 0x69, 0x72, 0x23, 0x2a, 0x3d, 0x7d, 0x22, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6b, 0x65, 0x79, 0x2f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x62, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d, 0x24, 0x28, 0x65, 0x63, + 0x68, 0x6f, 0x20, 0x22, 0x24, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x5f, 0x24, 0x7b, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x7d, 0x22, 0x20, 0x7c, 0x20, 0x74, 0x72, 0x20, 0x2d, 0x63, 0x64, 0x20, 0x27, 0x5b, + 0x3a, 0x61, 0x6c, 0x6e, 0x75, 0x6d, 0x3a, 0x5d, 0x5f, 0x2d, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x70, 0x61, 0x74, 0x68, 0x3d, 0x22, 0x24, 0x7b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, + 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x24, 0x7b, 0x62, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x6b, 0x64, 0x69, 0x72, 0x20, 0x2d, 0x70, 0x20, 0x24, 0x7b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x70, 0x61, 0x74, 0x68, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, + 0x20, 0x4b, 0x65, 0x79, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x6e, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x22, 0x24, 0x6b, 0x65, 0x79, 0x22, 0x20, 0x69, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x72, 0x75, 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x22, 0x24, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x22, 0x24, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x22, + 0x24, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x70, 0x61, 0x74, 0x68, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x75, + 0x6e, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x22, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x22, 0x20, 0x22, 0x24, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x22, 0x24, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x70, 0x61, 0x74, 0x68, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x20, 0x22, 0x24, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20, 0x22, 0x24, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x22, 0x24, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2a, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x64, 0x69, 0x65, 0x20, 0x22, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x24, 0x6b, 0x65, 0x79, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x24, 0x7b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x7d, 0x2e, 0x20, 0x57, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2c, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3b, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x73, 0x61, 0x63, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x61, 0x75, 0x74, + 0x6f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x20, 0x22, 0x24, + 0x40, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x6e, 0x75, 0x6b, 0x65, 0x28, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x6e, 0x75, 0x6b, 0x65, 0x20, 0x6e, + 0x6f, 0x6e, 0x65, 0x20, 0x22, 0x24, 0x40, 0x22, 0x0a, 0x7d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x65, + 0x6e, 0x76, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x20, 0x22, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, + 0x46, 0x49, 0x4c, 0x45, 0x22, 0x20, 0x22, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x44, 0x49, 0x52, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x45, 0x4d, 0x50, + 0x5f, 0x50, 0x41, 0x54, 0x48, 0x3d, 0x22, 0x24, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x44, 0x49, 0x52, + 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x22, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x6b, 0x64, 0x69, 0x72, 0x20, 0x2d, 0x70, 0x20, 0x22, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, + 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x63, 0x68, 0x6f, 0x20, 0x22, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x5b, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5d, + 0x20, 0x5b, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x50, + 0x41, 0x54, 0x48, 0x5d, 0x20, 0x5b, 0x24, 0x40, 0x5d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x20, 0x22, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, + 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x20, 0x22, 0x24, 0x40, 0x22, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x72, 0x20, 0x7a, 0x63, 0x76, 0x66, 0x20, 0x22, + 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x22, 0x20, 0x2d, 0x43, + 0x20, 0x22, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x50, + 0x41, 0x54, 0x48, 0x22, 0x20, 0x2e, 0x0a, 0x7d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x28, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x65, 0x6e, + 0x76, 0x5f, 0x76, 0x61, 0x72, 0x73, 0x20, 0x22, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x46, + 0x49, 0x4c, 0x45, 0x22, 0x20, 0x22, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x44, 0x49, 0x52, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, + 0x50, 0x41, 0x54, 0x48, 0x3d, 0x22, 0x24, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x44, 0x49, 0x52, 0x2f, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x63, + 0x68, 0x6f, 0x20, 0x22, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x5b, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5d, 0x20, + 0x5b, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x50, 0x41, + 0x54, 0x48, 0x5d, 0x20, 0x5b, 0x24, 0x40, 0x5d, 0x22, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x6b, 0x64, 0x69, 0x72, 0x20, 0x2d, 0x70, 0x20, 0x22, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, + 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x72, 0x20, 0x7a, 0x78, 0x76, 0x66, 0x20, 0x22, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, + 0x50, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x22, 0x20, 0x2d, 0x43, 0x20, 0x22, 0x24, 0x42, 0x41, 0x43, + 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x20, 0x2d, + 0x2d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x2d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x3d, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x20, 0x22, 0x24, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x45, 0x4d, 0x50, + 0x5f, 0x50, 0x41, 0x54, 0x48, 0x22, 0x20, 0x22, 0x24, 0x40, 0x22, 0x0a, 0x7d, 0x0a +}; +static const size_t len__autocommands_sh = 5854; +static uint64_t hash__autocommands_sh = 16592349636416977993U; +static const char* rel__autocommands_sh = "_autocommands.sh"; + +bool recreate_tree(std::string destination_folder) { + namespace fs = std::filesystem; + bool any_written = false; + { + fs::path outpath = fs::path(destination_folder) / rel__common_sh; + fs::create_directories(outpath.parent_path()); + uint64_t existing_hash; + if (fs::exists(outpath)) { + std::ifstream in(outpath, std::ios::binary); + std::ostringstream oss; oss << in.rdbuf(); + std::string data = oss.str(); + existing_hash = fnv1a_64(data.data(), data.size()); + } + bool needs_write = !fs::exists(outpath) || existing_hash != hash__common_sh; + if (needs_write) { + std::ofstream out(outpath, std::ios::binary); + out.write(reinterpret_cast(data__common_sh), len__common_sh); + } + + if (!fs::exists(outpath)) { + std::cout << "[dehydrate] " << outpath.filename() << ": created\n"; + } else if (needs_write) { + std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n"; + } + any_written = any_written || needs_write; + } + { + fs::path outpath = fs::path(destination_folder) / rel__nuke_other_sh; + fs::create_directories(outpath.parent_path()); + uint64_t existing_hash; + if (fs::exists(outpath)) { + std::ifstream in(outpath, std::ios::binary); + std::ostringstream oss; oss << in.rdbuf(); + std::string data = oss.str(); + existing_hash = fnv1a_64(data.data(), data.size()); + } + bool needs_write = !fs::exists(outpath) || existing_hash != hash__nuke_other_sh; + if (needs_write) { + std::ofstream out(outpath, std::ios::binary); + out.write(reinterpret_cast(data__nuke_other_sh), len__nuke_other_sh); + } + + if (!fs::exists(outpath)) { + std::cout << "[dehydrate] " << outpath.filename() << ": created\n"; + } else if (needs_write) { + std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n"; + } + any_written = any_written || needs_write; + } + { + fs::path outpath = fs::path(destination_folder) / rel__allservicesstatus_sh; + fs::create_directories(outpath.parent_path()); + uint64_t existing_hash; + if (fs::exists(outpath)) { + std::ifstream in(outpath, std::ios::binary); + std::ostringstream oss; oss << in.rdbuf(); + std::string data = oss.str(); + existing_hash = fnv1a_64(data.data(), data.size()); + } + bool needs_write = !fs::exists(outpath) || existing_hash != hash__allservicesstatus_sh; + if (needs_write) { + std::ofstream out(outpath, std::ios::binary); + out.write(reinterpret_cast(data__allservicesstatus_sh), len__allservicesstatus_sh); + } + + if (!fs::exists(outpath)) { + std::cout << "[dehydrate] " << outpath.filename() << ": created\n"; + } else if (needs_write) { + std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n"; + } + any_written = any_written || needs_write; + } + { + fs::path outpath = fs::path(destination_folder) / rel__autocommands_sh; + fs::create_directories(outpath.parent_path()); + uint64_t existing_hash; + if (fs::exists(outpath)) { + std::ifstream in(outpath, std::ios::binary); + std::ostringstream oss; oss << in.rdbuf(); + std::string data = oss.str(); + existing_hash = fnv1a_64(data.data(), data.size()); + } + bool needs_write = !fs::exists(outpath) || existing_hash != hash__autocommands_sh; + if (needs_write) { + std::ofstream out(outpath, std::ios::binary); + out.write(reinterpret_cast(data__autocommands_sh), len__autocommands_sh); + } + + if (!fs::exists(outpath)) { + std::cout << "[dehydrate] " << outpath.filename() << ": created\n"; + } else if (needs_write) { + std::cout << "[dehydrate] " << outpath.filename() << ": updated (hash changed)\n"; + } + any_written = any_written || needs_write; + } + return any_written; +} +} diff --git a/src/autogen/_agent.hpp b/src/autogen/_agent.hpp new file mode 100644 index 0000000..082aa4a --- /dev/null +++ b/src/autogen/_agent.hpp @@ -0,0 +1,15 @@ + +#pragma once + +/* + + THIS FILE IS AUTO-GENERATED BY DEHYDRATE. + DO NOT EDIT THIS FILE. + +*/ + + +#include +namespace recreate_agent { + bool recreate_tree(std::string destination_folder); +} diff --git a/src/version.hpp b/src/autogen/version.hpp similarity index 100% rename from src/version.hpp rename to src/autogen/version.hpp diff --git a/src/commands/install.cpp b/src/commands/install.cpp index b570999..483e016 100644 --- a/src/commands/install.cpp +++ b/src/commands/install.cpp @@ -5,7 +5,7 @@ #include "templates.hpp" #include "shared_commands.hpp" #include "utils/hash.hpp" -#include "utils/createagent.hpp" +#include "autogen/_agent.hpp" #include #include #include @@ -276,6 +276,11 @@ namespace dropshell std::cout << "Updating bb64..." << std::endl; system((localpath::agent() + "bb64 -u").c_str()); // update. } + + + std::cout << "Creating local agent files..." << std::endl; + recreate_agent::recreate_tree(localpath::agent()); + return 0; } @@ -330,7 +335,8 @@ namespace dropshell std::cout << "Downloaded bb64 to " << agent_path << " on remote server." << std::endl; // now create the agent. - create_agent(server); + // copy across from the local agent files. + #pragma message("TODO: copy across from the local agent files.") return 0; // NOTIMPL } diff --git a/src/utils/createagent.cpp b/src/utils/createagent.cpp deleted file mode 100644 index 8a09a45..0000000 --- a/src/utils/createagent.cpp +++ /dev/null @@ -1,596 +0,0 @@ -#include "createagent.hpp" -#include "utils.hpp" -#include "directories.hpp" -#include "execute.hpp" -#include "server_env_manager.hpp" - -#include -#include -#include - - -/* - -CREATEAGENT.CPP IS AUTOMATICALLY GENERATED FROM make_createagent.sh, -and recreates the files in /agent/ on a remote server. - -DO NOT EDIT THIS FILE MANUALLY! Edit make_createagent.sh instead. - -*/ - - -namespace dropshell { - - struct AgentFile { - std::string filename; - std::string content; - }; - - - int load_agent_file_contents(std::vector &agent_files); - int remote_write_file(const sSSHInfo &ssh_info, const AgentFile &file); - - int create_agent(const std::string &server_name) { - // create the sh file on the remote server. - server_env_manager server_env(server_name); - if (!server_env.is_valid()) { - std::cerr << "Invalid server environment for " << server_name << std::endl; - return 1; - } - - // create the agent directory. - std::string agent_dir = remotepath::agent(server_name); - execute_ssh_command(server_env.get_SSH_INFO(), sCommand("","mkdir -p " + agent_dir,{}), cMode::Silent); - - std::vector agent_files; - load_agent_file_contents(agent_files); - - // create the sh file on the remote server. - for (const auto &file : agent_files) { - // write out the file contents in the file. - if (remote_write_file(server_env.get_SSH_INFO(), file) != 0) { - std::cerr << "Failed to write file " << file.filename << std::endl; - return 1; - } - std::cout << "Wrote file " << file.filename << " on " << server_name << std::endl; - } - - return 0; - } - - int remote_write_file(const sSSHInfo &ssh_info, const AgentFile &file) - { - std::string generate_command = "cat <<'GENERATE_EOF' > " + file.filename + "\n" + file.content + "\nGENERATE_EOF\n"; // use heredoc to write the file. - return execute_ssh_command(ssh_info, sCommand("",generate_command,{}), cMode::Defaults); - } - - // auto generated load_agent_file_contents function goes here, followed by closing } for namespace dropshell. - int load_agent_file_contents(std::vector &agent_files) - { - agent_files={ - AgentFile { "_common.sh", R"AGENTFILE( -# COMMON FUNCTIONS -# JDE -# 2025-05-03 - -# This file is available TO ***ALL*** templates, as ${AGENT_PATH}/_common.sh - -# ---------------------------------------------------------------------------------------------------------- - -# summary of functions: -# _die "message" : Prints an error message in red and exits with status code 1. -# _grey_start : Switches terminal output color to grey. -# _grey_end : Resets terminal output color from grey. -# _create_and_start_container "" : Creates/starts a container, verifying it runs. -# _create_folder : Creates a directory if it doesn't exist (chmod 777). -# _check_docker_installed : Checks if Docker is installed, running, and user has permission. Returns 1 on failure. -# _is_container_exists : Checks if a container (any state) exists. Returns 1 if not found. -# _is_container_running : Checks if a container is currently running. Returns 1 if not running. -# _get_container_id : Prints the ID of the named container. -# _get_container_status : Prints the status string of the named container. -# _start_container : Starts an existing, stopped container. -# _stop_container : Stops a running container. -# _remove_container : Stops (if needed) and removes a container. -# _get_container_logs : Prints the logs for a container. -# _check_required_env_vars "VAR1" ... : Checks if listed environment variables are set; calls _die() if any are missing. -# _root_remove_tree : Removes a path using a root Docker container (for permissions). - -# ---------------------------------------------------------------------------------------------------------- - -# Prints an error message in red and exits with status code 1. -_die() { - echo -e "\033[91mError: $1\033[0m" - exit 1 -} - -# Switches terminal output color to grey. -_grey_start() { - echo -e -n "\033[90m" -} - -# Resets terminal output color from grey. -_grey_end() { - echo -e -n "\033[0m" -} - -# Creates/starts a container, verifying it runs. -_create_and_start_container() { - if [ -z "$1" ] || [ -z "$2" ]; then - _die "Template error: create_and_start_container " - fi - - local run_cmd="$1" - local container_name="$2" - - if _is_container_exists $container_name; then - _is_container_running $container_name && return 0 - _start_container $container_name - else - _grey_start - $run_cmd - _grey_end - fi - - if ! _is_container_running $container_name; then - _die "Container ${container_name} failed to start" - fi - - ID=$(_get_container_id $container_name) - echo "Container ${container_name} is running with ID ${ID}" -} - -# Creates a directory if it doesn't exist (chmod 777). -_create_folder() { - local folder="$1" - if [ -d "$folder" ]; then - return 0 - fi - if ! mkdir -p "$folder"; then - _die "Failed to create folder: $folder" - fi - chmod 777 "$folder" - echo "Folder created: $folder" -} - -# Checks if Docker is installed, running, and user has permission. Returns 1 on failure. -_check_docker_installed() { - if ! command -v docker &> /dev/null; then - echo "Docker is not installed" - return 1 - fi - - # check if docker daemon is running - if ! docker info &> /dev/null; then - echo "Docker daemon is not running" - return 1 - fi - - # check if user has permission to run docker - if ! docker run --rm hello-world &> /dev/null; then - echo "User does not have permission to run docker" - return 1 - fi - - return 0 -} - -# Checks if a container (any state) exists. Returns 1 if not found. -_is_container_exists() { - if ! docker ps -a --format "{{.Names}}" | grep -q "^$1$"; then - return 1 - fi - return 0 -} - -# Checks if a container is currently running. Returns 1 if not running. -_is_container_running() { - if ! docker ps --format "{{.Names}}" | grep -q "^$1$"; then - return 1 - fi - return 0 -} - -# Prints the ID of the named container. -_get_container_id() { - docker ps --format "{{.ID}}" --filter "name=$1" -} - -# Prints the status string of the named container. -_get_container_status() { - docker ps --format "{{.Status}}" --filter "name=$1" -} - -# Starts an existing, stopped container. -_start_container() { - _is_container_exists $1 || return 1 - _is_container_running $1 && return 0 - docker start $1 -} - -# Stops a running container. -_stop_container() { - _is_container_running $1 || return 0; - docker stop $1 -} - -# Stops (if needed) and removes a container. -_remove_container() { - _stop_container $1 - _is_container_exists $1 || return 0; - docker rm $1 -} - -# Prints the logs for a container. -_get_container_logs() { - if ! _is_container_exists $1; then - echo "Container $1 does not exist" - return 1 - fi - - docker logs $1 -} - -# Checks if listed environment variables are set; calls _die() if any are missing. -_check_required_env_vars() { - local required_vars=("$@") - for var in "${required_vars[@]}"; do - if [ -z "${!var}" ]; then - _die "Required environment variable $var is not set" - fi - done -} - -# Removes a path using a root Docker container (for permissions). -_root_remove_tree() { - local to_remove="$1" - parent=$(dirname "$to_remove") - abs_parent=$(realpath "$parent") - child=$(basename "$to_remove") - docker run --rm -v "$abs_parent":/data alpine rm -rf "/data/$child" -} - - -# Load autocommands -source "${AGENT_PATH}/_autocommands.sh")AGENTFILE" }, - AgentFile { "_nuke_other.sh", R"AGENTFILE( -#!/bin/bash - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "$SCRIPT_DIR/shared/_common.sh" - - -A_SERVICE="$1" -A_SERVICE_PATH="$2" - - -# 1. Check if service directory exists on server -[ -d "$A_SERVICE_PATH" ] || _die "Service is not installed: $A_SERVICE" - -# uninstall the service -if [ -f "$A_SERVICE_PATH/uninstall.sh" ]; then - $A_SERVICE_PATH/uninstall.sh -fi - -# nuke the service -if [ -f "$A_SERVICE_PATH/nuke.sh" ]; then - $A_SERVICE_PATH/nuke.sh -fi - -# remove the service directory -rm -rf "$A_SERVICE_PATH" -)AGENTFILE" }, - AgentFile { "_allservicesstatus.sh", R"AGENTFILE( -#!/bin/bash - -# This script checks ALL services on the server and returns a status for each. - -# Return format is simple ENV with the following format: -# SERVICE_NAME_HEALTH=healthy|unhealthy|unknown -# SERVICE_NAME_PORTS=port1,port2,port3 - -# Get all services on the server -SCRIPT_DIR="$(dirname "$0")" - -# // DROPSHELL_DIR -# // |-- backups -# // |-- services -# // |-- service name -# // |-- config <-- this is passed as argument to all scripts -# // |-- service.env -# // |-- template -# // |-- (script files) -# // |-- shared -# // |-- _allservicesstatus.sh -# // |-- config -# // |-- service.env -# // |-- (other config files for specific server&service) - -CURRENT_OUTPUT="" -CURRENT_EXIT_CODE=0 - -load_dotenv(){ - local file_path=$1 - if [ -f "${file_path}" ]; then - source "${file_path}" - fi -} - -function run_command() { - local service_path=$1 - local command=$2 - local capture_output=${3:-false} # default to false if not specified - - # check if the command is a file - if [ ! -f "${service_path}/template/${command}.sh" ]; then - return; - fi - - # run the command in a subshell to prevent environment changes - CURRENT_OUTPUT=$( - set -a - load_dotenv "${service_path}/template/_default.env" - load_dotenv "${service_path}/config/service.env" - set +a - - # update the main variables. - export CONFIG_PATH="${service_path}/config" - # SERVER is correct - export SERVICE="${SERVICE_NAME}" - - if [ "$capture_output" = "true" ]; then - # Capture and return output - bash "${service_path}/template/${command}.sh" 2>&1 - else - # Run silently and return exit code - bash "${service_path}/template/${command}.sh" > /dev/null 2>&1 - fi - ) - CURRENT_EXIT_CODE=$? -} - -function command_exists() { - local service_path=$1 - local command=$2 - if [ ! -f "${service_path}/template/${command}.sh" ]; then - return 1 - fi - return 0 -} - -# Get all services on the server -SERVICES_PATH=$(realpath "${SCRIPT_DIR}/../../../") - -# Get all service names -SERVICE_NAMES=$(ls "${SERVICES_PATH}") - -# Iterate over all service names -for SERVICE_NAME in ${SERVICE_NAMES}; do - - SERVICE_PATH=$(realpath "${SERVICES_PATH}/${SERVICE_NAME}") - - #-------------------------------- - # Get the service health - if ! command_exists "${SERVICE_PATH}" "status"; then - SERVICE_HEALTH="unknown" - else - run_command "${SERVICE_PATH}" "status" "false" - if [ "${CURRENT_EXIT_CODE}" -eq 0 ]; then - SERVICE_HEALTH="healthy" - else - SERVICE_HEALTH="unhealthy" - fi - fi - - #-------------------------------- - # Get the service ports - if ! command_exists "${SERVICE_PATH}" "ports"; then - SERVICE_PORTS="" - else - run_command "${SERVICE_PATH}" "ports" "true" - SERVICE_PORTS="${CURRENT_OUTPUT}" - fi - - #-------------------------------- - # return the health and ports - echo "${SERVICE_NAME}_HEALTH=${SERVICE_HEALTH}" - echo "${SERVICE_NAME}_PORTS=${SERVICE_PORTS}" -done -)AGENTFILE" }, - AgentFile { "_autocommands.sh", R"AGENTFILE( -#!/bin/bash - -# This script contains the common code for the autocommands. - -MYID=$(id -u) -MYGRP=$(id -g) - -_autocommandrun_volume() { - local command="$1" - local volume_name="$2" - local backup_folder="$3" - - case "$command" in - create) - echo "Creating volume ${volume_name}" - docker volume create ${volume_name} - ;; - nuke) - echo "Nuking volume ${volume_name}" - docker volume rm ${volume_name} - ;; - backup) - echo "Backing up volume ${volume_name}" - docker run --rm -v ${volume_name}:/volume -v ${backup_folder}:/backup debian bash -c "tar -czvf /backup/backup.tgz -C /volume . && chown -R $MYID:$MYGRP /backup" - ;; - restore) - echo "Restoring volume ${volume_name}" - docker volume rm ${volume_name} - docker volume create ${volume_name} - docker run --rm -v ${volume_name}:/volume -v ${backup_folder}:/backup debian bash -c "tar -xzvf /backup/backup.tgz -C /volume --strip-components=1" - ;; - esac -} - -_autocommandrun_path() { - local command="$1" - local path="$2" - local backup_folder="$3" - - case "$command" in - create) - echo "Creating path ${path}" - mkdir -p ${path} - ;; - nuke) - echo "Nuking path ${path}" - local path_parent=$(dirname ${path}) - local path_child=$(basename ${path}) - if [ -d "${path_parent}/${path_child}" ]; then - docker run --rm -v ${path_parent}:/volume debian bash -c "rm -rf /volume/${path_child}" || echo "Failed to nuke path ${path}" - else - echo "Path ${path} does not exist - nothing to nuke" - fi - ;; - backup) - echo "Backing up path ${path}" - if [ -d "${path}" ]; then - docker run --rm -v ${path}:/path -v ${backup_folder}:/backup debian bash -c "tar -czvf /backup/backup.tgz -C /path . && chown -R $MYID:$MYGRP /backup" - else - echo "Path ${path} does not exist - nothing to backup" - fi - ;; - restore) - echo "Restoring path ${path}" - tar -xzvf ${backup_folder}/backup.tgz -C ${path} --strip-components=1 - ;; - esac -} - -_autocommandrun_file() { - local command="$1" - local filepath="$2" - local backup_folder="$3" - - case "$command" in - create) - ;; - nuke) - rm -f ${filepath} - ;; - backup) - echo "Backing up file ${filepath}" - local file_parent=$(dirname ${filepath}) - local file_name=$(basename ${filepath}) - if [ -f "${file_parent}/${file_name}" ]; then - docker run --rm -v ${file_parent}:/volume -v ${backup_folder}:/backup debian bash -c "cp /volume/${file_name} /backup/${file_name} && chown -R $MYID:$MYGRP /backup" - else - echo "File ${filepath} does not exist - nothing to backup" - fi - ;; - restore) - echo "Restoring file ${filepath}" - local file_name=$(basename ${filepath}) - cp ${backup_folder}/${file_name} ${filepath} - ;; - esac -} - -_autocommandparse() { - # first argument is the command - # if the command is backup or restore, then the last two arguments are the backup file and the temporary path - # all other arguments are of form: - # key=value - # where key can be one of volume, path or file. - # value is the path or volume name. - - # we iterate over the key=value arguments, and for each we call: - # autorun - - local command="$1" - shift - - local backup_temp_path="$1" - shift - - echo "autocommandparse: command=$command backup_temp_path=$backup_temp_path" - - # Extract the backup file and temp path (last two arguments) - local args=("$@") - local arg_count=${#args[@]} - - # Process all key=value pairs - for ((i=0; i<$arg_count; i++)); do - local pair="${args[$i]}" - - # Skip if not in key=value format - if [[ "$pair" != *"="* ]]; then - continue - fi - - local key="${pair%%=*}" - local value="${pair#*=}" - - # create backup folder unique to key/value. - local bfolder=$(echo "${key}_${value}" | tr -cd '[:alnum:]_-') - local targetpath="${backup_temp_path}/${bfolder}" - mkdir -p ${targetpath} - - # Key must be one of volume, path or file - case "$key" in - volume) - _autocommandrun_volume "$command" "$value" "$targetpath" - ;; - path) - _autocommandrun_path "$command" "$value" "$targetpath" - ;; - file) - _autocommandrun_file "$command" "$value" "$targetpath" - ;; - *) - _die "Unknown key $key passed to auto${command}. We only support volume, path and file." - ;; - esac - done -} - - -autocreate() { - _autocommandparse create none "$@" -} - - -autonuke() { - _autocommandparse nuke none "$@" -} - -autobackup() { - _check_required_env_vars "BACKUP_FILE" "TEMP_DIR" - BACKUP_TEMP_PATH="$TEMP_DIR/backup" - - - mkdir -p "$BACKUP_TEMP_PATH" - echo "_autocommandparse [backup] [$BACKUP_TEMP_PATH] [$@]" - _autocommandparse backup "$BACKUP_TEMP_PATH" "$@" - - tar zcvf "$BACKUP_FILE" -C "$BACKUP_TEMP_PATH" . -} - -autorestore() { - _check_required_env_vars "BACKUP_FILE" "TEMP_DIR" - BACKUP_TEMP_PATH="$TEMP_DIR/restore" - - echo "_autocommandparse [restore] [$BACKUP_TEMP_PATH] [$@]" - - mkdir -p "$BACKUP_TEMP_PATH" - tar zxvf "$BACKUP_FILE" -C "$BACKUP_TEMP_PATH" --strip-components=1 - - _autocommandparse restore "$BACKUP_TEMP_PATH" "$@" -} -)AGENTFILE" }, - }; // agent_files defined. - - return 0; - } // end of load_agent_file_contents function. - -} // namespace dropshell - diff --git a/src/utils/createagent.hpp b/src/utils/createagent.hpp deleted file mode 100644 index 3dbb528..0000000 --- a/src/utils/createagent.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef CREATEAGENT_HPP -#define CREATEAGENT_HPP - -/* - -CREATEAGENT.HPP IS AUTOMATICALLY GENERATED FROM make_createagent.sh, -and recreates the files in /agent/ on a remote server. - -DO NOT EDIT THIS FILE MANUALLY! Edit make_createagent.sh instead. - -*/ - -#include - -namespace dropshell { - int create_agent(const std::string &server_name); -} - -#endif // CREATEAGENT_HPP