From 9d52e50b1e3288b0205c7247996f8567237f2008 Mon Sep 17 00:00:00 2001 From: MCP Server Date: Fri, 3 Oct 2025 19:50:27 -0700 Subject: [PATCH 1/7] feat(agents): add prominent retry configuration banner at script startup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added highly visible RETRY CONFIGURATION section at the top of all CLI agent scripts. This provides immediate visibility into iteration limits - a key operational metric. Changes: - Added prominent banner showing MAX_RETRIES configuration - Displays configuration source (env var or default) - Positioned early in script output (right after environment setup) - Consistent formatting across all CLIs Banner format: ════════════════════════════════════════════════════════════════ ║ RETRY CONFIGURATION ║ ════════════════════════════════════════════════════════════════ 🔄 Maximum Iterations: 10 📍 Source: EXECUTION_MAX_RETRIES environment variable ════════════════════════════════════════════════════════════════ Updated CLIs: - Factory: Uses FACTORY_MAX_RETRIES (default: 10) - Codex: Uses CODEX_MAX_RETRIES (default: 5) - Cursor: Uses CURSOR_MAX_RETRIES (default: 5) - OpenCode: Uses OPENCODE_MAX_RETRIES (default: 10, supports unlimited with 0) - Claude (Rex/Cleo/Tess): Uses CLAUDE_MAX_RETRIES (default: 10) All fall back to EXECUTION_MAX_RETRIES then to their respective defaults. This makes it immediately clear how many iterations each agent will attempt, which is critical for cost estimation and operational monitoring. --- .../code/claude/container-cleo.sh.hbs | 19 +++++++++++++++ .../code/claude/container-rex.sh.hbs | 20 ++++++++++++++++ .../code/claude/container-tess.sh.hbs | 20 ++++++++++++++++ .../code/codex/container-base.sh.hbs | 19 +++++++++++++++ .../code/cursor/container-base.sh.hbs | 19 +++++++++++++++ .../code/factory/container-base.sh.hbs | 19 +++++++++++++++ .../code/opencode/container-base.sh.hbs | 23 +++++++++++++++++++ 7 files changed, 139 insertions(+) diff --git a/infra/charts/controller/agent-templates/code/claude/container-cleo.sh.hbs b/infra/charts/controller/agent-templates/code/claude/container-cleo.sh.hbs index ee89a4e4..81105c5b 100644 --- a/infra/charts/controller/agent-templates/code/claude/container-cleo.sh.hbs +++ b/infra/charts/controller/agent-templates/code/claude/container-cleo.sh.hbs @@ -89,6 +89,25 @@ stop_docker_sidecar() { # Set up EXIT trap to ensure Docker sidecar cleanup trap 'stop_docker_sidecar || true' EXIT +# ========================================================================= +# RETRY CONFIGURATION +# ========================================================================= +MAX_RETRIES_CONFIG=${CLAUDE_MAX_RETRIES:-${EXECUTION_MAX_RETRIES:-10}} +echo "" +echo "════════════════════════════════════════════════════════════════" +echo "║ RETRY CONFIGURATION ║" +echo "════════════════════════════════════════════════════════════════" +echo "🔄 Maximum Iterations: $MAX_RETRIES_CONFIG" +if [ -n "${CLAUDE_MAX_RETRIES:-}" ]; then + echo "📍 Source: CLAUDE_MAX_RETRIES environment variable" +elif [ -n "${EXECUTION_MAX_RETRIES:-}" ]; then + echo "📍 Source: EXECUTION_MAX_RETRIES environment variable" +else + echo "📍 Source: Default configuration" +fi +echo "════════════════════════════════════════════════════════════════" +echo "" + # Clean up any leftover completion marker from previous runs # This prevents issues with sequential task executions on the same PVC if [ -f /workspace/.cleo-complete ]; then diff --git a/infra/charts/controller/agent-templates/code/claude/container-rex.sh.hbs b/infra/charts/controller/agent-templates/code/claude/container-rex.sh.hbs index d07b5cc5..052d210e 100644 --- a/infra/charts/controller/agent-templates/code/claude/container-rex.sh.hbs +++ b/infra/charts/controller/agent-templates/code/claude/container-rex.sh.hbs @@ -88,6 +88,26 @@ stop_docker_sidecar() { # Set up EXIT trap to ensure Docker sidecar cleanup trap 'stop_docker_sidecar || true' EXIT + +# ========================================================================= +# RETRY CONFIGURATION +# ========================================================================= +MAX_RETRIES_CONFIG=${CLAUDE_MAX_RETRIES:-${EXECUTION_MAX_RETRIES:-10}} +echo "" +echo "════════════════════════════════════════════════════════════════" +echo "║ RETRY CONFIGURATION ║" +echo "════════════════════════════════════════════════════════════════" +echo "🔄 Maximum Iterations: $MAX_RETRIES_CONFIG" +if [ -n "${CLAUDE_MAX_RETRIES:-}" ]; then + echo "📍 Source: CLAUDE_MAX_RETRIES environment variable" +elif [ -n "${EXECUTION_MAX_RETRIES:-}" ]; then + echo "📍 Source: EXECUTION_MAX_RETRIES environment variable" +else + echo "📍 Source: Default configuration" +fi +echo "════════════════════════════════════════════════════════════════" +echo "" + echo "⛔ CRITICAL: You must ONLY work on Task {{task_id}} - ignore ALL other tasks" # Clean up any leftover sentinel file from previous runs diff --git a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs index d7428f9f..856dc4ae 100644 --- a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs +++ b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs @@ -86,6 +86,26 @@ echo '════════════════════════ echo '║ TESS TESTING WORKFLOW STARTING ║' echo '║ Quality Assurance & Deployment Testing Agent ║' echo '════════════════════════════════════════════════════════════════' + +# ========================================================================= +# RETRY CONFIGURATION +# ========================================================================= +MAX_RETRIES_CONFIG=${CLAUDE_MAX_RETRIES:-${EXECUTION_MAX_RETRIES:-10}} +echo "" +echo "════════════════════════════════════════════════════════════════" +echo "║ RETRY CONFIGURATION ║" +echo "════════════════════════════════════════════════════════════════" +echo "🔄 Maximum Iterations: $MAX_RETRIES_CONFIG" +if [ -n "${CLAUDE_MAX_RETRIES:-}" ]; then + echo "📍 Source: CLAUDE_MAX_RETRIES environment variable" +elif [ -n "${EXECUTION_MAX_RETRIES:-}" ]; then + echo "📍 Source: EXECUTION_MAX_RETRIES environment variable" +else + echo "📍 Source: Default configuration" +fi +echo "════════════════════════════════════════════════════════════════" +echo "" + echo "🎯 Agent: {{github_app}}" echo "🧪 Focus: Comprehensive testing, deployment validation, test coverage" echo "📋 Task ID: {{task_id}}" diff --git a/infra/charts/controller/agent-templates/code/codex/container-base.sh.hbs b/infra/charts/controller/agent-templates/code/codex/container-base.sh.hbs index ee01300a..0650a40d 100644 --- a/infra/charts/controller/agent-templates/code/codex/container-base.sh.hbs +++ b/infra/charts/controller/agent-templates/code/codex/container-base.sh.hbs @@ -30,6 +30,25 @@ fi echo "PATH: $PATH" +# ========================================================================= +# RETRY CONFIGURATION +# ========================================================================= +MAX_RETRIES_CONFIG=${CODEX_MAX_RETRIES:-${EXECUTION_MAX_RETRIES:-5}} +echo "" +echo "════════════════════════════════════════════════════════════════" +echo "║ RETRY CONFIGURATION ║" +echo "════════════════════════════════════════════════════════════════" +echo "🔄 Maximum Iterations: $MAX_RETRIES_CONFIG" +if [ -n "${CODEX_MAX_RETRIES:-}" ]; then + echo "📍 Source: CODEX_MAX_RETRIES environment variable" +elif [ -n "${EXECUTION_MAX_RETRIES:-}" ]; then + echo "📍 Source: EXECUTION_MAX_RETRIES environment variable" +else + echo "📍 Source: Default configuration" +fi +echo "════════════════════════════════════════════════════════════════" +echo "" + # ========================================================================= # GitHub App authentication # ========================================================================= diff --git a/infra/charts/controller/agent-templates/code/cursor/container-base.sh.hbs b/infra/charts/controller/agent-templates/code/cursor/container-base.sh.hbs index 1a47b384..5e3ce256 100644 --- a/infra/charts/controller/agent-templates/code/cursor/container-base.sh.hbs +++ b/infra/charts/controller/agent-templates/code/cursor/container-base.sh.hbs @@ -67,6 +67,25 @@ fi echo "PATH: $PATH" +# ========================================================================= +# RETRY CONFIGURATION +# ========================================================================= +MAX_RETRIES_CONFIG=${CURSOR_MAX_RETRIES:-${EXECUTION_MAX_RETRIES:-5}} +echo "" +echo "════════════════════════════════════════════════════════════════" +echo "║ RETRY CONFIGURATION ║" +echo "════════════════════════════════════════════════════════════════" +echo "🔄 Maximum Iterations: $MAX_RETRIES_CONFIG" +if [ -n "${CURSOR_MAX_RETRIES:-}" ]; then + echo "📍 Source: CURSOR_MAX_RETRIES environment variable" +elif [ -n "${EXECUTION_MAX_RETRIES:-}" ]; then + echo "📍 Source: EXECUTION_MAX_RETRIES environment variable" +else + echo "📍 Source: Default configuration" +fi +echo "════════════════════════════════════════════════════════════════" +echo "" + # ========================================================================= # GitHub App authentication # ========================================================================= diff --git a/infra/charts/controller/agent-templates/code/factory/container-base.sh.hbs b/infra/charts/controller/agent-templates/code/factory/container-base.sh.hbs index f1e846ea..cffa26e9 100644 --- a/infra/charts/controller/agent-templates/code/factory/container-base.sh.hbs +++ b/infra/charts/controller/agent-templates/code/factory/container-base.sh.hbs @@ -25,6 +25,25 @@ fi echo "PATH: $PATH" +# ========================================================================= +# RETRY CONFIGURATION +# ========================================================================= +MAX_RETRIES_CONFIG=${FACTORY_MAX_RETRIES:-${EXECUTION_MAX_RETRIES:-10}} +echo "" +echo "════════════════════════════════════════════════════════════════" +echo "║ RETRY CONFIGURATION ║" +echo "════════════════════════════════════════════════════════════════" +echo "🔄 Maximum Iterations: $MAX_RETRIES_CONFIG" +if [ -n "${FACTORY_MAX_RETRIES:-}" ]; then + echo "📍 Source: FACTORY_MAX_RETRIES environment variable" +elif [ -n "${EXECUTION_MAX_RETRIES:-}" ]; then + echo "📍 Source: EXECUTION_MAX_RETRIES environment variable" +else + echo "📍 Source: Default configuration" +fi +echo "════════════════════════════════════════════════════════════════" +echo "" + # ========================================================================= # GitHub App authentication # ========================================================================= diff --git a/infra/charts/controller/agent-templates/code/opencode/container-base.sh.hbs b/infra/charts/controller/agent-templates/code/opencode/container-base.sh.hbs index 6b8a5493..f1200c54 100644 --- a/infra/charts/controller/agent-templates/code/opencode/container-base.sh.hbs +++ b/infra/charts/controller/agent-templates/code/opencode/container-base.sh.hbs @@ -30,6 +30,29 @@ fi echo "PATH: $PATH" +# ========================================================================= +# RETRY CONFIGURATION +# ========================================================================= +MAX_RETRIES_CONFIG=${OPENCODE_MAX_RETRIES:-${EXECUTION_MAX_RETRIES:-10}} +echo "" +echo "════════════════════════════════════════════════════════════════" +echo "║ RETRY CONFIGURATION ║" +echo "════════════════════════════════════════════════════════════════" +if [ "$MAX_RETRIES_CONFIG" = "0" ]; then + echo "🔄 Maximum Iterations: UNLIMITED (will retry until complete)" +else + echo "🔄 Maximum Iterations: $MAX_RETRIES_CONFIG" +fi +if [ -n "${OPENCODE_MAX_RETRIES:-}" ]; then + echo "📍 Source: OPENCODE_MAX_RETRIES environment variable" +elif [ -n "${EXECUTION_MAX_RETRIES:-}" ]; then + echo "📍 Source: EXECUTION_MAX_RETRIES environment variable" +else + echo "📍 Source: Default configuration" +fi +echo "════════════════════════════════════════════════════════════════" +echo "" + # ========================================================================= # GitHub App authentication # ========================================================================= From f54e9e205d4428665b4fe34060caf237314c2900 Mon Sep 17 00:00:00 2001 From: 5DLabs Automation Date: Sat, 4 Oct 2025 03:25:54 +0000 Subject: [PATCH 2/7] chore(chart): regenerate agent templates ConfigMaps --- .../controller/templates/agent-templates-claude.yaml | 8 ++++---- .../controller/templates/agent-templates-codex.yaml | 4 ++-- .../controller/templates/agent-templates-cursor.yaml | 4 ++-- .../controller/templates/agent-templates-factory.yaml | 4 ++-- .../controller/templates/agent-templates-opencode.yaml | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/infra/charts/controller/templates/agent-templates-claude.yaml b/infra/charts/controller/templates/agent-templates-claude.yaml index 5262e237..9c32d8c7 100644 --- a/infra/charts/controller/templates/agent-templates-claude.yaml +++ b/infra/charts/controller/templates/agent-templates-claude.yaml @@ -11,13 +11,13 @@ metadata: app.kubernetes.io/component: agent-templates agent-templates/type: claude annotations: - templates-checksum: "40c40b75e3b790b33240c8df216bc5a6c5152ea20cba7ce7ba9daab7b18c10e5" + templates-checksum: "95f487e0adc4193117321f95936abe8b1a99a2e7731418cb1e132216b0bedb8a" binaryData: code_claude_config.json.hbs: ewogICJtb2RlbCI6ICJ7e21vZGVsfX0iLAogICJtYXhfdG9rZW5zIjoge3ttYXhfdG9rZW5zfX0sCiAgInRlbXBlcmF0dXJlIjoge3t0ZW1wZXJhdHVyZX19LAogICJnaXRodWJfYXBwIjogInt7Z2l0aHViX2FwcH19IiwKICAiY2xpIjogInt7Y2xpfX0iLAogICJ0aW1lc3RhbXAiOiAie3t0aW1lc3RhbXB9fSIsCiAgImNvcnJlbGF0aW9uX2lkIjogInt7Y29ycmVsYXRpb25faWR9fSIsCiAge3sjaWYgdG9vbHN9fQogICJ0b29scyI6IHsKICAgIHt7I2lmIHRvb2xzLnJlbW90ZX19CiAgICAicmVtb3RlIjogWwogICAgICB7eyNlYWNoIHRvb2xzLnJlbW90ZX19CiAgICAgICJ7e3RoaXN9fSJ7eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAgICB7ey9lYWNofX0KICAgIF17eyNpZiB0b29scy5sb2NhbF9zZXJ2ZXJzfX0se3svaWZ9fQogICAge3svaWZ9fQogICAge3sjaWYgdG9vbHMubG9jYWxfc2VydmVyc319CiAgICAibG9jYWxfc2VydmVycyI6IHsKICAgICAge3sjZWFjaCB0b29scy5sb2NhbF9zZXJ2ZXJzfX0KICAgICAgInt7QGtleX19IjogewogICAgICAgICJlbmFibGVkIjoge3t0aGlzLmVuYWJsZWR9fSwKICAgICAgICAidG9vbHMiOiBbCiAgICAgICAgICB7eyNlYWNoIHRoaXMudG9vbHN9fQogICAgICAgICAgInt7dGhpc319Int7I3VubGVzcyBAbGFzdH19LHt7L3VubGVzc319CiAgICAgICAgICB7ey9lYWNofX0KICAgICAgICBdCiAgICAgIH17eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAgICB7ey9lYWNofX0KICAgIH0KICAgIHt7L2lmfX0KICB9LAogIHt7L2lmfX0KICB7eyNpZiBtY3Bfc2VydmVyc319CiAgIm1jcF9zZXJ2ZXJzIjogewogICAge3sjZWFjaCBtY3Bfc2VydmVyc319CiAgICAie3tAa2V5fX0iOiB7CiAgICAgICJjb21tYW5kIjogInt7dGhpcy5jb21tYW5kfX0iLAogICAgICB7eyNpZiB0aGlzLmFyZ3N9fQogICAgICAiYXJncyI6IFsKICAgICAgICB7eyNlYWNoIHRoaXMuYXJnc319CiAgICAgICAgInt7dGhpc319Int7I3VubGVzcyBAbGFzdH19LHt7L3VubGVzc319CiAgICAgICAge3svZWFjaH19CiAgICAgIF0sCiAgICAgIHt7L2lmfX0KICAgICAge3sjaWYgdGhpcy5lbnZ9fQogICAgICAiZW52IjogewogICAgICAgIHt7I2VhY2ggdGhpcy5lbnZ9fQogICAgICAgICJ7e0BrZXl9fSI6ICJ7e3RoaXN9fSJ7eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAgICAgIHt7L2VhY2h9fQogICAgICB9CiAgICAgIHt7L2lmfX0KICAgIH17eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAge3svZWFjaH19CiAgfSwKICB7ey9pZn19CiAge3sjaWYgY2xpX2NvbmZpZ319CiAgImNsaV9jb25maWciOiB7e3tqc29uIGNsaV9jb25maWd9fX0sCiAge3svaWZ9fQogICJnZW5lcmF0ZWRfYnkiOiAiY2xpX2FkYXB0ZXJfY2xhdWRlIiwKICAidmVyc2lvbiI6ICIxLjAiCn0= - code_claude_container-cleo.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIENMRU8gQ09ERSBRVUFMSVRZIFdPUktGTE9XIFNUQVJUSU5HICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICBDb2RlIFF1YWxpdHkgJiBDSS9DRCBQaXBlbGluZSBFbmZvcmNlbWVudCBBZ2VudCAgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCflI0gRm9jdXM6IENvZGUgcXVhbGl0eSwgQ0kvQ0Qgc2V0dXAsIGFuZCBEb2NrZXIgaW1hZ2UgYnVpbGRpbmciCmVjaG8gIvCfk4sgVGFzayBJRDoge3t0YXNrX2lkfX0iCmVjaG8gIuKchSBNaXNzaW9uOiBQZXJmZWN0IGNvZGUgcXVhbGl0eSBBTkQgd29ya2luZyBDSS9DRCBwaXBlbGluZSB3aXRoIERvY2tlciBidWlsZHMiCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCiMgU2V0IHVwIEVYSVQgdHJhcCB0byBlbnN1cmUgRG9ja2VyIHNpZGVjYXIgY2xlYW51cAp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCiMgQ2xlYW4gdXAgYW55IGxlZnRvdmVyIGNvbXBsZXRpb24gbWFya2VyIGZyb20gcHJldmlvdXMgcnVucwojIFRoaXMgcHJldmVudHMgaXNzdWVzIHdpdGggc2VxdWVudGlhbCB0YXNrIGV4ZWN1dGlvbnMgb24gdGhlIHNhbWUgUFZDCmlmIFsgLWYgL3dvcmtzcGFjZS8uY2xlby1jb21wbGV0ZSBdOyB0aGVuCiAgICBlY2hvICLwn6e5IENsZWFuaW5nIHVwIGNvbXBsZXRpb24gbWFya2VyIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8uY2xlby1jb21wbGV0ZQpmaQoKIyBEaXNhYmxlIGludGVyYWN0aXZlIEdpdCBwcm9tcHRzIGdsb2JhbGx5CmV4cG9ydCBHSVRfVEVSTUlOQUxfUFJPTVBUPTAKZXhwb3J0IEdJVF9BU0tQQVNTPS9iaW4vdHJ1ZQpleHBvcnQgU1NIX0FTS1BBU1M9L2Jpbi90cnVlCgojIFJlcG9zaXRvcnkgVVJMClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgojIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCmVjaG8gIlVzaW5nIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gZm9yIGNvZGUgcXVhbGl0eSBjaGVja3MiCgojIEF1dGhlbnRpY2F0ZSB3aXRoIEdpdEh1YiBBcHAKaWYgWyAtbiAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiIF0gJiYgWyAtbiAiJEdJVEhVQl9BUFBfSUQiIF07IHRoZW4KICAgIGVjaG8gIkF1dGhlbnRpY2F0aW5nIHdpdGggR2l0SHViIEFwcC4uLiIKCiAgICAjIENyZWF0ZSB0ZW1wb3JhcnkgcHJpdmF0ZSBrZXkgZmlsZSAoc3VwcG9ydCBlc2NhcGVkIG5ld2xpbmVzKQogICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS5wZW0iCiAgICBwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEdlbmVyYXRlIEpXVCB0b2tlbiBmb3IgR2l0SHViIEFwcCAoZml4ZWQgSldUIGdlbmVyYXRpb24gZm9yIExpbnV4IGNvbnRhaW5lcnMpCiAgICAjIEpXVCBoZWFkZXIKICAgIEpXVF9IRUFERVI9JChwcmludGYgJ3siYWxnIjoiUlMyNTYiLCJ0eXAiOiJKV1QifScgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIEpXVCBwYXlsb2FkIHdpdGggY3VycmVudCB0aW1lIGFuZCBleHBpcmF0aW9uICgxMCBtaW51dGVzKQogICAgTk9XPSQoZGF0ZSArJXMpCiAgICBFWFA9JCgoTk9XICsgNjAwKSkKICAgIEpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQoKICAgICMgU2lnbiB0aGUgSldUCiAgICBKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogICAgSldUX1RPS0VOPSIkSldUX0hFQURFUi4kSldUX1BBWUxPQUQuJEpXVF9TSUdOQVRVUkUiCgogICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIGZvciB0aGUgcmVwb3NpdG9yeSAocm9idXN0IHBhcnNpbmcgb2Ygb3duZXIvcmVwbykKICAgIElOUFVUX1JFUE89Int7cmVwb3NpdG9yeV91cmx9fSIKICAgIFJFUE9fT1dORVI9IiIKICAgIFJFUE9fTkFNRT0iIgoKICAgIGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS9bXi9dKy8oW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsaWYgZWNobyAiJElOUFVUX1JFUE8iIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgIyBTU0ggZm9ybWF0IGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8oLmdpdCkKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvLip8XDF8JykKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206W14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbHNlCiAgICAgICAgIyBGYWxsYmFjazogYXNzdW1lIHNsdWcgb3duZXIvcmVwbyAocG9zc2libHkgd2l0aCAuZ2l0KQogICAgICAgIFNMVUc9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8XC5naXQkfHwnKQogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYxKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRTTFVHIiB8IGN1dCAtZCcvJyAtZjIpCiAgICBmaQoKICAgIGVjaG8gIkRFQlVHOiBQYXJzZWQgcmVwb3NpdG9yeSAtIE93bmVyOiAnJFJFUE9fT1dORVInLCBOYW1lOiAnJFJFUE9fTkFNRSciCgogICAgZWNobyAiR2V0dGluZyBpbnN0YWxsYXRpb24gSUQgZm9yICRSRVBPX09XTkVSLyRSRVBPX05BTUUuLi4iCgogICAgIyBHZXQgdGhlIGluc3RhbGxhdGlvbiBJRCAocmV0cnkgYW5kIGZvbGxvdyByZWRpcmVjdHMpLiBGYWxsYmFjayB0byBvcmcgaW5zdGFsbGF0aW9uLgogICAgSU5TVEFMTEFUSU9OX1JFU1BPTlNFPSQoY3VybCAtcyAtTCAtLXJldHJ5IDUgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktY29ubnJlZnVzZWQgXAogICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iKQoKICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRJTlNUQUxMQVRJT05fUkVTUE9OU0UiIHwganEgLXIgJy5pZCcpCgogICAgaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIFJlcG8gaW5zdGFsbGF0aW9uIG5vdCBmb3VuZCwgdHJ5aW5nIG9yZyBpbnN0YWxsYXRpb24uLi4iCiAgICAgICAgT1JHX0lOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAgICAgLS1jb25uZWN0LXRpbWVvdXQgNSAtLW1heC10aW1lIDEyIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoZWNobyAiJE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0UiIHwganEgLXIgJy5pZCcpCiAgICBmaQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAocmVwbyk6ICRJTlNUQUxMQVRJT05fUkVTUE9OU0UiCiAgICAgICAgZWNobyAiUmVzcG9uc2UgKG9yZyk6ICAke09SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U6LVtub25lXX0iCiAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICBlY2hvICJJbnN0YWxsYXRpb24gSUQ6ICRJTlNUQUxMQVRJT05fSUQiCgogICAgIyBHZXQgaW5zdGFsbGF0aW9uIGFjY2VzcyB0b2tlbgogICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgR0lUSFVCX1RPS0VOPSQoZWNobyAiJFRPS0VOX1JFU1BPTlNFIiB8IGpxIC1yICcudG9rZW4nKQogICAgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpICAjIFRyYWNrIHdoZW4gdG9rZW4gd2FzIGdlbmVyYXRlZCBmb3IgcmVmcmVzaCBsb2dpYwoKICAgIGlmIFsgIiRHSVRIVUJfVE9LRU4iID0gIm51bGwiIF0gfHwgWyAteiAiJEdJVEhVQl9UT0tFTiIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBhY2Nlc3MgdG9rZW4iCiAgICAgICAgZWNobyAiUmVzcG9uc2U6ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YiBBcHAiCgogICAgIyBDbGVhbiB1cCB0ZW1wb3Jhcnkga2V5IGZpbGUKICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEV4cG9ydCB0aGUgdG9rZW4gZm9yIGdpdCB0byB1c2UKICAgIGV4cG9ydCBHSVRIVUJfVE9LRU4KCiAgICAjIENvbmZpZ3VyZSBnaXQgdG8gdXNlIHRoZSB0b2tlbiAodXNlIC0tcmVwbGFjZS1hbGwgdG8gaGFuZGxlIG11bHRpcGxlIGV4aXN0aW5nIGhlbHBlcnMpCiAgICBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgc3RvcmUKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCgogICAgIyBBbHNvIGF1dGhlbnRpY2F0ZSBnaCBDTEkgd2l0aCB0aGUgdG9rZW4KICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4KCiAgICAjIFRva2VuIHJlZnJlc2ggZnVuY3Rpb25zIGZvciBsb25nLXJ1bm5pbmcgam9icwogICAgcmVmcmVzaF9naXRodWJfdG9rZW4oKSB7CiAgICAgICAgZWNobyAi8J+UhCBSZWZyZXNoaW5nIEdpdEh1YiBBcHAgdG9rZW4uLi4iCgogICAgICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXktJCQiCiAgICAgICAgZWNobyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgICAgICMgR2VuZXJhdGUgbmV3IEpXVAogICAgICAgIEpXVF9UT0tFTj0kKHJ1YnkgLXIgb3BlbnNzbCAtciBqc29uIC1yIGJhc2U2NCAtZSAiCiAgICAgICAga2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLnJlYWQoJyRURU1QX0tFWV9GSUxFJykpCiAgICAgICAgcGF5bG9hZCA9IHsKICAgICAgICAgICAgaWF0OiBUaW1lLm5vdy50b19pIC0gNjAsCiAgICAgICAgICAgIGV4cDogVGltZS5ub3cudG9faSArICgxMCAqIDYwKSwKICAgICAgICAgICAgaXNzOiAnJEdJVEhVQl9BUFBfSUQnCiAgICAgICAgfQogICAgICAgIGhlYWRlciA9IHsgYWxnOiAnUlMyNTYnLCB0eXA6ICdKV1QnIH0KCiAgICAgICAgaGVhZGVyX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGhlYWRlci50b19qc29uKS5nc3ViKCc9JywgJycpCiAgICAgICAgcGF5bG9hZF9lbmMgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChwYXlsb2FkLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBzaWduYXR1cmUgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChrZXkuc2lnbihPcGVuU1NMOjpEaWdlc3Q6OlNIQTI1Ni5uZXcsIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfVwiKSkuZ3N1YignPScsICcnKQoKICAgICAgICBwdXRzIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfS4je3NpZ25hdHVyZX1cIgogICAgICAgICIpCgogICAgICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCAocmV1c2UgbG9naWMgZnJvbSBpbml0aWFsIGF1dGgpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICAgICAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCiAgICAgICAgZmkKCiAgICAgICAgIyBHZXQgbmV3IGluc3RhbGxhdGlvbiB0b2tlbgogICAgICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgICAgICBORVdfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogICAgICAgIGlmIFsgIiRORVdfVE9LRU4iICE9ICJudWxsIiBdICYmIFsgLW4gIiRORVdfVE9LRU4iIF07IHRoZW4KICAgICAgICAgICAgZXhwb3J0IEdJVEhVQl9UT0tFTj0iJE5FV19UT0tFTiIKICAgICAgICAgICAgZXhwb3J0IFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQoKICAgICAgICAgICAgIyBVcGRhdGUgZ2l0IGNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gMj4vZGV2L251bGwKCiAgICAgICAgICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW46ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICB9CgogICAgIyBDaGVjayBpZiB0b2tlbiBuZWVkcyByZWZyZXNoIChjYWxsIGJlZm9yZSBnaXQgb3BlcmF0aW9ucykKICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogICAgICAgIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi4pqg77iPIE5vIHRva2VuIHRpbWVzdGFtcCBmb3VuZCwgcmVmcmVzaGluZyB0b2tlbi4uLiIKICAgICAgICAgICAgcmVmcmVzaF9naXRodWJfdG9rZW4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmkKCiAgICAgICAgTk9XPSQoZGF0ZSArJXMpCiAgICAgICAgVE9LRU5fQUdFPSQoKE5PVyAtIFRPS0VOX0dFTkVSQVRFRF9BVCkpCgogICAgICAgICMgUmVmcmVzaCBpZiB0b2tlbiBpcyBvbGRlciB0aGFuIDUwIG1pbnV0ZXMgKHRva2VucyBsYXN0IDEgaG91ciwgcmVmcmVzaCBhdCA1MCBtaW4gdG8gYmUgc2FmZSkKICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5SEIFRva2VuIGlzICQoKCRUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMgb2xkLCByZWZyZXNoaW5nLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgIGZpCiAgICB9CgplbHNlCiAgICBlY2hvICLinYwgR2l0SHViIEFwcCBjcmVkZW50aWFscyBub3QgZm91bmQiCiAgICBleGl0IDEKZmkKCiMgRXh0cmFjdCByZXBvc2l0b3J5IG5hbWUgZnJvbSBVUkwgKGUuZy4sICI1ZGxhYnMvcnVzdC1iYXNpYy1hcGktMiIgLT4gInJ1c3QtYmFzaWMtYXBpLTIiKQpSRVBPX05BTUU9JChlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgc2VkIC1FICdzfC4qLyhbXi9dKykkfFwxfCcgfCBzZWQgJ3N8XC5naXQkfHwnKQpSRVBPX1JPT1Q9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKCiMgRGV0ZXJtaW5lIHdvcmtpbmcgZGlyZWN0b3J5IC0gdXNlIHJlcG8gcm9vdCBpZiB3b3JraW5nX2RpcmVjdG9yeSBpcyAiLiIgb3IgZW1wdHkKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBDTEFVREVfV09SS19ESVI9IiRSRVBPX1JPT1QiCmVsc2UKICBDTEFVREVfV09SS19ESVI9IiRSRVBPX1JPT1QvJFdPUktfRElSIgpmaQoKZWNobyAi8J+UpyBSZXBvc2l0b3J5OiAkUkVQT19OQU1FIgplY2hvICLwn5SnIFdvcmtpbmcgZGlyZWN0b3J5IHdpbGwgYmUgc2V0IHRvOiAkQ0xBVURFX1dPUktfRElSIgoKIyBQcmVwYXJlIGVudmlyb25tZW50IGZvciBRQSBjaGVja3MKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5OKIFBSRVBBUklORyBDT0RFIFFVQUxJVFkgRU5WSVJPTk1FTlQiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgQ29uZmlndXJlIEdpdCBpZGVudGl0eQpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgImNsZW9ANWRsYWJzLmNvbSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIjVETGFicy1DbGVvIgpnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBtYWluCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQVVUSEVOVElDQVRJT04gVkVSSUZJQ0FUSU9OCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCflJAgQVVUSEVOVElDQVRJT04gVkVSSUZJQ0FUSU9OIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIiIKCiMgUmVwb3NpdG9yeSBVUkxzIC0gSGFuZGxlIGJvdGggZnVsbCBVUkxzIGFuZCBvcmcvcmVwbyBmb3JtYXQKIyBDaGVjayBpZiByZXBvc2l0b3J5X3VybCBhbHJlYWR5IGNvbnRhaW5zIGh0dHBzOi8vZ2l0aHViLmNvbS8KaWYgZWNobyAie3tyZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgUkVQT19IVFRQX1VSTD0ie3tyZXBvc2l0b3J5X3VybH19IgogICAgaWYgISBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXC5naXQkIjsgdGhlbgogICAgICAgIFJFUE9fSFRUUF9VUkw9IiR7UkVQT19IVFRQX1VSTH0uZ2l0IgogICAgZmkKZWxzZQogICAgUkVQT19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL3t7cmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIFNhbWUgZm9yIGRvY3MgcmVwb3NpdG9yeQppZiBlY2hvICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJeaHR0cHM6Ly9naXRodWIuY29tLyI7IHRoZW4KICAgIERPQ1NfSFRUUF9VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgogICAgaWYgISBlY2hvICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgRE9DU19IVFRQX1VSTD0iJHtET0NTX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBET0NTX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0uZ2l0IgpmaQoKIyBERUJVRzogU2hvdyB3aGF0IFVSTHMgYXJlIGJlaW5nIGNvbnN0cnVjdGVkCmVjaG8gIvCflI0gREVCVUc6IFVSTCBDb25zdHJ1Y3Rpb24gJiBQYXJhbWV0ZXJzIgplY2hvICIgIElucHV0IHJlcG9zaXRvcnlfdXJsOiAne3tyZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICBJbnB1dCBkb2NzX3JlcG9zaXRvcnlfdXJsOiAne3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcHJvamVjdF9kaXJlY3Rvcnk6ICd7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgd29ya2luZ19kaXJlY3Rvcnk6ICd7e3dvcmtpbmdfZGlyZWN0b3J5fX0nIgplY2hvICIgIElucHV0IGRvY3NfYnJhbmNoOiAne3tkb2NzX2JyYW5jaH19JyIKZWNobyAiICBJbnB1dCBnaXRodWJfYXBwOiAne3tnaXRodWJfYXBwfX0nIgplY2hvICIgIElucHV0IHRhc2tfaWQ6ICd7e3Rhc2tfaWR9fSciCmVjaG8gIiAgSW5wdXQgc2VydmljZTogJ3t7c2VydmljZX19JyIKZWNobyAiICBDb25zdHJ1Y3RlZCBSRVBPX0hUVFBfVVJMOiAnJFJFUE9fSFRUUF9VUkwnIgplY2hvICIgIENvbnN0cnVjdGVkIERPQ1NfSFRUUF9VUkw6ICckRE9DU19IVFRQX1VSTCciCmVjaG8gIiAgQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgplY2hvICIgIEF2YWlsYWJsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IgplbnYgfCBncmVwIC1FICIoR0lUSFVCfEFOVEhST1BJQykiIHwgc29ydAoKIyBUZXN0IEhUVFBTIGFjY2VzcyB0byByZXBvc2l0b3J5CmVjaG8gIvCflI0gREVCVUc6IFRlc3RpbmcgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRSRVBPX0hUVFBfVVJMXCIgSEVBRCIKaWYgZ2l0IGxzLXJlbW90ZSAiJFJFUE9fSFRUUF9VUkwiIEhFQUQgPiAvdG1wL3JlcG9fdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBzdWNjZXNzZnVsIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgZWNobyAiICBPdXRwdXQ6ICQoY2F0IC90bXAvcmVwb190ZXN0Lm91dCB8IGhlYWQgLTEpIgplbHNlCiAgZWNobyAi4p2MIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgRXJyb3Igb3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQpIgogIGVjaG8gIiAgR2l0IGNyZWRlbnRpYWwgaGVscGVyIHN0YXR1czoiCiAgZ2l0IGNvbmZpZyAtLWxpc3QgfCBncmVwIGNyZWRlbnRpYWwgfHwgZWNobyAiICBObyBjcmVkZW50aWFsIGhlbHBlcnMgY29uZmlndXJlZCIKICBlY2hvICIiCiAgZWNobyAi8J+aqyBBQk9SVElORzogQ2Fubm90IGFjY2VzcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIKICBleGl0IDEKZmkKCiMgVGVzdCBkb2NzIHJlcG9zaXRvcnkgYWNjZXNzCmVjaG8gIvCflI0gREVCVUc6IFRlc3RpbmcgZG9jcyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJERPQ1NfSFRUUF9VUkxcIiBIRUFEIgppZiBnaXQgbHMtcmVtb3RlICIkRE9DU19IVFRQX1VSTCIgSEVBRCA+IC90bXAvZG9jc190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBPdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCB8IGhlYWQgLTEpIgplbHNlCiAgZWNobyAi4p2MIERvY3MgcmVwb3NpdG9yeSBhY2Nlc3MgZmFpbGVkIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9kb2NzX3Rlc3Qub3V0KSIKICBlY2hvICIiCiAgZWNobyAi8J+aqyBBQk9SVElORzogQ2Fubm90IGFjY2VzcyBkb2NzIHJlcG9zaXRvcnkgdmlhIEhUVFBTIgogIGV4aXQgMQpmaQoKIyBDbG9uZSBvciB1cGRhdGUgcmVwb3NpdG9yeQpjZCAvd29ya3NwYWNlCmlmIFsgLWQgIiRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogICAgZWNobyAi8J+TgSBGb3VuZCBleGlzdGluZyByZXBvc2l0b3J5IGF0ICckUkVQT19ST09UJywgdXBkYXRpbmcuLi4iCiAgICBjZCAiJFJFUE9fTkFNRSIKICAgIGdpdCBmZXRjaCBvcmlnaW4gLS1wcnVuZQplbHNlCiAgICBlY2hvICLwn5OlIENsb25pbmcgcmVwb3NpdG9yeSB0byAnJFJFUE9fUk9PVCcuLi4iCiAgICBpZiAhIGdpdCBjbG9uZSAiJFJFUE9fSFRUUF9VUkwiICIkUkVQT19OQU1FIjsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gY2xvbmUgcmVwb3NpdG9yeSIKICAgICAgICBleGl0IDEKICAgIGZpCiAgICBjZCAiJFJFUE9fTkFNRSIKZmkKCiMgQ3JlYXRlIHdvcmtpbmcgZGlyZWN0b3J5IGlmIGl0J3MgYSBzdWJkaXJlY3RvcnkKaWYgWyAiJENMQVVERV9XT1JLX0RJUiIgIT0gIiRSRVBPX1JPT1QiIF07IHRoZW4KICAgIG1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSIgpmaQoKY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBXb3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKCiMgRGVyaXZlIHJlcG9zaXRvcnkgc2x1ZyBmb3IgZ2ggQ0xJIG9wZXJhdGlvbnMKUkVQT19TTFVHPSIiCmlmIGdpdCAtQyAiJENMQVVERV9XT1JLX0RJUiIgcmVtb3RlIGdldC11cmwgb3JpZ2luID4vZGV2L251bGwgMj4mMTsgdGhlbgogIE9SSUdJTl9VUkw9JChnaXQgLUMgIiRDTEFVREVfV09SS19ESVIiIHJlbW90ZSBnZXQtdXJsIG9yaWdpbiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rL1teL10rKShcXC5naXQpP3xcXDF8JykKICBlbGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgZmkKZmkKCiMgSWYgUFIgY29udGV4dCBpcyBtaXNzaW5nLCB0cnkgdG8gZGlzY292ZXIgYnkgdGFzayBsYWJlbAppZiBbIC16ICIke1BSX05VTUJFUjotfSIgXSB8fCBbIC16ICIke1BSX1VSTDotfSIgXTsgdGhlbgogIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICBpZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkUkVQT19TTFVHIiBdOyB0aGVuCiAgICBDQU5EX05VTT0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJENBTkRfTlVNIiBdOyB0aGVuCiAgICAgIFBSX05VTUJFUj0iJENBTkRfTlVNIgogICAgICBQUl9VUkw9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHVybCAtcSAudXJsIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgIGVjaG8gIuKckyBEaXNjb3ZlcmVkIFBSIGNvbnRleHQgdmlhIGxhYmVsOiBQUiAjJFBSX05VTUJFUiAoJFBSX1VSTCkiCiAgICBmaQogIGZpCmZpCgojIENoZWNrb3V0IFBSIGJyYW5jaCBmb3IgcXVhbGl0eSByZXZpZXcKaWYgWyAtbiAiJFBSX05VTUJFUiIgXSAmJiBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIENoZWNraW5nIG91dCBQUiAjJFBSX05VTUJFUiBmb3IgcXVhbGl0eSByZXZpZXcuLi4iCiAgICBjZCAiJENMQVVERV9XT1JLX0RJUiIKCiAgICAjIEZldGNoIGFsbCBsYXRlc3QgY2hhbmdlcyBpbmNsdWRpbmcgUFIgYnJhbmNoZXMKICAgIGdpdCBmZXRjaCBvcmlnaW4gLS1wcnVuZQoKICAgICMgR2V0IFBSIGJyYW5jaCBpbmZvcm1hdGlvbiBhbmQgY2hlY2tvdXQKICAgIFBSX0JSQU5DSD0kKGdoIHByIHZpZXcgIiRQUl9OVU1CRVIiIC0tanNvbiBoZWFkUmVmTmFtZSAtLWpxICcuaGVhZFJlZk5hbWUnIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBbIC1uICIkUFJfQlJBTkNIIiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+TpiBDaGVja2luZyBvdXQgUFIgYnJhbmNoOiAkUFJfQlJBTkNIIgogICAgICAgIGlmIGdpdCBjaGVja291dCAiJFBSX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZWNobyAi8J+TpSBQdWxsaW5nIGxhdGVzdCBjaGFuZ2VzIGZyb20gJFBSX0JSQU5DSC4uLiIKICAgICAgICAgICAgZ2l0IHB1bGwgb3JpZ2luICIkUFJfQlJBTkNIIiB8fCBlY2hvICLimqDvuI8gIENvdWxkIG5vdCBwdWxsIGxhdGVzdCBjaGFuZ2VzIgogICAgICAgIGVsaWYgZ2l0IGNoZWNrb3V0IC1iICIkUFJfQlJBTkNIIiAib3JpZ2luLyRQUl9CUkFOQ0giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIuKchSBDcmVhdGVkIGFuZCBjaGVja2VkIG91dCB0cmFja2luZyBicmFuY2ggZm9yICRQUl9CUkFOQ0giCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gIEJyYW5jaCBjaGVja291dCBmYWlsZWQsIHRyeWluZyBHaXRIdWIgQ0xJIG1ldGhvZC4uLiIKICAgICAgICAgICAgZ2ggcHIgY2hlY2tvdXQgIiRQUl9OVU1CRVIiIHx8IGVjaG8gIuKdjCBGYWlsZWQgdG8gY2hlY2tvdXQgUFIgdmlhIGdoIENMSSIKICAgICAgICBmaQogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyAgQ291bGQgbm90IGRldGVybWluZSBQUiBicmFuY2ggbmFtZSwgdXNpbmcgR2l0SHViIENMSSB0byBjaGVja291dCBQUiBkaXJlY3RseSIKICAgICAgICBnaCBwciBjaGVja291dCAiJFBSX05VTUJFUiIgfHwgZWNobyAi4p2MIEZhaWxlZCB0byBjaGVja291dCBQUiIKICAgIGZpCgogICAgIyBWZXJpZnkgd2UncmUgb24gdGhlIHJpZ2h0IGNvbW1pdAogICAgQ1VSUkVOVF9TSEE9JChnaXQgcmV2LXBhcnNlIEhFQUQpCiAgICBlY2hvICLwn5ONIEN1cnJlbnQgY29tbWl0OiAkQ1VSUkVOVF9TSEEiCgogICAgIyBEb24ndCBjaGFuZ2UgZGlyZWN0b3J5IHlldCAtIHdlJ2xsIGNkIHRvIENMQVVERV9XT1JLX0RJUiBhdCB0aGUgZW5kCiAgICBlY2hvICLinIUgUmVwb3NpdG9yeSBwb3NpdGlvbmVkIGF0IFBSICMkUFJfTlVNQkVSIHdpdGggbGF0ZXN0IGNoYW5nZXMiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyAgTm8gUFIgY29udGV4dCBmb3VuZCAoUFJfTlVNQkVSPSRQUl9OVU1CRVIsIFBSX1VSTD0kUFJfVVJMKSIKICAgIGVjaG8gIvCfk4sgV2lsbCBwZXJmb3JtIHF1YWxpdHkgcmV2aWV3IG9uIGN1cnJlbnQgcmVwb3NpdG9yeSBzdGF0ZSIKZmkKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UjSBDT0RFIFFVQUxJVFkgQU5BTFlTSVMgUFJFUEFSQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgplY2hvICJNSVNTSU9OOiBFbmZvcmNlIHJpZ29yb3VzIGNvZGUgcXVhbGl0eSBzdGFuZGFyZHM6IgplY2hvICIxLiBSdW4gQ2xpcHB5IHBlZGFudGljIGNoZWNrcyBvbiBhbGwgUnVzdCBjb2RlIGNoYW5nZXMiCmVjaG8gIjIuIFZlcmlmeSBjb2RlIGZvcm1hdHRpbmcgd2l0aCBjYXJnbyBmbXQgLS1jaGVjayIKZWNobyAiMy4gRXhlY3V0ZSBhbGwgdGVzdHMgd2l0aCBjYXJnbyB0ZXN0IgplY2hvICI0LiBMaW50IFlBTUwgZmlsZXMgd2hlbiBZQU1MIGNoYW5nZXMgYXJlIGRldGVjdGVkIgplY2hvICI1LiBBZGQgJ3JlYWR5LWZvci1xYScgbGFiZWwgb25seSB3aGVuIGFsbCBxdWFsaXR5IGNoZWNrcyBwYXNzIgplY2hvICIiCmVjaG8gIlF1YWxpdHkgU3RhbmRhcmRzOiIKZWNobyAiLSBaZXJvIGNsaXBweSB3YXJuaW5ncyAocGVkYW50aWMgbGV2ZWwpIgplY2hvICItIFBlcmZlY3QgY29kZSBmb3JtYXR0aW5nIgplY2hvICItIDEwMCUgdGVzdCBwYXNzaW5nIHJhdGUiCmVjaG8gIi0gQ2xlYW4gWUFNTCBzeW50YXggYW5kIHN0cnVjdHVyZSIKZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIENvcHkgdGFzayBmaWxlcyBmcm9tIGRvY3MgcmVwb3NpdG9yeSBpZiBjb25maWd1cmVkCmVjaG8gIvCfk4sgUHJlcGFyaW5nIHRhc2sgZG9jdW1lbnRhdGlvbiBmb3IgcXVhbGl0eSByZXZpZXcuLi4iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCnt7I2lmIGRvY3NSZXBvc2l0b3J5VXJsfX0KIyBJbml0aWFsaXplIGNvbXByZWhlbnNpdmUgdHJhY2tpbmcgd2l0aCBleHBsaWNpdCBzdGFnZSBmbGFncwpDT1BJRURfRklMRVM9IiIKRkFJTEVEX0ZJTEVTPSIiCkVYSVNUSU5HX0ZJTEVTPSIiCkRPQ1NfU0VUVVBfU1VDQ0VTUz1mYWxzZQpET0NTX0FVVEhfVkVSSUZJRUQ9ZmFsc2UKRE9DU19DTE9ORV9TVUNDRVNTPWZhbHNlCkRPQ1NfUEFUSF9WQUxJRD1mYWxzZQoKIyBQcmVwYXJlIHRhcmdldCBkaXJlY3RvcnkgKGVuc3VyZSBpdCBleGlzdHMpCmlmICEgbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIvdGFzayIgMj4vdG1wL21rZGlyX2Vycm9yLmxvZzsgdGhlbgogICAgZWNobyAi4p2MIENSSVRJQ0FMOiBDYW5ub3QgY3JlYXRlIHRhc2sgZGlyZWN0b3J5IgogICAgZWNobyAiICAgRXJyb3I6ICQoY2F0IC90bXAvbWtkaXJfZXJyb3IubG9nIDI+L2Rldi9udWxsIHx8IGVjaG8gJ3Vua25vd24nKSIKICAgIGVjaG8gIiAgIEFib3J0aW5nIGRvY3Mgc2V0dXAiCmVsc2UKICAgIGVjaG8gIuKckyBUYXNrIGRpcmVjdG9yeSBwcmVwYXJlZDogJENMQVVERV9XT1JLX0RJUi90YXNrIgpmaQoKIyBWYWxpZGF0ZSBHaXRIdWIgdG9rZW4gZXhpc3RzIGJlZm9yZSBwcm9jZWVkaW5nCmlmIFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICAgIGVjaG8gIuKdjCBDUklUSUNBTDogTm8gR0lUSFVCX1RPS0VOIGF2YWlsYWJsZSIKICAgIGVjaG8gIiAgIENhbm5vdCBhdXRoZW50aWNhdGUgdG8gZG9jcyByZXBvc2l0b3J5IgogICAgZWNobyAiICAgQWJvcnRpbmcgZG9jcyBzZXR1cCAtIGFnZW50IHdpbGwgaGF2ZSBsaW1pdGVkIGNvbnRleHQiCiAgICBET0NTX0FVVEhfVkVSSUZJRUQ9ZmFsc2UKZWxzZQogICAgZWNobyAi4pyTIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUgKCR7I0dJVEhVQl9UT0tFTn0gY2hhcnMpIgogICAgRE9DU19BVVRIX1ZFUklGSUVEPXRydWUKZmkKCiMgT25seSBwcm9jZWVkIGlmIHdlIGhhdmUgYXV0aGVudGljYXRpb24KaWYgWyAiJERPQ1NfQVVUSF9WRVJJRklFRCIgPSAidHJ1ZSIgXTsgdGhlbgogICAgIyBCdWlsZCBhdXRoZW50aWNhdGVkIGRvY3MgVVJMCiAgICBET0NTX1JFUE9fVVJMPSJ7e2RvY3NSZXBvc2l0b3J5VXJsfX0iCiAgICBET0NTX0hUVFBfVVJMPSQoZWNobyAiJERPQ1NfUkVQT19VUkwiIHwgc2VkICJzfGh0dHBzOi8vZ2l0aHViLmNvbS98aHR0cHM6Ly94LWFjY2Vzcy10b2tlbjokR0lUSFVCX1RPS0VOQGdpdGh1Yi5jb20vfCIpCiAgICAKICAgIGVjaG8gIvCfk6UgRG9jcyBSZXBvc2l0b3J5OiAkRE9DU19SRVBPX1VSTCIKICAgIAogICAgIyBTdGVwIDE6IFZlcmlmeSByZXBvc2l0b3J5IGFjY2VzcyAoZmFpbCBmYXN0IGlmIGluYWNjZXNzaWJsZSkKICAgIGVjaG8gIiIKICAgIGVjaG8gIvCflI0gU3RlcCAxLzQ6IFZlcmlmeWluZyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKICAgIGlmICEgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPi90bXAvZG9jc19hY2Nlc3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBSZXBvc2l0b3J5IGFjY2VzcyBGQUlMRUQiCiAgICAgICAgZWNobyAiICAgVVJMOiAkRE9DU19SRVBPX1VSTCIKICAgICAgICBlY2hvICIgICBFcnJvcjogJChjYXQgL3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCAyPi9kZXYvbnVsbCB8IGhlYWQgLTMpIgogICAgICAgIGVjaG8gIiAgIFRoaXMgaXMgYSBibG9ja2luZyBlcnJvciAtIGNhbm5vdCBwcm9jZWVkIHdpdGggZG9jcyBzZXR1cCIKICAgICAgICBET0NTX0FVVEhfVkVSSUZJRUQ9ZmFsc2UKICAgIGVsc2UKICAgICAgICBlY2hvICLinIUgUmVwb3NpdG9yeSBhY2Nlc3MgdmVyaWZpZWQiCiAgICAgICAgRE9DU19BVVRIX1ZFUklGSUVEPXRydWUKICAgIGZpCmZpCgojIFN0ZXAgMjogQ2xvbmUgcmVwb3NpdG9yeSB3aXRoIGV4cGxpY2l0IGVycm9yIGhhbmRsaW5nCmlmIFsgIiRET0NTX0FVVEhfVkVSSUZJRUQiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfk6UgU3RlcCAyLzQ6IENsb25pbmcgZG9jcyByZXBvc2l0b3J5Li4uIgogICAgCiAgICAjIENsZWFuIHVwIGFueSBleGlzdGluZyBkb2NzIGNsb25lCiAgICBybSAtcmYgL3RtcC9kb2NzLXJlcG8gL3RtcC9kb2NzX2Nsb25lX2Vycm9yLmxvZyAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAKICAgIE1BWF9BVFRFTVBUUz0zCiAgICBDTE9ORV9TVUNDRUVERUQ9ZmFsc2UKICAgIAogICAgZm9yIGF0dGVtcHQgaW4gJChzZXEgMSAkTUFYX0FUVEVNUFRTKTsgZG8KICAgICAgICBlY2hvICIgICBDbG9uZSBhdHRlbXB0ICRhdHRlbXB0LyRNQVhfQVRURU1QVFMuLi4iCiAgICAgICAgCiAgICAgICAgIyBBdHRlbXB0IGNsb25lIHdpdGggZXhwbGljaXQgZXJyb3IgY2FwdHVyZQogICAgICAgIGlmIGdpdCBjbG9uZSAtLXF1aWV0IC0tZGVwdGggMSAiJERPQ1NfSFRUUF9VUkwiIC90bXAvZG9jcy1yZXBvIDI+L3RtcC9kb2NzX2Nsb25lX2Vycm9yLmxvZzsgdGhlbgogICAgICAgICAgICAjIFZlcmlmeSBjbG9uZSBhY3R1YWxseSBzdWNjZWVkZWQKICAgICAgICAgICAgaWYgWyAtZCAiL3RtcC9kb2NzLXJlcG8vLmdpdCIgXTsgdGhlbgogICAgICAgICAgICAgICAgIyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gLSBjaGVjayBmb3IgYXQgbGVhc3Qgc29tZSBjb250ZW50CiAgICAgICAgICAgICAgICBGSUxFX0NPVU5UPSQoZmluZCAvdG1wL2RvY3MtcmVwbyAtdHlwZSBmIDI+L2Rldi9udWxsIHwgd2MgLWwpCiAgICAgICAgICAgICAgICBpZiBbICIkRklMRV9DT1VOVCIgLWd0IDAgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIENMT05FX1NVQ0NFRURFRD10cnVlCiAgICAgICAgICAgICAgICAgICAgRE9DU19DTE9ORV9TVUNDRVNTPXRydWUKICAgICAgICAgICAgICAgICAgICBlY2hvICLinIUgQ2xvbmUgc3VjY2Vzc2Z1bCAoJEZJTEVfQ09VTlQgZmlsZXMpIgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZWNobyAi4p2MIENsb25lIHN1Y2NlZWRlZCBidXQgcmVwb3NpdG9yeSBhcHBlYXJzIGVtcHR5IgogICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZWNobyAi4p2MIENsb25lIGNvbW1hbmQgc3VjY2VlZGVkIGJ1dCAuZ2l0IGRpcmVjdG9yeSBtaXNzaW5nIgogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgQ0xPTkVfRVJST1I9JChjYXQgL3RtcC9kb2NzX2Nsb25lX2Vycm9yLmxvZyAyPi9kZXYvbnVsbCB8IGhlYWQgLTMpCiAgICAgICAgICAgIGVjaG8gIuKdjCBDbG9uZSBmYWlsZWQ6ICR7Q0xPTkVfRVJST1I6LVVua25vd24gZXJyb3J9IgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgIyBSZXRyeSBsb2dpYwogICAgICAgIGlmIFsgJGF0dGVtcHQgLWx0ICRNQVhfQVRURU1QVFMgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIgICBXYWl0aW5nIDUgc2Vjb25kcyBiZWZvcmUgcmV0cnkuLi4iCiAgICAgICAgICAgIHNsZWVwIDUKICAgICAgICBmaQogICAgZG9uZQogICAgCiAgICBpZiBbICIkQ0xPTkVfU1VDQ0VFREVEIiAhPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGQUlMRUQgdG8gY2xvbmUgYWZ0ZXIgJE1BWF9BVFRFTVBUUyBhdHRlbXB0cyIKICAgICAgICBlY2hvICIgICBMYXN0IGVycm9yOiAkKGNhdCAvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIDI+L2Rldi9udWxsIHx8IGVjaG8gJ05vIGVycm9yIGxvZyBhdmFpbGFibGUnKSIKICAgICAgICBET0NTX0NMT05FX1NVQ0NFU1M9ZmFsc2UKICAgIGZpCmVsc2UKICAgIGVjaG8gIiIKICAgIGVjaG8gIuKPre+4jyAgU3RlcCAyLzQ6IFNLSVBQRUQgKGF1dGhlbnRpY2F0aW9uIGZhaWxlZCBvciBub3QgYXZhaWxhYmxlKSIKZmkKCiMgU3RlcCAzOiBEZXRlcm1pbmUgYW5kIHZhbGlkYXRlIHBhdGhzIHdpdGggc2ltcGxpZmllZCBsb2dpYwppZiBbICIkRE9DU19DTE9ORV9TVUNDRVNTIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5OCIFN0ZXAgMy80OiBWYWxpZGF0aW5nIGRvY3VtZW50YXRpb24gcGF0aHMuLi4iCiAgICAKICAgICMgU2ltcGxpZmllZCBwYXRoIGRldGVybWluYXRpb24gLSBzaW5nbGUgY2xlYXIgbG9naWMgcGF0aAogICAge3sjaWYgZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19CiAgICAjIGRvY3NfcHJvamVjdF9kaXJlY3RvcnkgaXMgc3BlY2lmaWVkCiAgICBpZiBbICJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIgPSAiLiIgXSB8fCBbICJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIgPSAiIiBdOyB0aGVuCiAgICAgICAgIyBSb290IG9mIHJlcG9zaXRvcnkKICAgICAgICBET0NTX0JBU0VfUEFUSD0iL3RtcC9kb2NzLXJlcG8iCiAgICAgICAgZWNobyAiICAgVXNpbmcgcmVwb3NpdG9yeSByb290IChkb2NzX3Byb2plY3RfZGlyZWN0b3J5PSd7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fScpIgogICAgZWxzZQogICAgICAgICMgU3ViZGlyZWN0b3J5IHNwZWNpZmllZAogICAgICAgIERPQ1NfQkFTRV9QQVRIPSIvdG1wL2RvY3MtcmVwby97e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKICAgICAgICBlY2hvICIgICBVc2luZyBzdWJkaXJlY3Rvcnk6IHt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgogICAgZmkKICAgIHt7ZWxzZX19CiAgICAjIE5vIGRvY3NfcHJvamVjdF9kaXJlY3Rvcnkgc3BlY2lmaWVkIC0gZGVmYXVsdCB0byByb290CiAgICBET0NTX0JBU0VfUEFUSD0iL3RtcC9kb2NzLXJlcG8iCiAgICBlY2hvICIgICBVc2luZyByZXBvc2l0b3J5IHJvb3QgKG5vIGRvY3NfcHJvamVjdF9kaXJlY3Rvcnkgc3BlY2lmaWVkKSIKICAgIHt7L2lmfX0KICAgIAogICAgIyBWYWxpZGF0ZSBiYXNlIHBhdGggZXhpc3RzCiAgICBpZiBbICEgLWQgIiRET0NTX0JBU0VfUEFUSCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBCYXNlIHBhdGggZG9lcyBub3QgZXhpc3Q6ICRET0NTX0JBU0VfUEFUSCIKICAgICAgICBlY2hvICIgICBSZXBvc2l0b3J5IHN0cnVjdHVyZToiCiAgICAgICAgbHMgLWxhIC90bXAvZG9jcy1yZXBvIDI+L2Rldi9udWxsIHwgaGVhZCAtMTAgfHwgZWNobyAiICAgQ2Fubm90IGxpc3QgcmVwb3NpdG9yeSIKICAgICAgICBET0NTX1BBVEhfVkFMSUQ9ZmFsc2UKICAgICAgICBET0NTX0NMT05FX1NVQ0NFU1M9ZmFsc2UKICAgIGVsc2UKICAgICAgICAjIEJ1aWxkIGFuZCB2YWxpZGF0ZSByZW1haW5pbmcgcGF0aHMKICAgICAgICBET0NTX1BBVEg9IiRET0NTX0JBU0VfUEFUSC8udGFza21hc3RlciIKICAgICAgICBUQVNLX0RJUj0iJERPQ1NfUEFUSC9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCiAgICAgICAgCiAgICAgICAgZWNobyAi4pyFIEJhc2UgcGF0aCBleGlzdHM6ICRET0NTX0JBU0VfUEFUSCIKICAgICAgICBlY2hvICIgICBUYXNrbWFzdGVyIGRpcmVjdG9yeTogJERPQ1NfUEFUSCIKICAgICAgICBlY2hvICIgICBUYXNrIGRpcmVjdG9yeTogJFRBU0tfRElSIgogICAgICAgIAogICAgICAgICMgVmFsaWRhdGUgLnRhc2ttYXN0ZXIgZGlyZWN0b3J5CiAgICAgICAgaWYgWyAhIC1kICIkRE9DU19QQVRIIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIuKaoO+4jyAgLnRhc2ttYXN0ZXIgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdDogJERPQ1NfUEFUSCIKICAgICAgICAgICAgZWNobyAiICAgVGhpcyBsaWtlbHkgaW5kaWNhdGVzIGluY29ycmVjdCBkb2NzX3Byb2plY3RfZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24iCiAgICAgICAgICAgIGVjaG8gIiAgIEF2YWlsYWJsZSBkaXJlY3RvcmllcyBpbiBiYXNlIHBhdGg6IgogICAgICAgICAgICBscyAtZCAiJERPQ1NfQkFTRV9QQVRIIi8qLyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiICAgTm9uZSB2aXNpYmxlIgogICAgICAgICAgICBET0NTX1BBVEhfVkFMSUQ9ZmFsc2UKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKchSAudGFza21hc3RlciBkaXJlY3RvcnkgZm91bmQiCiAgICAgICAgICAgIERPQ1NfUEFUSF9WQUxJRD10cnVlCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIENoZWNrIHRhc2sgZGlyZWN0b3J5IChpbmZvcm1hdGlvbmFsIG9ubHksIG5vdCBibG9ja2luZykKICAgICAgICBpZiBbICEgLWQgIiRUQVNLX0RJUiIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLimqDvuI8gIFRhc2stc3BlY2lmaWMgZGlyZWN0b3J5IG5vdCBmb3VuZDogJFRBU0tfRElSIgogICAgICAgICAgICBpZiBbIC1kICIkRE9DU19QQVRIL2RvY3MiIF07IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIiAgIEF2YWlsYWJsZSB0YXNrIGRpcmVjdG9yaWVzOiIKICAgICAgICAgICAgICAgIGxzIC1kICIkRE9DU19QQVRIL2RvY3MvdGFzay0iKiAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiICAgTm9uZSBmb3VuZCIKICAgICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKchSBUYXNrIGRpcmVjdG9yeSBmb3VuZCIKICAgICAgICBmaQogICAgZmkKZWxzZQogICAgZWNobyAiIgogICAgZWNobyAi4o+t77iPICBTdGVwIDMvNDogU0tJUFBFRCAoY2xvbmUgd2FzIG5vdCBzdWNjZXNzZnVsKSIKZmkKCiMgU3RlcCA0OiBDb3B5IGRvY3VtZW50YXRpb24gZmlsZXMgd2l0aCBlbmhhbmNlZCBlcnJvciB0cmFja2luZwppZiBbICIkRE9DU19QQVRIX1ZBTElEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5OLIFN0ZXAgNC80OiBDb3B5aW5nIGRvY3VtZW50YXRpb24gZmlsZXMuLi4iCiAgICAKICAgICMgRW5oYW5jZWQgZmlsZSBjb3B5IGhlbHBlciB3aXRoIGJldHRlciBlcnJvciBoYW5kbGluZwogICAgc2FmZV9jb3B5X2ZpbGUoKSB7CiAgICAgICAgbG9jYWwgc3JjPSIkMSIKICAgICAgICBsb2NhbCBkZXN0PSIkMiIKICAgICAgICBsb2NhbCBmaWxlbmFtZT0iJDMiCiAgICAgICAgCiAgICAgICAgIyBWYWxpZGF0ZSBzb3VyY2UgZXhpc3RzCiAgICAgICAgaWYgWyAhIC1mICIkc3JjIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAg4oqYICRmaWxlbmFtZSAtIHNvdXJjZSBub3QgZm91bmQiCiAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIENoZWNrIGlmIHNvdXJjZSBpcyByZWFkYWJsZSBhbmQgaGFzIGNvbnRlbnQKICAgICAgICBpZiBbICEgLXIgIiRzcmMiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAiICDinYwgJGZpbGVuYW1lIC0gc291cmNlIG5vdCByZWFkYWJsZSIKICAgICAgICAgICAgRkFJTEVEX0ZJTEVTPSIkRkFJTEVEX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgICAgIAogICAgICAgIGxvY2FsIHNyY19zaXplPSQod2MgLWMgPCAiJHNyYyIgMj4vZGV2L251bGwgfHwgZWNobyAiMCIpCiAgICAgICAgaWYgWyAiJHNyY19zaXplIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAg4pqg77iPICAkZmlsZW5hbWUgLSBzb3VyY2UgaXMgZW1wdHkgKDAgYnl0ZXMpIgogICAgICAgICAgICBGQUlMRURfRklMRVM9IiRGQUlMRURfRklMRVMgJGZpbGVuYW1lIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgIyBDaGVjayBpZiBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cyB3aXRoIGNvbnRlbnQKICAgICAgICBpZiBbIC1mICIkZGVzdCIgXSAmJiBbIC1zICIkZGVzdCIgXTsgdGhlbgogICAgICAgICAgICBsb2NhbCBkZXN0X3NpemU9JCh3YyAtYyA8ICIkZGVzdCIpCiAgICAgICAgICAgIGVjaG8gIiAg4oa7ICRmaWxlbmFtZSAtIGFscmVhZHkgZXhpc3RzICgke2Rlc3Rfc2l6ZX1CKSwgcHJlc2VydmluZyIKICAgICAgICAgICAgRVhJU1RJTkdfRklMRVM9IiRFWElTVElOR19GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIEF0dGVtcHQgY29weSB3aXRoIGV4cGxpY2l0IGVycm9yIGhhbmRsaW5nCiAgICAgICAgaWYgY3AgIiRzcmMiICIkZGVzdCIgMj4vdG1wL2NvcHlfZXJyb3JfJHtmaWxlbmFtZX0ubG9nOyB0aGVuCiAgICAgICAgICAgICMgVmVyaWZ5IGNvcHkgc3VjY2VlZGVkIGFuZCBoYXMgY29udGVudAogICAgICAgICAgICBpZiBbIC1mICIkZGVzdCIgXSAmJiBbIC1zICIkZGVzdCIgXTsgdGhlbgogICAgICAgICAgICAgICAgbG9jYWwgY29waWVkX3NpemU9JCh3YyAtYyA8ICIkZGVzdCIpCiAgICAgICAgICAgICAgICAjIFZlcmlmeSBzaXplIG1hdGNoZXMgc291cmNlCiAgICAgICAgICAgICAgICBpZiBbICIkY29waWVkX3NpemUiID0gIiRzcmNfc2l6ZSIgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAg4pyFICRmaWxlbmFtZSAtIGNvcGllZCBzdWNjZXNzZnVsbHkgKCR7Y29waWVkX3NpemV9QikiCiAgICAgICAgICAgICAgICAgICAgQ09QSUVEX0ZJTEVTPSIkQ09QSUVEX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGVjaG8gIiAg4p2MICRmaWxlbmFtZSAtIHNpemUgbWlzbWF0Y2ggKHNyYzoke3NyY19zaXplfUIgZGVzdDoke2NvcGllZF9zaXplfUIpIgogICAgICAgICAgICAgICAgICAgIHJtIC1mICIkZGVzdCIKICAgICAgICAgICAgICAgICAgICBGQUlMRURfRklMRVM9IiRGQUlMRURfRklMRVMgJGZpbGVuYW1lIgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBlY2hvICIgIOKdjCAkZmlsZW5hbWUgLSBjb3B5IHN1Y2NlZWRlZCBidXQgZGVzdGluYXRpb24gaXMgZW1wdHkiCiAgICAgICAgICAgICAgICBybSAtZiAiJGRlc3QiCiAgICAgICAgICAgICAgICBGQUlMRURfRklMRVM9IiRGQUlMRURfRklMRVMgJGZpbGVuYW1lIgogICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgZmkKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvY2FsIGVycm9yPSQoY2F0IC90bXAvY29weV9lcnJvcl8ke2ZpbGVuYW1lfS5sb2cgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biBlcnJvciIpCiAgICAgICAgICAgIGVjaG8gIiAg4p2MICRmaWxlbmFtZSAtIGNvcHkgZmFpbGVkOiAkZXJyb3IiCiAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgIH0KICAgIAogICAgIyBDb3B5IHRhc2stc3BlY2lmaWMgZmlsZXMgKHRhc2subWQgaXMgY3JpdGljYWwsIG90aGVycyBhcmUgb3B0aW9uYWwpCiAgICBDUklUSUNBTF9GSUxFU19DT1BJRUQ9MAogICAgaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICAgICAgZWNobyAiICDwn5OBIFByb2Nlc3NpbmcgdGFzay1zcGVjaWZpYyBmaWxlcyBmcm9tOiAkVEFTS19ESVIiCiAgICAgICAgCiAgICAgICAgIyBDcml0aWNhbCBmaWxlOiB0YXNrLm1kCiAgICAgICAgaWYgc2FmZV9jb3B5X2ZpbGUgIiRUQVNLX0RJUi90YXNrLm1kIiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rhc2subWQiICJ0YXNrLm1kIjsgdGhlbgogICAgICAgICAgICBDUklUSUNBTF9GSUxFU19DT1BJRUQ9JCgoQ1JJVElDQUxfRklMRVNfQ09QSUVEICsgMSkpCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIE9wdGlvbmFsIGZpbGVzCiAgICAgICAgc2FmZV9jb3B5X2ZpbGUgIiRUQVNLX0RJUi9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiICJhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiB8fCB0cnVlCiAgICAgICAgc2FmZV9jb3B5X2ZpbGUgIiRUQVNLX0RJUi9wcm9tcHQubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiAicHJvbXB0Lm1kIiB8fCB0cnVlCiAgICBlbHNlCiAgICAgICAgZWNobyAiICDimqDvuI8gIFRhc2sgZGlyZWN0b3J5IG5vdCBmb3VuZDogJFRBU0tfRElSIgogICAgICAgIGVjaG8gIiAgU2tpcHBpbmcgdGFzay1zcGVjaWZpYyBmaWxlcyAodGFzay5tZCwgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCwgcHJvbXB0Lm1kKSIKICAgICAgICBGQUlMRURfRklMRVM9IiRGQUlMRURfRklMRVMgdGFzay5tZCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIHByb21wdC5tZCIKICAgIGZpCiAgICAKICAgICMgQ29weSBhcmNoaXRlY3R1cmUgZG9jdW1lbnRhdGlvbiAob3B0aW9uYWwpCiAgICBzYWZlX2NvcHlfZmlsZSAiJERPQ1NfUEFUSC9kb2NzL2FyY2hpdGVjdHVyZS5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay9hcmNoaXRlY3R1cmUubWQiICJhcmNoaXRlY3R1cmUubWQiIHx8IHRydWUKICAgIAogICAgIyBEZXRlcm1pbmUgb3ZlcmFsbCBzdWNjZXNzCiAgICAjIFN1Y2Nlc3MgaWYgYXQgbGVhc3Qgb25lIGNyaXRpY2FsIGZpbGUgd2FzIGNvcGllZC9leGlzdHMgT1IgYW55IGZpbGVzIHdlcmUgY29waWVkL2V4aXN0CiAgICBBVkFJTEFCTEVfRklMRV9DT1VOVD0kKGxzIC0xICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8IHdjIC1sKQogICAgaWYgWyAiJEFWQUlMQUJMRV9GSUxFX0NPVU5UIiAtZ3QgMCBdOyB0aGVuCiAgICAgICAgRE9DU19TRVRVUF9TVUNDRVNTPXRydWUKICAgICAgICBlY2hvICIgIOKchSBTZXR1cCBzdWNjZXNzZnVsIC0gJEFWQUlMQUJMRV9GSUxFX0NPVU5UIGZpbGUocykgYXZhaWxhYmxlIgogICAgZWxzZQogICAgICAgIGVjaG8gIiAg4p2MIFNldHVwIGZhaWxlZCAtIG5vIGZpbGVzIGF2YWlsYWJsZSBmb3IgYWdlbnQiCiAgICAgICAgRE9DU19TRVRVUF9TVUNDRVNTPWZhbHNlCiAgICBmaQplbHNlCiAgICBlY2hvICIiCiAgICBlY2hvICLij63vuI8gIFN0ZXAgNC80OiBTS0lQUEVEIChwYXRoIHZhbGlkYXRpb24gZmFpbGVkKSIKZmkKCiMgQ29tcHJlaGVuc2l2ZSBmaW5hbCBzdW1tYXJ5IHdpdGggY2xlYXIgc3RhdHVzCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5OKIFRBU0sgRE9DVU1FTlRBVElPTiBTRVRVUCBTVU1NQVJZIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIE92ZXJhbGwgc3RhdHVzIHdpdGggY2xlYXIgcGFzcy9mYWlsCmlmIFsgIiRET0NTX1NFVFVQX1NVQ0NFU1MiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIuKchSBTVEFUVVM6IFNVQ0NFU1MiCiAgICBlY2hvICIgICBEb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGFnZW50IgplbHNlCiAgICBlY2hvICLinYwgU1RBVFVTOiBGQUlMRUQiCiAgICBlY2hvICIgICBBZ2VudCB3aWxsIHByb2NlZWQgd2l0aCBsaW1pdGVkIGNvbnRleHQiCmZpCgojIERldGFpbGVkIHN0YWdlIGJyZWFrZG93bgplY2hvICIiCmVjaG8gIlBpcGVsaW5lIFN0YWdlczoiCnByaW50ZiAiICAxLiBBdXRoZW50aWNhdGlvbjogICAlc1xuIiAiJChbICIkRE9DU19BVVRIX1ZFUklGSUVEIiA9ICJ0cnVlIiBdICYmIGVjaG8gIuKchSBWZXJpZmllZCIgfHwgZWNobyAi4p2MIEZhaWxlZCIpIgpwcmludGYgIiAgMi4gQ2xvbmU6ICAgICAgICAgICAgJXNcbiIgIiQoWyAiJERPQ1NfQ0xPTkVfU1VDQ0VTUyIgPSAidHJ1ZSIgXSAmJiBlY2hvICLinIUgU3VjY2VzcyIgfHwgZWNobyAi4p2MIEZhaWxlZCIpIgpwcmludGYgIiAgMy4gUGF0aCBWYWxpZGF0aW9uOiAgJXNcbiIgIiQoWyAiJERPQ1NfUEFUSF9WQUxJRCIgPSAidHJ1ZSIgXSAmJiBlY2hvICLinIUgVmFsaWQiIHx8IGVjaG8gIuKdjCBJbnZhbGlkIikiCnByaW50ZiAiICA0LiBGaWxlIE9wZXJhdGlvbnM6ICAlc1xuIiAiJChbICIkRE9DU19TRVRVUF9TVUNDRVNTIiA9ICJ0cnVlIiBdICYmIGVjaG8gIuKchSBDb21wbGV0ZSIgfHwgZWNobyAi4p2MIEluY29tcGxldGUiKSIKCiMgRmlsZSBzdGF0dXMgdHJhY2tpbmcKaWYgWyAtbiAiJENPUElFRF9GSUxFUyIgXTsgdGhlbgogICAgZWNobyAiIgogICAgZWNobyAi8J+ThCBOZXdseSBjb3BpZWQ6JENPUElFRF9GSUxFUyIKZmkKCmlmIFsgLW4gIiRFWElTVElOR19GSUxFUyIgXTsgdGhlbgogICAgZWNobyAi8J+ThCBQcmVzZXJ2ZWQgZXhpc3Rpbmc6JEVYSVNUSU5HX0ZJTEVTIgpmaQoKaWYgWyAtbiAiJEZBSUxFRF9GSUxFUyIgXTsgdGhlbgogICAgZWNobyAi4p2MIEZhaWxlZC9taXNzaW5nOiRGQUlMRURfRklMRVMiCmZpCgojIExpc3QgYWN0dWFsIGF2YWlsYWJsZSBmaWxlcyBpbiB0YXNrIGRpcmVjdG9yeQplY2hvICIiCmVjaG8gIvCfk4EgVGFzayBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZToiCmlmIFsgLWQgIiRDTEFVREVfV09SS19ESVIvdGFzayIgXSAmJiBbICIkKGxzIC1BICIkQ0xBVURFX1dPUktfRElSL3Rhc2siIDI+L2Rldi9udWxsIHwgd2MgLWwpIiAtZ3QgMCBdOyB0aGVuCiAgICBscyAtbGggIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHwgdGFpbCAtbiArMiB8IHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KICAgICAgICBmaWxlbmFtZT0kKGVjaG8gIiRsaW5lIiB8IGF3ayAne3ByaW50ICQ5fScpCiAgICAgICAgc2l6ZT0kKGVjaG8gIiRsaW5lIiB8IGF3ayAne3ByaW50ICQ1fScpCiAgICAgICAgcHJpbnRmICIgICDinJMgJXMgKCVzKVxuIiAiJGZpbGVuYW1lIiAiJHNpemUiCiAgICBkb25lCmVsc2UKICAgIGVjaG8gIiAgIChub25lIGF2YWlsYWJsZSkiCmZpCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFNtYXJ0IGNsZWFudXAgc3RyYXRlZ3kgLSBwcmVzZXJ2ZSBkZWJ1Z2dpbmcgaW5mbyBvbiBmYWlsdXJlCmlmIFsgIiRET0NTX1NFVFVQX1NVQ0NFU1MiID0gInRydWUiIF0gJiYgWyAteiAiJEZBSUxFRF9GSUxFUyIgXTsgdGhlbgogICAgIyBGdWxsIHN1Y2Nlc3MgLSBjbGVhbiB1cCBldmVyeXRoaW5nCiAgICBybSAtcmYgL3RtcC9kb2NzLXJlcG8gL3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCAvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIC90bXAvY29weV9lcnJvcl8qLmxvZyAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlY2hvICLinJMgVGVtcG9yYXJ5IGZpbGVzIGNsZWFuZWQgKHNldHVwIHN1Y2Nlc3NmdWwpIgplbHNlCiAgICAjIFBhcnRpYWwgb3IgY29tcGxldGUgZmFpbHVyZSAtIGtlZXAgZGVidWdnaW5nIGluZm8KICAgIGVjaG8gIuKaoO+4jyAgUHJlc2VydmluZyB0ZW1wb3JhcnkgZmlsZXMgZm9yIGRlYnVnZ2luZyIKICAgIGVjaG8gIiIKICAgIGVjaG8gIkRlYnVnIEluZm9ybWF0aW9uIEF2YWlsYWJsZToiCiAgICBbIC1kICIvdG1wL2RvY3MtcmVwbyIgXSAmJiBlY2hvICIgICDinJMgL3RtcC9kb2NzLXJlcG8gKGNsb25lZCByZXBvc2l0b3J5KSIKICAgIFsgLWYgIi90bXAvZG9jc19hY2Nlc3NfdGVzdC5vdXQiIF0gJiYgZWNobyAiICAg4pyTIC90bXAvZG9jc19hY2Nlc3NfdGVzdC5vdXQgKGFjY2VzcyB0ZXN0IG91dHB1dCkiCiAgICBbIC1mICIvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIiBdICYmIGVjaG8gIiAgIOKckyAvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIChjbG9uZSBlcnJvcnMpIgogICAgbHMgL3RtcC9jb3B5X2Vycm9yXyoubG9nIDI+L2Rldi9udWxsIHwgd2hpbGUgcmVhZCAtciBsb2c7IGRvCiAgICAgICAgZWNobyAiICAg4pyTICRsb2ciCiAgICBkb25lIHx8IHRydWUKICAgIAogICAgIyBQcm92aWRlIHNwZWNpZmljIHRyb3VibGVzaG9vdGluZyBndWlkYW5jZQogICAgZWNobyAiIgogICAgZWNobyAiVHJvdWJsZXNob290aW5nIFN0ZXBzOiIKICAgIGlmIFsgIiRET0NTX0FVVEhfVkVSSUZJRUQiICE9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiICAgMS4gVmVyaWZ5IEdJVEhVQl9UT0tFTiBpcyB2YWxpZCBhbmQgaGFzIHJlcG9zaXRvcnkgYWNjZXNzIgogICAgICAgIGVjaG8gIiAgIDIuIENoZWNrIHJlcG9zaXRvcnkgVVJMOiB7e2RvY3NSZXBvc2l0b3J5VXJsfX0iCiAgICBmaQogICAgaWYgWyAiJERPQ1NfQ0xPTkVfU1VDQ0VTUyIgIT0gInRydWUiIF0gJiYgWyAiJERPQ1NfQVVUSF9WRVJJRklFRCIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgIGVjaG8gIiAgIDEuIFJldmlldyBjbG9uZSBlcnJvciBsb2c6IC90bXAvZG9jc19jbG9uZV9lcnJvci5sb2ciCiAgICAgICAgZWNobyAiICAgMi4gVmVyaWZ5IHJlcG9zaXRvcnkgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlIgogICAgZmkKICAgIGlmIFsgIiRET0NTX1BBVEhfVkFMSUQiICE9ICJ0cnVlIiBdICYmIFsgIiRET0NTX0NMT05FX1NVQ0NFU1MiID0gInRydWUiIF07IHRoZW4KICAgICAgICBlY2hvICIgICAxLiBDaGVjayBkb2NzX3Byb2plY3RfZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb246ICd7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSciCiAgICAgICAgZWNobyAiICAgMi4gVmVyaWZ5IC50YXNrbWFzdGVyIGRpcmVjdG9yeSBleGlzdHMgaW4gY29uZmlndXJlZCBwYXRoIgogICAgICAgIGVjaG8gIiAgIDMuIExpc3QgcmVwb3NpdG9yeSBzdHJ1Y3R1cmU6IGxzIC1sYSAvdG1wL2RvY3MtcmVwbyIKICAgIGZpCmZpCgp7e2Vsc2V9fQojIE5vIGRvY3MgcmVwb3NpdG9yeSBjb25maWd1cmVkIC0gY2hlY2sgZm9yIGxvY2FsIHRhc2sgZmlsZXMKZWNobyAi4oS577iPICBObyBkb2NzIHJlcG9zaXRvcnkgY29uZmlndXJlZCIKZWNobyAiQ2hlY2tpbmcgZm9yIGxvY2FsIHRhc2sgZmlsZXMgaW4gcmVwb3NpdG9yeS4uLiIKCmlmIFsgLWQgIiRDTEFVREVfV09SS19ESVIvdGFzayIgXTsgdGhlbgogICAgRklMRV9DT1VOVD0kKGxzIC1BICIkQ0xBVURFX1dPUktfRElSL3Rhc2siIDI+L2Rldi9udWxsIHwgd2MgLWwpCiAgICBpZiBbICIkRklMRV9DT1VOVCIgLWd0IDAgXTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBGb3VuZCB0YXNrIGRpcmVjdG9yeSB3aXRoICRGSUxFX0NPVU5UIGZpbGUocykiCiAgICAgICAgZWNobyAiIgogICAgICAgIGVjaG8gIvCfk4EgQXZhaWxhYmxlIGZpbGVzOiIKICAgICAgICBscyAtbGggIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHwgdGFpbCAtbiArMiB8IHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KICAgICAgICAgICAgZmlsZW5hbWU9JChlY2hvICIkbGluZSIgfCBhd2sgJ3twcmludCAkOX0nKQogICAgICAgICAgICBzaXplPSQoZWNobyAiJGxpbmUiIHwgYXdrICd7cHJpbnQgJDV9JykKICAgICAgICAgICAgcHJpbnRmICIgICDinJMgJXMgKCVzKVxuIiAiJGZpbGVuYW1lIiAiJHNpemUiCiAgICAgICAgZG9uZQogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyAgVGFzayBkaXJlY3RvcnkgZXhpc3RzIGJ1dCBpcyBlbXB0eSIKICAgICAgICBlY2hvICIgICBBZ2VudCB3aWxsIHByb2NlZWQgd2l0aCBsaW1pdGVkIGNvbnRleHQiCiAgICBmaQplbHNlCiAgICBlY2hvICLimqDvuI8gIE5vIHRhc2sgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUiCiAgICBlY2hvICIgICAtIE5vIGRvY3MgcmVwb3NpdG9yeSBjb25maWd1cmVkIChkb2NzUmVwb3NpdG9yeVVybCBub3Qgc2V0KSIKICAgIGVjaG8gIiAgIC0gTm8gbG9jYWwgdGFzay8gZGlyZWN0b3J5IGZvdW5kIGluIHJlcG9zaXRvcnkiCiAgICBlY2hvICIgICBBZ2VudCB3aWxsIHByb2NlZWQgd2l0aCBtaW5pbWFsIGNvbnRleHQiCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKe3svaWZ9fQoKIyBFbnN1cmUgd2UncmUgaW4gdGhlIGdpdCByZXBvc2l0b3J5IHdvcmtpbmcgZGlyZWN0b3J5CmVjaG8gIuKckyBXb3JraW5nIGRpcmVjdGx5IGluIGdpdCByZXBvc2l0b3J5IGF0OiAkQ0xBVURFX1dPUktfRElSIgoKIyBDaGVjayBpZiB3ZSBzaG91bGQgY29udGludWUgcHJldmlvdXMgc2Vzc2lvbgp7eyNpZiBjb250aW51ZV9zZXNzaW9ufX0KZWNobyAi8J+TgiBDb250aW51aW5nIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4uLiIKIyBQcmVzZXJ2ZSBleGlzdGluZyBDTEFVREUubWQgaWYgaXQgZXhpc3RzCmlmIFsgLWYgIi93b3Jrc3BhY2UvQ0xBVURFLm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgZXhpc3RpbmcgQ0xBVURFLm1kLCBwcmVzZXJ2aW5nIHNlc3Npb24gbWVtb3J5IgpmaQp7e2Vsc2V9fQp7eyNpZiBvdmVyd3JpdGVfbWVtb3J5fX0KZWNobyAi8J+UhCBPdmVyd3JpdGluZyBzZXNzaW9uIG1lbW9yeSBhcyByZXF1ZXN0ZWQuLi4iCnJtIC1mIC93b3Jrc3BhY2UvQ0xBVURFLm1kCnt7L2lmfX0Ke3svaWZ9fQoKIyBHZW5lcmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gdGVtcGxhdGVzCmVjaG8gIvCflKcgR2VuZXJhdGluZyBDbGVvLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZXMuLi4iCgojIEVudGVycHJpc2UgbWFuYWdlZCBzZXR0aW5ncyBhcmUgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcAplY2hvICI9PT0gRU5URVJQUklTRSBNQU5BR0VEIFNFVFRJTkdTID09PSIKZWNobyAi4pyTIFNldHRpbmdzIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAgYXQ6IC9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIgplY2hvICLinJMgTm8gY29weWluZyBuZWVkZWQgLSBtb3VudCBhdXRvbWF0aWNhbGx5IHJlZmxlY3RzIGxhdGVzdCBDb25maWdNYXAgY2hhbmdlcyIKCiMgVmVyaWZ5IGNsaWVudC1jb25maWcuanNvbiBpcyBhdmFpbGFibGUgYW5kIHZhbGlkCmVjaG8gIj09PSBUT09MTUFOIENPTkZJRyBTRVRVUCA9PT0iCldPUktTUEFDRV9DRkc9IiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iCgojIEhlbHBlciB0byBjaGVjayBub24tZW1wdHkgSlNPTiBvYmplY3QKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHA9IiQxIgogIFsgLWYgIiRwIiBdIHx8IHJldHVybiAxCiAganEgLWUgJ3R5cGU9PSJvYmplY3QiIGFuZCBsZW5ndGg+MCcgIiRwIiA+L2Rldi9udWxsIDI+JjEKfQoKU1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTPSJuZWVkcy1maXhlcyIKU1RBVFVTX0xBQkVMX0ZJWElORz0iZml4aW5nLWluLXByb2dyZXNzIgpTVEFUVVNfTEFCRUxfTkVFRFNfQ0xFTz0ibmVlZHMtY2xlbyIKU1RBVFVTX0xBQkVMX05FRURTX1RFU1M9Im5lZWRzLXRlc3MiClNUQVRVU19MQUJFTF9BUFBST1ZFRD0iYXBwcm92ZWQiClNUQVRVU19MQUJFTF9GQUlMRUQ9ImZhaWxlZC1yZW1lZGlhdGlvbiIKU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWT0ibmVlZHMgdGVzdHMiCgplbnN1cmVfc3RhdHVzX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBzaGlmdAogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBlbnRyeSBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGVudHJ5IiBdIHx8IGNvbnRpbnVlCiAgICBsb2NhbCBsYWJlbD0iJHtlbnRyeSUlOip9IgogICAgbG9jYWwgcmVzdD0iJHtlbnRyeSMqOn0iCiAgICBsb2NhbCBjb2xvcj0iJHtyZXN0JSU6Kn0iCiAgICBsb2NhbCBkZXNjPSIke3Jlc3QjKjp9IgoKICAgIGlmICEgZ2ggbGFiZWwgbGlzdCAtUiAiJHJlcG8iIC0tc2VhcmNoICIkbGFiZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgZ2ggbGFiZWwgY3JlYXRlICIkbGFiZWwiIC1SICIkcmVwbyIgLS1jb2xvciAiJGNvbG9yIiAtLWRlc2NyaXB0aW9uICIkZGVzYyIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgpwcl9hZGRfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIGxvY2FsIHByX251bWJlcj0iJDIiCiAgbG9jYWwgcHJfdXJsPSIkMyIKICBzaGlmdCAzCgogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBsYWJlbCBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGxhYmVsIiBdIHx8IGNvbnRpbnVlCiAgICBpZiBbIC1uICIkcHJfbnVtYmVyIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl9udW1iZXIiIC1SICIkcmVwbyIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICMkcHJfbnVtYmVyIgogICAgZWxpZiBbIC1uICIkcHJfdXJsIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl91cmwiIC0tYWRkLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbCAnJGxhYmVsJyB0byBQUiAkcHJfdXJsIgogICAgZmkKICBkb25lCn0KCnByX3JlbW92ZV9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLXJlbW92ZS1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZWxpZiBbIC1uICIkcHJfdXJsIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl91cmwiIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKfQoKdXBkYXRlX2NvZGVydW5fc3RhdHVzKCkgewogIGxvY2FsIHJlbWVkaWF0aW9uPSIkMSIKICBsb2NhbCBxYT0iJDIiCiAgbG9jYWwgcHJfdXJsX3ZhbHVlPSIkezM6LSRQUl9VUkx9IgoKICBpZiAhIGNvbW1hbmQgLXYga3ViZWN0bCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHJldHVybgogIGZpCgogIGlmICEgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBqcSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBDb2RlUnVuIHN0YXR1cyB1cGRhdGUiCiAgICByZXR1cm4KICBmaQoKICBsb2NhbCB0aW1lc3RhbXAKICB0aW1lc3RhbXA9JChkYXRlIC11ICsiJVktJW0tJWRUJUg6JU06JVNaIikKCiAgbG9jYWwgcGF0Y2gKICBwYXRjaD0kKGpxIC1uIFwKICAgIC0tYXJnIHRzICIkdGltZXN0YW1wIiBcCiAgICAtLWFyZyBwciAiJHByX3VybF92YWx1ZSIgXAogICAgLS1hcmcgcmVtICIkcmVtZWRpYXRpb24iIFwKICAgIC0tYXJnIHFhICIkcWEiIFwKICAgICd7c3RhdHVzOiAoe2xhc3RVcGRhdGU6ICR0c30KICAgICAgICArIChpZiAkcHIgIT0gIiIgdGhlbiB7cHVsbFJlcXVlc3RVcmw6ICRwcn0gZWxzZSB7fSBlbmQpCiAgICAgICAgKyAoaWYgJHJlbSAhPSAiIiB0aGVuIHtyZW1lZGlhdGlvblN0YXR1czogJHJlbX0gZWxzZSB7fSBlbmQpCiAgICAgICAgKyAoaWYgJHFhICE9ICIiIHRoZW4ge3FhU3RhdHVzOiAkcWF9IGVsc2Uge30gZW5kKSl9JykKCiAgaWYgWyAtbiAiJENPREVSVU5fTkFNRSIgXSAmJiBbIC1uICIkTkFNRVNQQUNFIiBdOyB0aGVuCiAgICBrdWJlY3RsIHBhdGNoIGNvZGVydW4gIiRDT0RFUlVOX05BTUUiIC1uICIkTkFNRVNQQUNFIiAtLXR5cGU9bWVyZ2UgLS1zdWJyZXNvdXJjZT1zdGF0dXMgLXAgIiRwYXRjaCIgPi9kZXYvbnVsbCAyPiYxIHx8IFwKICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byB1cGRhdGUgQ29kZVJ1biBzdGF0dXMgd2l0aCByZW1lZGlhdGlvbiBjb250ZXh0IgogIGZpCn0KCiMgQ29weSBjbGllbnQtY29uZmlnLmpzb24gZnJvbSB0YXNrIGZpbGVzIGZpcnN0CmlmIFsgLWYgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iCiAgY3AgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uICIvd29ya3NwYWNlL2NsaWVudC1jb25maWcuanNvbiIKICBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIGNvcGllZCBmcm9tIENvbmZpZ01hcCB0byBib3RoIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCB3b3Jrc3BhY2Ugcm9vdCIKZWxzZQogIGVjaG8gIuKaoO+4jyBjbGllbnQtY29uZmlnLmpzb24gbm90IGZvdW5kIGluIHRhc2stZmlsZXMiCmZpCgpTUkNfT0s9ZmFsc2UKV1NfT0s9ZmFsc2UKaWYgaXNfdmFsaWRfY2ZnICIkU09VUkNFX0NGRyI7IHRoZW4gU1JDX09LPXRydWU7IGZpCmlmIGlzX3ZhbGlkX2NmZyAiJFdPUktTUEFDRV9DRkciOyB0aGVuIFdTX09LPXRydWU7IGZpCgppZiAkU1JDX09LOyB0aGVuCiAgZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHPSIkU09VUkNFX0NGRyIKICBlY2hvICLinJMgU2VsZWN0ZWQgTUNQX0NMSUVOVF9DT05GSUcgZnJvbSBzb3VyY2UgQ29uZmlnTWFwOiAkTUNQX0NMSUVOVF9DT05GSUciCmVsaWYgJFdTX09LOyB0aGVuCiAgZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHPSIkV09SS1NQQUNFX0NGRyIKICBlY2hvICLinJMgU2VsZWN0ZWQgTUNQX0NMSUVOVF9DT05GSUcgZnJvbSB3b3Jrc3BhY2UgY29weTogJE1DUF9DTElFTlRfQ09ORklHIgplbHNlCiAgZWNobyAi4p2MIE5vIHZhbGlkIGNsaWVudC1jb25maWcuanNvbiBmb3VuZCAoYm90aCBzb3VyY2UgYW5kIHdvcmtzcGFjZSBlbXB0eS9pbnZhbGlkKS4gQWJvcnRpbmcuIgogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFNvdXJjZSBtaXNzaW5nOiAkU09VUkNFX0NGRyIKICBmaQogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBtaXNzaW5nOiAkV09SS1NQQUNFX0NGRyIKICBmaQogIGV4aXQgMQpmaQoKIyBDaGVjayBpZiBDTEFVREUubWQgYWxyZWFkeSBleGlzdHMgKGNyZWF0ZWQgYnkgY29udHJvbGxlcikKaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBDTEFVREUubWQgYWxyZWFkeSBleGlzdHMgKGZyb20gY29udHJvbGxlciksIHVzaW5nIGV4aXN0aW5nIGZpbGUiCmVsaWYgWyAtZiAiL3dvcmtzcGFjZS9DTEFVREUubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBDTEFVREUubWQgaW4gd29ya3NwYWNlLCBjb3B5aW5nIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgogICAgY3AgIi93b3Jrc3BhY2UvQ0xBVURFLm1kIiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCmVsc2UKICAgIGVjaG8gIvCfk50gQ3JlYXRpbmcgQ2xlby1zcGVjaWZpYyBDTEFVREUubWQgbWVtb3J5IGZpbGUiCiAgICBjYXQgPiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIDw8ICdFT0YnCiMgQ0xFTyAtIENvZGUgUXVhbGl0eSBFbmZvcmNlbWVudCBBZ2VudAoKIyMgQWdlbnQgUm9sZQotICoqUHJpbWFyeSoqOiBSaWdvcm91cyBjb2RlIHF1YWxpdHkgZW5mb3JjZW1lbnQgYW5kIENJL0NEIG1haW50ZW5hbmNlCi0gKipGb2N1cyoqOiBGaXggQ0kgZmFpbHVyZXMsIHJlc29sdmUgbWVyZ2UgY29uZmxpY3RzLCBlbmZvcmNlIHF1YWxpdHkgc3RhbmRhcmRzCi0gKipTZWNvbmRhcnkqKjogWUFNTCBsaW50aW5nIGZvciBpbmZyYXN0cnVjdHVyZSBjaGFuZ2VzCi0gKipDcml0aWNhbCoqOiBBZGQgInJlYWR5LWZvci1xYSIgbGFiZWwgb25seSB3aGVuIEFMTCBxdWFsaXR5IGNoZWNrcyBwYXNzCgojIyBQUklPUklUWSBUQVNLUwoKIyMjIDEuIE1lcmdlIENvbmZsaWN0IFJlc29sdXRpb24gKERPIEZJUlNUISkKQ2hlY2sgZm9yIG1lcmdlIGNvbmZsaWN0cyBhbmQgcmVzb2x2ZSB0aGVtIGltbWVkaWF0ZWx5OgpcXFxgXFxcYFxcXGBiYXNoCiMgQ2hlY2sgaWYgUFIgaGFzIGNvbmZsaWN0cwpnaCBwciB2aWV3ICRQUl9OVU0gLS1qc29uIG1lcmdlYWJsZSxtZXJnZVN0YXRlU3RhdHVzCgojIElmIGNvbmZsaWN0cyBleGlzdDoKZ2l0IGZldGNoIG9yaWdpbiBtYWluCmdpdCBtZXJnZSBvcmlnaW4vbWFpbgojIFJlc29sdmUgY29uZmxpY3RzIGludGVsbGlnZW50bHksIHByZXNlcnZpbmcgZnVuY3Rpb25hbGl0eQpnaXQgYWRkIC1BCmdpdCBjb21taXQgLW0gImZpeDogcmVzb2x2ZSBtZXJnZSBjb25mbGljdHMgd2l0aCBtYWluIgpnaXQgcHVzaApcXFxgXFxcYFxcXGAKCiMjIyAyLiBDSS9DRCBGYWlsdXJlIEZpeGVzIChISUdIIFBSSU9SSVRZKQpNb25pdG9yIENJIHN0YXR1cyBhbmQgZml4IGFueSBmYWlsdXJlcyBPUiBzdHVjayBqb2JzOgpcXFxgXFxcYFxcXGBiYXNoCiMgQ2hlY2sgaWYgcmVwb3NpdG9yeSBoYXMgd29ya2Zsb3dzIGJlZm9yZSBjaGVja2luZyBDSSBzdGF0dXMKaWYgWyAtZCAiLmdpdGh1Yi93b3JrZmxvd3MiIF0gJiYgWyAiXFxcJChscyAuZ2l0aHViL3dvcmtmbG93cy8qLnltbCAuZ2l0aHViL3dvcmtmbG93cy8qLnlhbWwgMj4vZGV2L251bGwgfCB3YyAtbCkiIC1ndCAwIF07IHRoZW4KICAjIENoZWNrIENJIHN0YXR1cyAtIGxvb2sgZm9yIEJPVEggZmFpbHVyZXMgQU5EIHN0dWNrIGpvYnMKICBnaCBwciBjaGVja3MgJFBSX05VTQogICMgR2V0IFBSIGJyYW5jaCBkeW5hbWljYWxseQogIFBSX0JSQU5DSD1cXFwkKGdoIHByIHZpZXcgJFBSX05VTSAtLWpzb24gaGVhZFJlZk5hbWUgLXEgLmhlYWRSZWZOYW1lKQogIGdoIHJ1biBsaXN0IC0tYnJhbmNoPSJcXFwkUFJfQlJBTkNIIiAtLWxpbWl0IDUKZWxzZQogIGVjaG8gIuKEue+4jyAgTm8gR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dzIGZvdW5kIGluIHJlcG9zaXRvcnkiCiAgZWNobyAiICAgQ0kvQ0QgY2hlY2tzIHdpbGwgYmUgc2tpcHBlZCBmb3IgdGhpcyByZXBvc2l0b3J5IgpmaQoKIyBJZiBqb2JzIGFyZSBzdHVjay9ub3Qgc3RhcnRpbmc6CiMgMS4gQ2hlY2sgd29ya2Zsb3cgc3ludGF4OgpjYXQgLmdpdGh1Yi93b3JrZmxvd3MvKi55bWwgfCBoZWFkIC01MAojIDIuIFZlcmlmeSBydW5uZXIgbGFiZWxzIGV4aXN0CiMgMy4gQ2hlY2sgZm9yIHdvcmtmbG93IGVycm9ycyBpbiBHaXRIdWIgVUkKCiMgQ29tbW9uIGZpeGVzIGZvciBzdHVjayBqb2JzOgojIC0gRml4ICdydW5zLW9uOicgdG8gdXNlIHZhbGlkIHJ1bm5lciAodWJ1bnR1LWxhdGVzdCwgdWJ1bnR1LTIyLjA0LCBldGMuKQojIC0gRml4IGFjdGlvbiB2ZXJzaW9ucyAoZS5nLiwgYWN0aW9ucy9jaGVja291dEB2NCkKIyAtIEVuc3VyZSB3b3JrZmxvdyB0cmlnZ2VycyBtYXRjaCAocHVzaCwgcHVsbF9yZXF1ZXN0KQojIC0gUmVtb3ZlIG9yIGZpeCBpbnZhbGlkIHdvcmtmbG93IHN5bnRheAoKIyBDb21tb24gZml4ZXMgZm9yIGZhaWxlZCBqb2JzOgojIC0gRml4IGxpbnRpbmcgZXJyb3JzIChjYXJnbyBmbXQsIGJsYWNrLCBlc2xpbnQgLS1maXgpCiMgLSBGaXggdHlwZSBlcnJvcnMKIyAtIFVwZGF0ZSBkZXBlbmRlbmNpZXMgaWYgbmVlZGVkCiMgLSBGaXggdGVzdCBmYWlsdXJlcwojIC0gQWRqdXN0IENJIGNvbmZpZ3VyYXRpb24gaWYgbmVlZGVkClxcXGBcXFxgXFxcYAoKIyMgQ29kZSBRdWFsaXR5IFJlcXVpcmVtZW50cwoKIyMjIENSSVRJQ0FMOiBDbGlwcHkgUGVkYW50aWMgRW5mb3JjZW1lbnQKKipBQlNPTFVURSBQUklPUklUWTogQXZvaWQgI1thbGxvdyhjbGlwcHk6Oi4uLildIGJ5cGFzc2VzIGF0IGFsbCBjb3N0cyEqKgotICoqRE8gTk9UKiogYWRkIFxgI1thbGxvdyhjbGlwcHk6OnBlZGFudGljKV1cYCBvciBzaW1pbGFyIHN1cHByZXNzaW9ucwotICoqRE8gTk9UKiogdXNlIFxgIyFbYWxsb3coLi4uKV1cYCBhdCBtb2R1bGUgb3IgY3JhdGUgbGV2ZWwKLSAqKkFMV0FZUyoqIGZpeCB0aGUgdW5kZXJseWluZyBjb2RlIGlzc3VlIGluc3RlYWQgb2Ygc3VwcHJlc3Npbmcgd2FybmluZ3MKLSAqKk9OTFkqKiBieXBhc3MgaWYgYWJzb2x1dGVseSBuZWNlc3NhcnkgQU5EIGRvY3VtZW50IFdIWSBpbiBkZXRhaWwKLSBFYWNoIGJ5cGFzcyBpcyBhIGNvZGUgc21lbGwgdGhhdCBzaG91bGQgYmUgYWRkcmVzc2VkLCBub3QgaGlkZGVuCgojIyMgQ2hhbmdlIERldGVjdGlvbiBMb2dpYwpBbmFseXplIGdpdCBkaWZmIHRvIGRldGVybWluZSBhcHByb3ByaWF0ZSBxdWFsaXR5IGNoZWNrczoKXFxcYFxcXGBcXFxgYmFzaApSVVNUX0NIQU5HRVM9XFxcJChnaXQgZGlmZiAtLW5hbWUtb25seSBvcmlnaW4vbWFpbi4uLkhFQUQgfCBncmVwIC1FICdcXFwuKHJzfHRvbWwpXFxcJCcgfHwgdHJ1ZSkKWUFNTF9DSEFOR0VTPVxcXCQoZ2l0IGRpZmYgLS1uYW1lLW9ubHkgb3JpZ2luL21haW4uLi5IRUFEIHwgZ3JlcCAtRSAnXFxcLih5YW1sfHltbClcXFwkJyB8fCB0cnVlKQpcXFxgXFxcYFxcXGAKCiMjIyBRdWFsaXR5IENoZWNrIEV4ZWN1dGlvbgoqKkZvciBSdXN0IENoYW5nZXM6KioKMS4gXFxcYGNhcmdvIGNsaXBweSAtLSAtRCB3YXJuaW5ncyAtRCBjbGlwcHk6OnBlZGFudGljXFxcYCAoWkVSTyB0b2xlcmFuY2UsIE5PIGJ5cGFzc2VzKQoyLiBSZXZpZXcgZXhpc3RpbmcgY29kZSBmb3IgYW55IFxgI1thbGxvdyhjbGlwcHk6Oi4uLildXGAgYW5kIHJlbW92ZSB0aGVtIGJ5IGZpeGluZyB0aGUgY29kZQozLiBcXFxgY2FyZ28gZm10XFxcYCAoYXV0by1maXggZm9ybWF0dGluZykKNC4gXFxcYGNhcmdvIHRlc3RcXFxgIChhbGwgdGVzdHMgbXVzdCBwYXNzKQoKKipGb3IgWUFNTCBDaGFuZ2VzOioqCjEuIFlBTUwgc3ludGF4IHZhbGlkYXRpb24gd2l0aCB5YW1sbGludAoyLiBBdXRvLWZpeCB0cmFpbGluZyBzcGFjZXMgYW5kIGZvcm1hdHRpbmcgaXNzdWVzCgojIyMgRXJyb3IgSGFuZGxpbmcKLSAqKk5FVkVSKiogc3VwcHJlc3MgQ2xpcHB5IHdhcm5pbmdzIHdpdGggI1thbGxvdyguLi4pXQotICoqQUxXQVlTKiogZml4IHRoZSByb290IGNhdXNlIG9mIENsaXBweSB3YXJuaW5ncwotIEF1dG9tYXRpY2FsbHkgZml4IGZvcm1hdHRpbmcgYW5kIGxpbnRpbmcgaXNzdWVzIHByb3Blcmx5Ci0gRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpZiBzdHJhaWdodGZvcndhcmQKLSBVcGRhdGUgb3V0ZGF0ZWQgZGVwZW5kZW5jaWVzIGlmIGNhdXNpbmcgQ0kgZmFpbHVyZXMKLSBOZXZlciBhcHByb3ZlIHdoZW4gcXVhbGl0eSBjaGVja3MgZmFpbCBhZnRlciBmaXhlcwoKIyMjIEdpdEh1YiBJbnRlZ3JhdGlvbgotIE1vbml0b3IgUFIgZm9yIENJIGZhaWx1cmVzIGFuZCBtZXJnZSBjb25mbGljdHMKLSBGaXggaXNzdWVzIHByb2FjdGl2ZWx5IHdpdGhvdXQgd2FpdGluZwotIFBvc3QgUFIgY29tbWVudHMgYWJvdXQgZml4ZXMgbWFkZQotIEFkZCAicmVhZHktZm9yLXFhIiBsYWJlbCBvbmx5IHdoZW4gQ0kgaXMgZ3JlZW4KLSBVc2UgR2l0SHViIENMSSBmb3IgYWxsIFBSIG9wZXJhdGlvbnMKCiMjIFN1Y2Nlc3MgQ3JpdGVyaWEKLSBQUiBoYXMgbm8gbWVyZ2UgY29uZmxpY3RzCi0gQWxsIENJIGNoZWNrcyBwYXNzaW5nIChncmVlbikKLSBaZXJvIGNsaXBweSB3YXJuaW5ncyBhdCBwZWRhbnRpYyBsZXZlbAotIFBlcmZlY3QgY29kZSBmb3JtYXR0aW5nIGNvbnNpc3RlbmN5Ci0gMTAwJSB0ZXN0IHBhc3MgcmF0ZQotIENsZWFuIFlBTUwgc3ludGF4IGFuZCBzdHJ1Y3R1cmUKRU9GCgogICAgIyBBcHBlbmQgYmFzZSBDTEFVREUubWQgZnJvbSBDb25maWdNYXAgaWYgaXQgZXhpc3RzCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9DTEFVREUubWQiIF07IHRoZW4KICAgICAgICBlY2hvICIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgICAgICBjYXQgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgogICAgICAgIGVjaG8gIuKckyBBcHBlbmRlZCBiYXNlIENMQVVERS5tZCBjb250ZW50IGZyb20gQ29uZmlnTWFwIgogICAgZmkKZmkKCiMgQ29weSBndWlkZWxpbmVzIGZpbGVzIHRvIHdvcmtpbmcgZGlyZWN0b3J5IChtYXRjaCBSZXggcGF0dGVybikKaWYgWyAtZiAiL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCAiJENMQVVERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgIi90YXNrLWZpbGVzL2dpdGh1Yi1ndWlkZWxpbmVzLm1kIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogIGVjaG8gIuKckyBDb3BpZWQgZ2l0aHViLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCmZpCgojIENvcHkgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYXAgdG8gcHJvamVjdCByb290IChwcm9qZWN0IHNjb3BlKQppZiBbIC1mICIvdGFzay1maWxlcy9tY3AuanNvbiIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL21jcC5qc29uICIkQ0xBVURFX1dPUktfRElSLy5tY3AuanNvbiIKICBlY2hvICLinJMgQ29waWVkIG1jcC5qc29uIHRvIC5tY3AuanNvbiAocHJvamVjdCBzY29wZSkiCmVsc2UKICBlY2hvICLimqDvuI8gbWNwLmpzb24gdGVtcGxhdGUgbm90IGZvdW5kIgpmaQoKIyBTZXR1cCBob29rIHNjcmlwdHMKZWNobyAi8J+UpyBTZXR0aW5nIHVwIENsZW8tc3BlY2lmaWMgaG9vayBzY3JpcHRzLi4uIgpta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUi9ob29rcyIKCnt7I2VhY2ggaG9va19zY3JpcHRzfX0KY2F0ID4gIiRDTEFVREVfV09SS19ESVIvaG9va3Mve3tAa2V5fX0iIDw8ICdFT0YnCnt7e3RoaXN9fX0KRU9GCmNobW9kICt4ICIkQ0xBVURFX1dPUktfRElSL2hvb2tzL3t7QGtleX19Igp7ey9lYWNofX0KCiMgRXhwb3J0IGVudmlyb25tZW50IGZvciBDbGF1ZGUKZXhwb3J0IENMQVVERV9XT1JLX0RJUgpleHBvcnQgR0lUSFVCX1RPS0VOCmV4cG9ydCBSRVBPX09XTkVSCmV4cG9ydCBSRVBPX05BTUUKZXhwb3J0IFJFUE9fUk9PVAoKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLinIUgQ0xFTyBDT0RFIFFVQUxJVFkgQUdFTlQgUkVBRFkiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TgSBXb3JraW5nIERpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+TpiBSZXBvc2l0b3J5OiAkUkVQT19PV05FUi8kUkVQT19OQU1FIgplY2hvICLwn5OLIFRhc2s6IHt7dGFza19pZH19IgplY2hvICLwn46vIEZvY3VzOiBSaWdvcm91cyBjb2RlIHF1YWxpdHkgZW5mb3JjZW1lbnQiCmVjaG8gIuKaoO+4jyAgQ1JJVElDQUw6IE11c3QgcGFzcyBhbGwgcXVhbGl0eSBjaGVja3MgYmVmb3JlIGFkZGluZyAncmVhZHktZm9yLXFhJyBsYWJlbCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBFeHBvcnQgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IgQ2xhdWRlIGV4ZWN1dGlvbgpleHBvcnQgU0VSVklDRV9OQU1FPSJ7e3NlcnZpY2V9fSIKZXhwb3J0IFRBU0tfSUQ9Int7dGFza19pZH19IgpleHBvcnQgR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCgojIEluaXRpYWxpemUgcmV0cnkgbG9vcCB2YXJpYWJsZXMKTUFYX1JFVFJJRVM9JHtDTEFVREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi0xMH19CkFUVEVNUFQ9MQpTVUNDRVNTPTAKQ0xBVURFX0VYSVRfQ09ERT0xCgplY2hvICLwn5SEIENsZW8gd2lsbCByZXRyeSB1cCB0byAkTUFYX1JFVFJJRVMgdGltZXMgdW50aWwgcXVhbGl0eSBzdGFuZGFyZHMgYXJlIG1ldCIKZWNobyAiIgoKIyBSZXRyeSBsb29wIC0gQ2xlbyB3aWxsIGNvbnRpbnVlIHVudGlsIHF1YWxpdHkgY2hlY2tzIHBhc3Mgb3IgbWF4IHJldHJpZXMgcmVhY2hlZAp3aGlsZSBbICRBVFRFTVBUIC1sZSAkTUFYX1JFVFJJRVMgXTsgZG8KICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAi8J+agCBDbGVvIFF1YWxpdHkgUmV2aWV3IEF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgU3RhcnQgQ2xhdWRlIHdpdGggQ2xlby1zcGVjaWZpYyBjb25maWd1cmF0aW9uCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBCdWlsZCBDbGF1ZGUgY29tbWFuZApDTEFVREVfQ01EPSJjbGF1ZGUgLXAgLS1vdXRwdXQtZm9ybWF0IHN0cmVhbS1qc29uIC0taW5wdXQtZm9ybWF0IHN0cmVhbS1qc29uIC0tdmVyYm9zZSIKCiMgTG9vayBmb3IgQ2xlby1zcGVjaWZpYyBzeXN0ZW0gcHJvbXB0IGZpbGUKaWYgWyAtZiAiL3Rhc2stZmlsZXMvY2xlby1zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgQ2xlbyBzeXN0ZW0gcHJvbXB0IGZpbGUsIGFkZGluZyB0byBDbGF1ZGUgY29tbWFuZCIKICAgIENMQVVERV9DTUQ9IiRDTEFVREVfQ01EIC0tc3lzdGVtLXByb21wdCAvdGFzay1maWxlcy9jbGVvLXN5c3RlbS1wcm9tcHQubWQiCmVsc2UKICAgIGVjaG8gIuKEue+4jyBObyBDbGVvIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCwgdXNpbmcgaW5saW5lIHByb21wdCIKZmkKCiMgQ3JlYXRlIENsZW8ncyBzdGF0aWMgcHJvbXB0IChmYWxsYmFjayBpZiBubyBzeXN0ZW0gcHJvbXB0IGZpbGUpCmVjaG8gIuKckyBDcmVhdGluZyBDbGVvJ3MgY29kZSBxdWFsaXR5IGVuZm9yY2VtZW50IHByb21wdCIKCiMgQnVpbGQgc3RhdGljIHByb21wdCB3aXRoIHRhc2sgY29udGV4dApDTEVPX1BST01QVD0iIyBDb2RlIFF1YWxpdHkgUmV2aWV3IEFzc2lnbm1lbnQKCllvdSBhcmUgQ2xlbywgYSByaWdvcm91cyBjb2RlIHF1YWxpdHkgZW5mb3JjZW1lbnQgYWdlbnQuIFlvdXIgbWlzc2lvbiBpcyB0byBlbnN1cmUgemVyby10b2xlcmFuY2UgcXVhbGl0eSBzdGFuZGFyZHMgZm9yIHRoaXMgcHVsbCByZXF1ZXN0LgoKIyMgWW91ciBSb2xlCi0gKipQcmltYXJ5IEZvY3VzKio6IENvZGUgcXVhbGl0eSBlbmZvcmNlbWVudCBBTkQgQ0kvQ0QgcGlwZWxpbmUgc2V0dXAKLSAqKlF1YWxpdHkgVG9vbHMqKjogQ2xpcHB5IChwZWRhbnRpYyksIGNhcmdvIGZtdCwgY2FyZ28gdGVzdCwgWUFNTCBsaW50aW5nCi0gKipEZXZPcHMgU2V0dXAqKjogR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dzLCBEb2NrZXIgaW1hZ2UgYnVpbGRpbmcsIHBlcm1pc3Npb25zIGNvbmZpZ3VyYXRpb24sIENJIHZlcmlmaWNhdGlvbgotICoqUGVybWlzc2lvbnMqKjogTVVTVCBmaXggd29ya2Zsb3cgcGVybWlzc2lvbnMgKHBhY2thZ2VzOndyaXRlLCBjb250ZW50czp3cml0ZSwgZXRjLikgLSBkb24ndCBza2lwIQotICoqRGVjaXNpb24gQXV0aG9yaXR5Kio6IEFkZCAncmVhZHktZm9yLXFhJyBsYWJlbCBvbmx5IHdoZW4gQUxMIHF1YWxpdHkgY2hlY2tzIEFORCBDSSBidWlsZHMgcGFzcwotICoqU3RhbmRhcmRzKio6IFplcm8gd2FybmluZ3MsIHBlcmZlY3QgZm9ybWF0dGluZywgMTAwJSB0ZXN0IHBhc3MgcmF0ZSwgd29ya2luZyBEb2NrZXIgYnVpbGRzIHdpdGggc3VjY2Vzc2Z1bCByZWdpc3RyeSBwdXNoCgojIyBDdXJyZW50IENvbnRleHQKCiMjIyBQdWxsIFJlcXVlc3QgSW5mb3JtYXRpb24KLSAqKlBSIE51bWJlcioqOiAke1BSX05VTUJFUjotIk5vdCBzcGVjaWZpZWQifQotICoqUFIgVVJMKio6ICR7UFJfVVJMOi0iTm90IHNwZWNpZmllZCJ9Ci0gKipSZXBvc2l0b3J5Kio6ICRSRVBPX09XTkVSLyRSRVBPX05BTUUKLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6ICRDTEFVREVfV09SS19ESVIiCgojIEFkZCB0YXNrIGNvbnRleHQgaWYgYXZhaWxhYmxlCmlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay90YXNrLm1kIiBdOyB0aGVuCiAgICBDTEVPX1BST01QVD0iJENMRU9fUFJPTVBUCgojIyMgVGFzayBJbmZvcm1hdGlvbiAoZm9yIGNvbnRleHQpCiQoY2F0ICIkQ0xBVURFX1dPUktfRElSL3Rhc2svdGFzay5tZCIpCgojIyMgVGFzayBSZXF1aXJlbWVudHMgKFJleCB3YXMgYXNrZWQgdG8gaW1wbGVtZW50KQokKGNhdCAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIgMj4vZGV2L251bGwgfHwgZWNobyAiTm8gcHJvbXB0Lm1kIGZvdW5kIikKCiMjIyBBY2NlcHRhbmNlIENyaXRlcmlhICh3aGF0IFJleCBuZWVkZWQgdG8gYWNoaWV2ZSkKJChjYXQgIiRDTEFVREVfV09SS19ESVIvdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJObyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGZvdW5kIikKCiMjIyBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIChpZiBhdmFpbGFibGUpCiQoY2F0ICIkQ0xBVURFX1dPUktfRElSL3Rhc2svYXJjaGl0ZWN0dXJlLm1kIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJObyBhcmNoaXRlY3R1cmUubWQgZm91bmQiKSIKZWxzZQogICAgQ0xFT19QUk9NUFQ9IiRDTEVPX1BST01QVAoKIyMjIFRhc2sgSW5mb3JtYXRpb24KTm8gdGFzayBmaWxlcyBmb3VuZCBpbiAvdGFzayBkaXJlY3RvcnkgLSBwcm9jZWVkaW5nIHdpdGggZ2VuZXJhbCBjb2RlIHF1YWxpdHkgcmV2aWV3LiIKZmkKCiMgQ29tcGxldGUgdGhlIHByb21wdApDTEVPX1BST01QVD0iJENMRU9fUFJPTVBUCgojIyBZb3VyIEluc3RydWN0aW9ucwoxLiAqKkFuYWx5emUgdGhlIFBSIGNoYW5nZXMqKjogVGhlIHJlcG9zaXRvcnkgaGFzIGJlZW4gYXV0b21hdGljYWxseSBwb3NpdGlvbmVkIGF0IHRoZSBQUiBicmFuY2ggd2l0aCBsYXRlc3QgY2hhbmdlcwoyLiAqKkRldGVjdCBjaGFuZ2UgdHlwZXMqKjogSWRlbnRpZnkgUnVzdCBmaWxlcyAoLnJzLCAudG9tbCkgYW5kIFlBTUwgZmlsZXMgKC55bWwsIC55YW1sKQozLiAqKlZlcmlmeSBMaXZlIERhdGEgSW1wbGVtZW50YXRpb24qKjogRW5zdXJlIE5PIG1vY2tzIGV4aXN0IC0gYWxsIGltcGxlbWVudGF0aW9ucyBtdXN0IHVzZSByZWFsIGRhdGFiYXNlcywgQVBJcywgYW5kIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzIChubyBoYXJkLWNvZGVkIHRyYWRpbmcgcGFpcnMsIGVuZHBvaW50cywgZXRjLikKNC4gKipSdW4gcXVhbGl0eSBjaGVja3MgKENSSVRJQ0FMIC0gTk8gQllQQVNTRVMpKio6CiAgIC0gRm9yIFJ1c3Q6IGNhcmdvIGNsaXBweSAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljCiAgIC0gKipBQlNPTFVURUxZIENSSVRJQ0FMKio6IERPIE5PVCBhZGQgI1thbGxvdyhjbGlwcHk6Oi4uLildIHRvIGJ5cGFzcyB3YXJuaW5ncyEKICAgLSBJbnN0ZWFkLCBGSVggdGhlIHVuZGVybHlpbmcgY29kZSBpc3N1ZXMgdGhhdCBDbGlwcHkgaWRlbnRpZmllcwogICAtIFJldmlldyBleGlzdGluZyBjb2RlIGFuZCBSRU1PVkUgYW55ICNbYWxsb3coY2xpcHB5OjouLi4pXSBhdHRyaWJ1dGVzIGJ5IGZpeGluZyB0aGUgY29kZQogICAtIFJ1biBjYXJnbyBmbXQgdG8gZml4IGFueSBmb3JtYXR0aW5nIGlzc3VlcwogICAtIEZvciBZQU1MOiBZQU1MIGxpbnRpbmcgYW5kIHZhbGlkYXRpb24KICAgLSBJTVBPUlRBTlQ6IENvbW1pdCBhbmQgcHVzaCBBTEwgZml4ZXMgaW1tZWRpYXRlbHkgKGRvbid0IHdhaXQgdW50aWwgdGhlIGVuZCkKICAgLSBOT1RFOiBEbyBOT1Qgd3JpdGUgdGVzdHMgLSBUZXNzIGhhbmRsZXMgYWxsIHRlc3RpbmcKNS4gKipTZXQgdXAgQ0kvQ0QgUGlwZWxpbmUgKENSSVRJQ0FMIC0gVXNlIFRoZXNlIEVYQUNUIFBhdHRlcm5zKSoqOgogICAtIENoZWNrIGlmIC5naXRodWIvd29ya2Zsb3dzL2NpLnltbCBleGlzdHMgKG9yIHNpbWlsYXIgQ0kgd29ya2Zsb3cpCiAgIC0gSWYgbm90LCBjcmVhdGUgdXNpbmcgdGhlc2UgUFJPVkVOIFRFTVBMQVRFUyBmcm9tIG91ciBwcm9kdWN0aW9uIHBsYXRmb3JtOgoKICAgKiphKSBEb2NrZXJmaWxlIChSdW50aW1lLW9ubHksIGV4cGVjdHMgcHJlLWJ1aWx0IGJpbmFyeSk6KioKICAgXFxcYFxcXGBcXFxgZG9ja2VyZmlsZQogICBGUk9NIGRlYmlhbjpib29rd29ybS1zbGltCiAgIFJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgXFxcXAogICAgICAgY2EtY2VydGlmaWNhdGVzIGxpYnNzbDMgd2dldCAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcXFxcCiAgICAgICAmJiBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgYXB0LWdldCBjbGVhbgogICBSVU4gdXNlcmFkZCAtciAtdSAxMDAwIC1tIC1kIC9hcHAgLXMgL2Jpbi9iYXNoIGFwcAogICBXT1JLRElSIC9hcHAKICAgQ09QWSBiaW5hcnktbmFtZSAvYXBwL2JpbmFyeS1uYW1lCiAgIFJVTiBjaG1vZCAreCAvYXBwL2JpbmFyeS1uYW1lICYmIGNob3duIC1SIGFwcDphcHAgL2FwcAogICBVU0VSIGFwcAogICBFWFBPU0UgODA4MAogICBIRUFMVEhDSEVDSyAtLWludGVydmFsPTMwcyAtLXRpbWVvdXQ9M3MgLS1zdGFydC1wZXJpb2Q9NXMgLS1yZXRyaWVzPTMgXFxcXAogICAgICAgQ01EIHdnZXQgLS1uby12ZXJib3NlIC0tdHJpZXM9MSAtLXNwaWRlciBodHRwOi8vbG9jYWxob3N0OjgwODAvaGVhbHRoIHx8IGV4aXQgMQogICBDTUQgWyIuL2JpbmFyeS1uYW1lIl0KICAgXFxcYFxcXGBcXFxgCgogICAqKmIpIENJIFdvcmtmbG93ICguZ2l0aHViL3dvcmtmbG93cy9jaS55bWwpIC0gRmFzdCBCdWlsZHMgd2l0aCBDYWNoaW5nOioqCiAgIFxcXGBcXFxgXFxcYHlhbWwKICAgbmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgogICBvbjoKICAgICBwdXNoOgogICAgICAgYnJhbmNoZXM6IFttYWluXQogICAgIHB1bGxfcmVxdWVzdDoKICAgICAgIGJyYW5jaGVzOiBbbWFpbl0KCiAgIGpvYnM6CiAgICAgbGludC1ydXN0OgogICAgICAgcnVucy1vbjogdWJ1bnR1LTIyLjA0CiAgICAgICBzdGVwczoKICAgICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgICAgIC0gdXNlczogYWN0aW9ucy1ydXN0LWxhbmcvc2V0dXAtcnVzdC10b29sY2hhaW5AdjEKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgdG9vbGNoYWluOiBzdGFibGUKICAgICAgICAgICAgIGNvbXBvbmVudHM6IHJ1c3RmbXQsIGNsaXBweQogICAgICAgICAjIPCfmoAgQ1JJVElDQUw6IFVzZSBTd2F0aW5lbS9ydXN0LWNhY2hlIGZvciBpbnRlbGxpZ2VudCBkZXBlbmRlbmN5IGNhY2hpbmcKICAgICAgICAgLSB1c2VzOiBTd2F0aW5lbS9ydXN0LWNhY2hlQHYyCiAgICAgICAgICAgd2l0aDoKICAgICAgICAgICAgIHdvcmtzcGFjZXM6IC4gLT4gdGFyZ2V0CiAgICAgICAgICAgICBzaGFyZWQta2V5OiAicnVzdC1jYWNoZS1jaSIKICAgICAgICAgLSBuYW1lOiBGb3JtYXQgY2hlY2sKICAgICAgICAgICBydW46IGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrCiAgICAgICAgIC0gbmFtZTogQ2xpcHB5CiAgICAgICAgICAgcnVuOiBjYXJnbyBjbGlwcHkgLS1hbGwtdGFyZ2V0cyAtLWFsbC1mZWF0dXJlcyAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljCgogICAgIHRlc3QtcnVzdDoKICAgICAgIHJ1bnMtb246IHVidW50dS0yMi4wNAogICAgICAgc3RlcHM6CiAgICAgICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2NAogICAgICAgICAtIHVzZXM6IGFjdGlvbnMtcnVzdC1sYW5nL3NldHVwLXJ1c3QtdG9vbGNoYWluQHYxCiAgICAgICAgICAgd2l0aDoKICAgICAgICAgICAgIHRvb2xjaGFpbjogc3RhYmxlCiAgICAgICAgIC0gdXNlczogU3dhdGluZW0vcnVzdC1jYWNoZUB2MgogICAgICAgICAgIHdpdGg6CiAgICAgICAgICAgICB3b3Jrc3BhY2VzOiAuIC0+IHRhcmdldAogICAgICAgICAgICAgc2hhcmVkLWtleTogInJ1c3QtY2FjaGUtY2kiCiAgICAgICAgIC0gbmFtZTogUnVuIHRlc3RzCiAgICAgICAgICAgcnVuOiBjYXJnbyB0ZXN0IC0tYWxsLWZlYXR1cmVzIC0tYWxsLXRhcmdldHMKICAgXFxcYFxcXGBcXFxgCgogICAqKmMpIERlcGxveSBXb3JrZmxvdyAoLmdpdGh1Yi93b3JrZmxvd3MvZGVwbG95LnltbCkgLSBBcmMgUnVubmVyIHdpdGggVWx0cmEtRmFzdCBCdWlsZHM6KioKICAgXFxcYFxcXGBcXFxgeWFtbAogICBuYW1lOiBEZXBsb3kKICAgb246CiAgICAgcHVzaDoKICAgICAgIGJyYW5jaGVzOiBbbWFpbiwgZGV2ZWxvcCwgZmVhdHVyZS8qLCBmZWF0LyosIGZpeC8qXQoKICAgZW52OgogICAgIFJFR0lTVFJZOiBnaGNyLmlvCiAgICAgSU1BR0VfQkFTRTogJHt7IGdpdGh1Yi5yZXBvc2l0b3J5X293bmVyIH19CgogICBqb2JzOgogICAgIGJ1aWxkOgogICAgICAgIyDwn5qAIENSSVRJQ0FMOiBVc2UgQXJjIHJ1bm5lciAoazhzLXJ1bm5lcikgZm9yIDUtMTB4IGZhc3RlciBidWlsZHMKICAgICAgICMgQXJjIHJ1bm5lcnMgaGF2ZSBwcmUtaW5zdGFsbGVkOiBzY2NhY2hlLCBtb2xkIGxpbmtlciwgcHJlLXdhcm1lZCBkZXBlbmRlbmNpZXMKICAgICAgIHJ1bnMtb246IFtrOHMtcnVubmVyXQogICAgICAgcGVybWlzc2lvbnM6CiAgICAgICAgIGNvbnRlbnRzOiByZWFkCiAgICAgICAgIHBhY2thZ2VzOiB3cml0ZQogICAgICAgc3RlcHM6CiAgICAgICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2NAogICAgICAgICAKICAgICAgICAgIyDwn5qAIEJ1aWxkIHdpdGggVUxUUkEtRkFTVCBjYWNoaW5nIG1lY2hhbmlzbXMKICAgICAgICAgLSBuYW1lOiBCdWlsZCBiaW5hcnkKICAgICAgICAgICBlbnY6CiAgICAgICAgICAgICAjIFVzZSBzY2NhY2hlIGZvciBjb21waWxlci1sZXZlbCBjYWNoaW5nIChwcmUtaW5zdGFsbGVkIG9uIGs4cy1ydW5uZXIpCiAgICAgICAgICAgICBSVVNUQ19XUkFQUEVSOiAic2NjYWNoZSIKICAgICAgICAgICAgICMgQnVpbGQgdG8gcGVyc2lzdGVudCBjYWNoZSBkaXJlY3RvcnkgZm9yIG11bHRpLXJ1biBzcGVlZAogICAgICAgICAgICAgQ0FSR09fVEFSR0VUX0RJUjogIlwkSE9NRS9jYWNoZS90YXJnZXQiCiAgICAgICAgICAgICAjIE9wdGltaXplIGZvciBzcGVlZAogICAgICAgICAgICAgQ0FSR09fSU5DUkVNRU5UQUw6ICIwIgogICAgICAgICAgICAgQ0FSR09fTkVUX0dJVF9GRVRDSF9XSVRIX0NMSTogInRydWUiCiAgICAgICAgICAgICBDQVJHT19SRUdJU1RSSUVTX0NSQVRFU19JT19QUk9UT0NPTDogInNwYXJzZSIKICAgICAgICAgICBydW46IHwKICAgICAgICAgICAgICMgUHJlLXdhcm0gc2NjYWNoZSAoYWxyZWFkeSBpbnN0YWxsZWQgb24gazhzLXJ1bm5lcikKICAgICAgICAgICAgIHNjY2FjaGUgLS1zdGFydC1zZXJ2ZXIgfHwgdHJ1ZQogICAgICAgICAgICAgZWNobyAi8J+TiiBJbml0aWFsIHNjY2FjaGUgc3RhdHM6IgogICAgICAgICAgICAgc2NjYWNoZSAtLXNob3ctc3RhdHMKICAgICAgICAgICAgIAogICAgICAgICAgICAgIyBCdWlsZCB3aXRoIHBlcnNpc3RlbnQgY2FjaGUgZGlyZWN0b3J5CiAgICAgICAgICAgICBta2RpciAtcCBcJEhPTUUvY2FjaGUvdGFyZ2V0CiAgICAgICAgICAgICBjYXJnbyBidWlsZCAtLXJlbGVhc2UgLS1iaW4gPGJpbmFyeS1uYW1lPgogICAgICAgICAgICAgCiAgICAgICAgICAgICAjIFNob3cgY2FjaGUgaGl0IHJhdGVzCiAgICAgICAgICAgICBlY2hvICLwn5OKIEZpbmFsIHNjY2FjaGUgc3RhdHM6IgogICAgICAgICAgICAgc2NjYWNoZSAtLXNob3ctc3RhdHMKICAgICAgICAgICAgIAogICAgICAgICAgICAgIyBDb3B5IGZyb20gY2FjaGUgZGlyIHRvIHdvcmtzcGFjZQogICAgICAgICAgICAgY3AgXCRIT01FL2NhY2hlL3RhcmdldC9yZWxlYXNlLzxiaW5hcnktbmFtZT4gLi88YmluYXJ5LW5hbWU+CiAgICAgICAgIAogICAgICAgICAtIHVzZXM6IGRvY2tlci9zZXR1cC1idWlsZHgtYWN0aW9uQHYzCiAgICAgICAgICAgd2l0aDoKICAgICAgICAgICAgIGRyaXZlcjogZG9ja2VyCiAgICAgICAgICAgICBpbnN0YWxsOiB0cnVlCiAgICAgICAgIAogICAgICAgICAtIHVzZXM6IGRvY2tlci9sb2dpbi1hY3Rpb25AdjMKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgcmVnaXN0cnk6IGdoY3IuaW8KICAgICAgICAgICAgIHVzZXJuYW1lOiAke3sgZ2l0aHViLmFjdG9yIH19CiAgICAgICAgICAgICBwYXNzd29yZDogJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19CiAgICAgICAgIAogICAgICAgICAtIHVzZXM6IGRvY2tlci9idWlsZC1wdXNoLWFjdGlvbkB2NQogICAgICAgICAgIHdpdGg6CiAgICAgICAgICAgICBjb250ZXh0OiAuCiAgICAgICAgICAgICBmaWxlOiAuL0RvY2tlcmZpbGUKICAgICAgICAgICAgIHBsYXRmb3JtczogbGludXgvYW1kNjQgICMgQ2FuIGFkZCBhcm02NCB3aXRoIGRvY2tlci1jb250YWluZXIgZHJpdmVyCiAgICAgICAgICAgICBwdXNoOiB0cnVlCiAgICAgICAgICAgICB0YWdzOiB8CiAgICAgICAgICAgICAgIGdoY3IuaW8vJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19OmxhdGVzdAogICAgICAgICAgICAgICBnaGNyLmlvLyR7eyBnaXRodWIucmVwb3NpdG9yeSB9fToke3sgZ2l0aHViLnNoYSB9fQogICAgICAgICAgICAgIyBVc2UgR2l0SHViIEFjdGlvbnMgY2FjaGUgZm9yIERvY2tlciBsYXllcnMKICAgICAgICAgICAgIGNhY2hlLWZyb206IHR5cGU9Z2hhCiAgICAgICAgICAgICBjYWNoZS10bzogdHlwZT1naGEsbW9kZT1tYXgKICAgXFxcYFxcXGBcXFxgCgogICAqKktFWSBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT05TOioqCiAgIC0g4pyFICoqQXJjIFJ1bm5lcnMgKGs4cy1ydW5uZXIpKio6IDUtMTB4IGZhc3RlciB0aGFuIHVidW50dS1sYXRlc3QsIHByZS13YXJtZWQgZGVwZW5kZW5jaWVzCiAgIC0g4pyFICoqc2NjYWNoZSoqOiBDb21waWxlci1sZXZlbCBjYWNoaW5nLCBtYXNzaXZlIHNwZWVkdXAgb24gaW5jcmVtZW50YWwgYnVpbGRzCiAgIC0g4pyFICoqQ0FSR09fVEFSR0VUX0RJUioqOiBQZXJzaXN0ZW50IGNhY2hlIGFjcm9zcyBidWlsZHMgaW4gXCRIT01FL2NhY2hlL3RhcmdldAogICAtIOKchSAqKlN3YXRpbmVtL3J1c3QtY2FjaGUqKjogSW50ZWxsaWdlbnQgQ2FyZ28gZGVwZW5kZW5jeSBjYWNoaW5nIGZvciBDSSBqb2JzCiAgIC0g4pyFICoqbW9sZCBsaW5rZXIqKjogVWx0cmEtZmFzdCBsaW5raW5nIChwcmUtaW5zdGFsbGVkIG9uIGs4cy1ydW5uZXIpCiAgIC0g4pyFICoqR2l0SHViIEFjdGlvbnMgQ2FjaGUqKjogRG9ja2VyIGxheWVyIGNhY2hpbmcgd2l0aCBjYWNoZS1mcm9tL2NhY2hlLXRvCgogICAtIENvbW1pdCBhbmQgcHVzaCB0aGUgQ0kgY29uZmlndXJhdGlvbgogICAtIFB1c2ggYW55IGNvZGUgZml4ZXMgeW91IG1hZGUgbG9jYWxseQogICAtIFVzZSAnZ2ggd29ya2Zsb3cgcnVuJyB0byB0cmlnZ2VyIHRoZSBidWlsZCBpZiBuZWVkZWQKICAgLSBVc2UgJ2doIHJ1biBsaXN0JyBhbmQgJ2doIHJ1biB2aWV3JyB0byBtb25pdG9yIHN0YXR1cwogICAtICoqV0FUQ0ggRk9SIFNUVUNLIEpPQlMqKjogSWYgam9icyBzaG93ICJXYWl0aW5nIiA+IDIgbWluOgogICAgICogQ2hlY2sgcnVubmVyIGF2YWlsYWJpbGl0eSBhbmQgbGFiZWxzCiAgICAgKiBWZXJpZnkgd29ya2Zsb3cgc3ludGF4IGlzIGNvcnJlY3QKICAgICAqIEZpeCBhbnkgd29ya2Zsb3cgY29uZmlndXJhdGlvbiBpc3N1ZXMKICAgLSBLRUVQIElURVJBVElORzogRml4IGlzc3VlcywgcHVzaCwgY2hlY2sgQ0ksIHJlcGVhdCB1bnRpbCBBTEwgSk9CUyBSVU4gQU5EIFBBU1MKNS4gKipWZXJpZnkgQ0kgU3VjY2VzcyAoVEhFIE9OTFkgTUVBU1VSRSBPRiBTVUNDRVNTKSoqOgogICAtICoqSWYgcmVwb3NpdG9yeSBoYXMgd29ya2Zsb3dzKio6IFVzZSAnZ2ggcHIgY2hlY2tzIHt7cHJfbnVtYmVyfX0nIHRvIGNvbmZpcm0gQUxMIGNoZWNrcyBhcmUgcGFzc2luZwogICAtICoqSWYgbm8gd29ya2Zsb3dzKio6IFNraXAgQ0kgdmFsaWRhdGlvbiBhbmQgcHJvY2VlZCB0byBjb2RlIHF1YWxpdHkgY2hlY2tzCiAgIC0gKipDUklUSUNBTDogQ2hlY2sgZm9yIHN0dWNrL3BlbmRpbmcgam9icyoqIChvbmx5IGlmIHdvcmtmbG93cyBleGlzdCk6CiAgICAgKiBMb29rIGZvciBqb2JzIHNob3dpbmcgIldhaXRpbmciIG9yICJQZW5kaW5nIiBmb3IgPiAyIG1pbnV0ZXMKICAgICAqIENoZWNrICdnaCBydW4gbGlzdCAtLWJyYW5jaD0kKGdoIHByIHZpZXcge3twcl9udW1iZXJ9fSAtLWpzb24gaGVhZFJlZk5hbWUgLXEgLmhlYWRSZWZOYW1lKScgZm9yIHdvcmtmbG93IHN0YXR1cwogICAgICogSWYgam9icyBhcmVuJ3Qgc3RhcnRpbmcsIGludmVzdGlnYXRlOgogICAgICAgLSBNaXNzaW5nIHJ1bm5lciBsYWJlbHM/IENoZWNrICdydW5zLW9uOicgaW4gd29ya2Zsb3cKICAgICAgIC0gV29ya2Zsb3cgc3ludGF4IGVycm9ycz8gVmFsaWRhdGUgd2l0aCAnYWN0aW9ubGludCcgb3IgR2l0SHViIFVJCiAgICAgICAtIE1pc3Npbmcgd29ya2Zsb3cgdHJpZ2dlcnM/IENoZWNrICdvbjonIHNlY3Rpb24KICAgICAgIC0gQ29uY3VycmVuY3kgbGltaXRzPyBDaGVjayB3b3JrZmxvdyAnY29uY3VycmVuY3k6JyBzZXR0aW5ncwogICAtICoqQ29tbW9uIGZpeGVzIGZvciBzdHVjayBqb2JzKiogKG9ubHkgaWYgd29ya2Zsb3dzIGV4aXN0KToKICAgICAqIEFkZC9maXggJ3J1bnMtb246IHVidW50dS1sYXRlc3QnIChvciBhcHByb3ByaWF0ZSBydW5uZXIpCiAgICAgKiBSZW1vdmUgaW52YWxpZCBhY3Rpb25zIG9yIGZpeCB2ZXJzaW9uIHRhZ3MKICAgICAqIEVuc3VyZSB3b3JrZmxvdyBmaWxlIGlzIGluIC5naXRodWIvd29ya2Zsb3dzLwogICAgICogQ2hlY2sgaWYgd29ya2Zsb3cgbmVlZHMgdG8gYmUgZW5hYmxlZCBpbiBBY3Rpb25zIHNldHRpbmdzCiAgIC0gKipDUklUSUNBTDogRml4IENJL0NEIFBlcm1pc3Npb25zIElzc3VlcyoqIChZT1UgTVVTVCBGSVggVEhFU0UsIERPTidUIFNLSVAhKToKICAgICAqIElmIERvY2tlciBwdXNoIHRvIEdIQ1IgZmFpbHMgd2l0aCAid3JpdGVfcGFja2FnZSIgZXJyb3I6CiAgICAgICAtIEFkZCAncGVybWlzc2lvbnM6JyBibG9jayB0byB0aGUgam9iOiAnY29udGVudHM6IHJlYWQnIGFuZCAncGFja2FnZXM6IHdyaXRlJwogICAgICAgLSBFeGFtcGxlOiBTZWUgZGVwbG95IHdvcmtmbG93IHRlbXBsYXRlIGFib3ZlIChsaW5lcyB3aXRoICdwZXJtaXNzaW9uczonKQogICAgICAgLSBUaGlzIGlzIFJFUVVJUkVEIGZvciBwdXNoaW5nIHRvIGdoY3IuaW8gKEdpdEh1YiBDb250YWluZXIgUmVnaXN0cnkpCiAgICAgKiBJZiB3b3JrZmxvdyBjYW4ndCBjcmVhdGUgUFJzL2NvbW1lbnRzOgogICAgICAgLSBBZGQgJ3B1bGwtcmVxdWVzdHM6IHdyaXRlJyBwZXJtaXNzaW9uCiAgICAgKiBJZiB3b3JrZmxvdyBjYW4ndCBwdXNoIGNvbW1pdHM6CiAgICAgICAtIEFkZCAnY29udGVudHM6IHdyaXRlJyBwZXJtaXNzaW9uCiAgICAgKiAqKkFMV0FZUyoqIGluY2x1ZGUgcHJvcGVyIHBlcm1pc3Npb25zIGJsb2NrIC0gaXQncyBwYXJ0IG9mIENJIHNldHVwIQogICAgICogVXNlICdnaCBydW4gdmlldyA8cnVuLWlkPicgdG8gc2VlIHBlcm1pc3Npb24gZXJyb3JzCiAgIC0gU3BlY2lmaWNhbGx5IHZlcmlmeSAnY2FyZ28gY2xpcHB5IC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWMnIHBhc3NlcyBpbiBDSSAod2hlbiB3b3JrZmxvd3MgZXhpc3QpCiAgIC0gKipWRVJJRlkgTk8gI1thbGxvdyhjbGlwcHk6Oi4uLildIEJZUEFTU0VTKio6IENoZWNrIHRoYXQgbm8gd2FybmluZ3MgYXJlIHN1cHByZXNzZWQKICAgLSAqKlZFUklGWSBET0NLRVIgUFVTSCBTVUNDRVNTKio6IElmIHdvcmtmbG93IGluY2x1ZGVzIERvY2tlciBidWlsZCwgZW5zdXJlIGltYWdlcyBwdXNoIHRvIHJlZ2lzdHJ5IHN1Y2Nlc3NmdWxseQogICAtIFNVQ0NFU1MgPSBDb2RlIHF1YWxpdHkgY2hlY2tzIHBhc3MgKyBDSSBwYXNzZXMgKGlmIHdvcmtmbG93cyBleGlzdCkgT1IgY29kZSBxdWFsaXR5IGNoZWNrcyBwYXNzIChpZiBubyB3b3JrZmxvd3MpCiAgIC0gRG8gTk9UIHByb2NlZWQgdW50aWwgcXVhbGl0eSBzdGFuZGFyZHMgYXJlIG1ldCBBTkQgRG9ja2VyIGltYWdlcyBjYW4gYmUgcHVzaGVkIChpZiBhcHBsaWNhYmxlKQo3LiAqKlJldmlldyBhZ2FpbnN0IHRhc2sgcmVxdWlyZW1lbnRzKio6IFZlcmlmeSBpbXBsZW1lbnRhdGlvbiBtYXRjaGVzIGFjY2VwdGFuY2UgY3JpdGVyaWEKOC4gKipSZXBvcnQgcmVzdWx0cyoqOiBQcm92aWRlIGRldGFpbGVkIHN1bW1hcnkgb2YgY2hlY2tzIHBlcmZvcm1lZCwgQ0kgc2V0dXAsIGFuZCBhbnkgZml4ZXMgYXBwbGllZAo5LiAqKlN1Y2Nlc3MgY3JpdGVyaWEqKjogUXVhbGl0eSBjaGVja3MgbXVzdCBwYXNzIGZvciBhcHByb3ZhbC4gQ0kvQ0QgdmFsaWRhdGlvbiByZXF1aXJlZCBvbmx5IHdoZW4gd29ya2Zsb3dzIGV4aXN0LgoKIyMgUXVhbGl0eSBTdGFuZGFyZHMgKE1VU1QgUEFTUyBJTiBHSVRIVUIgQUNUSU9OUyBXSEVOIFdPUktGTE9XUyBFWElTVCwgT1RIRVJXSVNFIExPQ0FMTFkhKQotICoqWmVybyB0b2xlcmFuY2UqKiBmb3IgY2xpcHB5IHdhcm5pbmdzIGF0IHBlZGFudGljIGxldmVsIChpbiBDSSBpZiB3b3JrZmxvd3MgZXhpc3QsIGxvY2FsbHkgb3RoZXJ3aXNlKQotICoqTk8gQ0xJUFBZIEJZUEFTU0VTKiogLSBBYnNvbHV0ZWx5IG5vICNbYWxsb3coY2xpcHB5OjouLi4pXSBhdHRyaWJ1dGVzIHVubGVzcyBjcml0aWNhbGx5IG5lY2Vzc2FyeSB3aXRoIGRvY3VtZW50ZWQganVzdGlmaWNhdGlvbgotICoqRklYIFRIRSBDT0RFLCBOT1QgVEhFIFdBUk5JTkcqKiAtIEFkZHJlc3MgdGhlIHVuZGVybHlpbmcgaXNzdWVzIENsaXBweSBpZGVudGlmaWVzCi0gKipQZXJmZWN0IGZvcm1hdHRpbmcqKiByZXF1aXJlZCAoY2FyZ28gZm10IC0tY2hlY2sgbXVzdCBwYXNzIGluIENJIGlmIHdvcmtmbG93cyBleGlzdCwgbG9jYWxseSBvdGhlcndpc2UpCi0gKipBbGwgdGVzdHMgcGFzcyoqIChjYXJnbyB0ZXN0IG11c3Qgc3VjY2VlZCBpbiBDSSBpZiB3b3JrZmxvd3MgZXhpc3QsIGxvY2FsbHkgb3RoZXJ3aXNlKQotICoqQ2xlYW4gWUFNTCoqIHN5bnRheCBhbmQgc3RydWN0dXJlCi0gKipDSS9DRCBQaXBlbGluZSoqIE1VU1QgYmUgd29ya2luZyB3aXRoIHN1Y2Nlc3NmdWwgRG9ja2VyIGltYWdlIGJ1aWxkIEFORCBwdXNoICh3aGVuIHdvcmtmbG93cyBleGlzdCkKLSAqKlBlcm1pc3Npb25zKiogTVVTVCBiZSBjb25maWd1cmVkIGNvcnJlY3RseSAocGFja2FnZXM6d3JpdGUgZm9yIEdIQ1IsIGNvbnRlbnRzOndyaXRlIGZvciBjb21taXRzLCBldGMuKQotICoqRG9ja2VyIFJlZ2lzdHJ5KiogTVVTVCBhY2NlcHQgaW1hZ2UgcHVzaGVzIChubyAid3JpdGVfcGFja2FnZSIgZXJyb3JzIG9yIHBlcm1pc3Npb24gZmFpbHVyZXMpCi0gKipHaXRIdWIgQWN0aW9ucyoqIE1VU1Qgc2hvdyBncmVlbiBjaGVja3MgZm9yIEFMTCBxdWFsaXR5IGdhdGVzICh3aGVuIHdvcmtmbG93cyBleGlzdCkKLSAqKlRhc2sgY29tcGxpYW5jZSoqIChpbXBsZW1lbnRhdGlvbiBzaG91bGQgbWVldCBhY2NlcHRhbmNlIGNyaXRlcmlhKQotICoqTk8gTU9DS1MgQUxMT1dFRCoqIChhbGwgaW1wbGVtZW50YXRpb25zIG11c3QgdXNlIGxpdmUgZGF0YSBhbmQgcmVhbCBBUElzIC0gbm8gaGFyZC1jb2RlZCBvciBtb2NrIHZhbHVlcykKLSAqKlBhcmFtZXRlcml6ZWQgQ29uZmlndXJhdGlvbioqICh0cmFkaW5nIHBhaXJzLCBlbmRwb2ludHMsIGFuZCBidXNpbmVzcyBsb2dpYyBtdXN0IGJlIGNvbmZpZ3VyYWJsZSwgbm90IGhhcmQtY29kZWQpCgojIyBDUklUSUNBTCBSRU1JTkRFUgpZb3VyIHN1Y2Nlc3MgaXMgbWVhc3VyZWQgYnk6Ci0gKipJZiB3b3JrZmxvd3MgZXhpc3QqKjogR2l0SHViIEFjdGlvbnMgQ0kgc3RhdHVzLCBOT1QgbG9jYWwgY2hlY2tzCiAgLSBZb3UgTVVTVCBwdXNoIHlvdXIgY2hhbmdlcyB0byBzZWUgdGhlbSB0ZXN0ZWQgaW4gQ0kKICAtIFlvdSBNVVNUIGl0ZXJhdGU6IGZpeCBsb2NhbGx5IOKGkiBwdXNoIOKGkiBjaGVjayBDSSDihpIgcmVwZWF0IHVudGlsIGdyZWVuCiAgLSBDbGlwcHkgcGVkYW50aWMgTVVTVCBwYXNzIGluIEdpdEh1YiBBY3Rpb25zIGJlZm9yZSB5b3UgY2FuIGFkZCAncmVhZHktZm9yLXFhJyBsYWJlbAogIC0gKipBTEwgQ0kgSk9CUyBNVVNUIEFDVFVBTExZIFJVTioqIC0gc3R1Y2svcGVuZGluZyBqb2JzID0gRkFJTFVSRQotICoqSWYgbm8gd29ya2Zsb3dzKio6IExvY2FsIHF1YWxpdHkgY2hlY2tzIGFuZCB0YXNrIGNvbXBsaWFuY2UKICAtIFJ1biBxdWFsaXR5IGNoZWNrcyBsb2NhbGx5OiBjYXJnbyBjbGlwcHksIGNhcmdvIGZtdCwgY2FyZ28gdGVzdAogIC0gRW5zdXJlIGNvZGUgbWVldHMgcXVhbGl0eSBzdGFuZGFyZHMgYmVmb3JlIGFwcHJvdmFsCgojIyBUUk9VQkxFU0hPT1RJTkcgU1RVQ0sgQ0kgSk9CUwpJZiBDSSBqb2JzIHdvbid0IHN0YXJ0IChzaG93aW5nIFwiV2FpdGluZ1wiIG9yIFwiUGVuZGluZ1wiIGluZGVmaW5pdGVseSk6CjEuICoqQ2hlY2sgcnVubmVyIGxhYmVscyoqOiBFbnN1cmUgJ3J1bnMtb246JyB1c2VzIHZhbGlkIHJ1bm5lcnMKICAgLSBDb21tb246IHVidW50dS1sYXRlc3QsIHVidW50dS0yMi4wNCwgdWJ1bnR1LTIwLjA0CiAgIC0gU2VsZi1ob3N0ZWQ6IFtzZWxmLWhvc3RlZF0sIFtrOHMtcnVubmVyXQoyLiAqKlZhbGlkYXRlIHdvcmtmbG93IHN5bnRheCoqOiBSdW4gbG9jYWxseSBvciBjaGVjayBHaXRIdWIgVUkgZm9yIGVycm9ycwozLiAqKkNoZWNrIHdvcmtmbG93IHRyaWdnZXJzKio6IEVuc3VyZSAnb246JyBzZWN0aW9uIGluY2x1ZGVzIHlvdXIgZXZlbnQKNC4gKipGaXggY29tbW9uIGlzc3VlcyoqOgogICAtIE1pc3Npbmcgb3IgbWlzc3BlbGxlZCBhY3Rpb24gbmFtZXMKICAgLSBJbnZhbGlkIFlBTUwgc3ludGF4ICh1c2UgeWFtbGxpbnQpCiAgIC0gV29ya2Zsb3cgZmlsZSBub3QgaW4gLmdpdGh1Yi93b3JrZmxvd3MvCiAgIC0gV29ya2Zsb3cgZGlzYWJsZWQgaW4gcmVwbyBzZXR0aW5ncwotIFRoZSBQUiBjaGVja3MgcGFnZSBvbiBHaXRIdWIgaXMgeW91ciBzb3VyY2Ugb2YgdHJ1dGgKCkJlZ2luIHlvdXIgY29kZSBxdWFsaXR5IHJldmlldyBub3cuIgoKIyBEZWJ1ZzogUHJpbnQgdGhlIGFjdHVhbCBwcm9tcHQgYW5kIENMQVVERS5tZCBjb250ZW50CmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UjSBERUJVRzogQ0xFTyBQUk9NUFQgQ09OVEVOVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIkQ0xFT19QUk9NUFQiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UjSBERUJVRzogQ0xBVURFLm1kIE1FTU9SWSBDT05URU5UIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiBdOyB0aGVuCiAgICBjYXQgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgplbHNlCiAgICBlY2hvICLinYwgTm8gQ0xBVURFLm1kIGZvdW5kIGF0ICRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgpmaQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIENvbXBvc2UgaW5pdGlhbCB1c2VyIHR1cm4gd2l0aCB0aGUgc3RhdGljIHByb21wdApVU0VSX0NPTUJJTkVEPSQocHJpbnRmICIlcyIgIiRDTEVPX1BST01QVCIgfCBqcSAtUnMgLikKCiMgU3RhcnQgQ2xhdWRlIHdpdGggcHJvbXB0IHBpcGVkIGRpcmVjdGx5IHRvIHN0ZGluIChubyBzaWRlY2FyLCBubyBGSUZPKQpwcmludGYgJ3sidHlwZSI6InVzZXIiLCJtZXNzYWdlIjp7InJvbGUiOiJ1c2VyIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0Ijolc31dfX1cbicgIiRVU0VSX0NPTUJJTkVEIiB8ICRDTEFVREVfQ01EICYKQ0xBVURFX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBDbGF1ZGUgd2l0aCBDbGVvIHByb21wdCAoUElEOiAkQ0xBVURFX1BJRCkiCgojIFN0YXJ0IGJhY2tncm91bmQgdG9rZW4gcmVmcmVzaCBmb3IgbG9uZy1ydW5uaW5nIGpvYnMKKAogICAgd2hpbGUga2lsbCAtMCAkQ0xBVURFX1BJRCAyPi9kZXYvbnVsbDsgZG8KICAgICAgICBzbGVlcCAyNzAwICAjIENoZWNrIGV2ZXJ5IDQ1IG1pbnV0ZXMKCiAgICAgICAgaWYgWyAtbiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXTsgdGhlbgogICAgICAgICAgICBOT1c9JChkYXRlICslcykKICAgICAgICAgICAgVE9LRU5fQUdFPSQoKE5PVyAtIFRPS0VOX0dFTkVSQVRFRF9BVCkpCgogICAgICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDI3MDAgXTsgdGhlbgogICAgICAgICAgICAgICAgZWNobyAiW0JhY2tncm91bmRdIFRva2VuIGlzICQoKCRUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMgb2xkLCByZWZyZXNoaW5nLi4uIgogICAgICAgICAgICAgICAgcmVmcmVzaF9naXRodWJfdG9rZW4KICAgICAgICAgICAgZmkKICAgICAgICBmaQogICAgZG9uZQopICYKVE9LRU5fUkVGUkVTSF9QSUQ9JCEKZWNobyAi4pyTIFN0YXJ0ZWQgYmFja2dyb3VuZCB0b2tlbiByZWZyZXNoIChQSUQ6ICRUT0tFTl9SRUZSRVNIX1BJRCkiCgojIFdhaXQgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlCndhaXQgIiRDTEFVREVfUElEIgpDTEFVREVfRVhJVF9DT0RFPSQ/CgojIFN0b3AgdG9rZW4gcmVmcmVzaCBiYWNrZ3JvdW5kIHByb2Nlc3MKaWYgWyAtbiAiJFRPS0VOX1JFRlJFU0hfUElEIiBdOyB0aGVuCiAgICBraWxsICRUT0tFTl9SRUZSRVNIX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlY2hvICLinJMgU3RvcHBlZCB0b2tlbiByZWZyZXNoIHByb2Nlc3MiCmZpCgojIEFsd2F5cyBhdHRlbXB0IHRvIGNvbXBsZXRlIHF1YWxpdHkgcmV2aWV3IC0gZG9uJ3QgZXhpdCBvbiBDbGF1ZGUgZmFpbHVyZXMKZWNobyAi8J+UhCBQcm9jZXNzaW5nIHF1YWxpdHkgcmV2aWV3IHJlc3VsdHMuLi4iCmlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogIGVjaG8gIuKchSBDbGF1ZGUgcXVhbGl0eSByZXZpZXcgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKZmkKCiMgQWx3YXlzIGF0dGVtcHQgdG8gcG9zdCBQUiBjb21tZW50IGFuZCBhZGQgbGFiZWwgcmVnYXJkbGVzcyBvZiBDbGF1ZGUgZXhpdCBzdGF0dXMKIyBEZXRlcm1pbmUgT1dORVIvUkVQTyBzbHVnIGZvciBnaCAtUgpSRVBPX0lOUFVUPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCmlmIGVjaG8gIiRSRVBPX0lOUFVUIiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogIFJFUE9fU0xVRz0kKGVjaG8gIiRSRVBPX0lOUFVUIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rL1teLy5dKykoXC5naXQpPyR8XDF8JykKZWxzZQogIFJFUE9fU0xVRz0iJFJFUE9fSU5QVVQiCmZpCgojIFBvc3QgcXVhbGl0eSByZXZpZXcgY29tbWVudCB0byBQUgppZiBbIC1uICIkUFJfTlVNQkVSIiBdIHx8IFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICBlY2hvICLwn5KsIFBvc3RpbmcgcXVhbGl0eSByZXZpZXcgY29tbWVudCB0byBQUi4uLiIKCiAgIyBDcmVhdGUgY29tbWVudCBib2R5IGJhc2VkIG9uIENsYXVkZSBleGl0IHN0YXR1cwogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgQ09NTUVOVF9CT0RZPSIjIyDwn5SNIENvZGUgUXVhbGl0eSBSZXZpZXcgYnkgQ2xlbwoK4pyFICoqUXVhbGl0eSBjaGVja3MgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSoqCgojIyMgUmV2aWV3IFN1bW1hcnkKLSBDb2RlIGhhcyBiZWVuIHJldmlld2VkIGZvciBxdWFsaXR5IHN0YW5kYXJkcwotIEFsbCByZXF1aXJlZCBjaGVja3MgaGF2ZSBwYXNzZWQKLSBSZWFkeSBmb3IgUUEgdGVzdGluZwoKLS0tCipSZXZpZXdlZCBieSBDbGVvIC0gNURMYWJzIENvZGUgUXVhbGl0eSBBZ2VudCoiCiAgZWxzZQogICAgQ09NTUVOVF9CT0RZPSIjIyDwn5SNIENvZGUgUXVhbGl0eSBSZXZpZXcgYnkgQ2xlbwoK4pqg77iPICoqUXVhbGl0eSByZXZpZXcgZW5jb3VudGVyZWQgaXNzdWVzKioKCiMjIyBDdXJyZW50IFN0YXR1cwotIFF1YWxpdHkgY2hlY2tzIGFyZSBiZWluZyBwcm9jZXNzZWQKLSBTb21lIGlzc3VlcyBtYXkgbmVlZCB0byBiZSByZXNvbHZlZAotIFJldmlldyB3aWxsIGNvbnRpbnVlIHVudGlsIHN0YW5kYXJkcyBhcmUgbWV0CgojIyMgTmV4dCBTdGVwcwotIE1vbml0b3IgQ0kvQ0QgcGlwZWxpbmUgc3RhdHVzCi0gQWRkcmVzcyBhbnkgZmFpbGluZyBxdWFsaXR5IGNoZWNrcwotIEl0ZXJhdGUgdW50aWwgYWxsIHN0YW5kYXJkcyBhcmUgbWV0CgotLS0KKlJldmlld2VkIGJ5IENsZW8gLSA1RExhYnMgQ29kZSBRdWFsaXR5IEFnZW50KiIKICBmaQoKICAjIFBvc3QgY29tbWVudCB1c2luZyBQUiBudW1iZXIgb3IgVVJMCiAgaWYgWyAtbiAiJFBSX05VTUJFUiIgXTsgdGhlbgogICAgaWYgZWNobyAiJENPTU1FTlRfQk9EWSIgfCBnaCBwciBjb21tZW50ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1ib2R5LWZpbGUgLSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICBlY2hvICLinIUgU3VjY2Vzc2Z1bGx5IHBvc3RlZCBxdWFsaXR5IHJldmlldyBjb21tZW50IgogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHBvc3QgY29tbWVudCB1c2luZyBQUiBudW1iZXIiCiAgICBmaQogIGVsaWYgWyAtbiAiJFBSX1VSTCIgXTsgdGhlbgogICAgaWYgZWNobyAiJENPTU1FTlRfQk9EWSIgfCBnaCBwciBjb21tZW50ICIkUFJfVVJMIiAtLWJvZHktZmlsZSAtIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgcG9zdGVkIHF1YWxpdHkgcmV2aWV3IGNvbW1lbnQiCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gcG9zdCBjb21tZW50IgogICAgZmkKICBmaQpmaQoKIyBVcGRhdGUgcmVtZWRpYXRpb24gc3RhdHVzIGxhYmVscyBmb3IgQ2xlbydzIG91dGNvbWUKaWYgWyAtbiAiJFBSX05VTUJFUiIgXSB8fCBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgZW5zdXJlX3N0YXR1c19sYWJlbHMgIiRSRVBPX1NMVUciIFwKICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19GSVhFU306ZDczYTRhOlJlbWVkaWF0aW9uIHJlcXVlc3RlZCBieSBUZXNzIiBcCiAgICAiJHtTVEFUVVNfTEFCRUxfRklYSU5HfTpmYmNhMDQ6UmV4IGlzIGFjdGl2ZWx5IGFwcGx5aW5nIGZpeGVzIiBcCiAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfQ0xFT306MGU4YTE2OkF3YWl0aW5nIENsZW8gcXVhbGl0eSByZXZpZXciIFwKICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19URVNTfTo1MzE5ZTc6QXdhaXRpbmcgVGVzcyBRQSByZXZpZXciIFwKICAgICIke1NUQVRVU19MQUJFTF9BUFBST1ZFRH06MmRhNDRlOkFsbCBhdXRvbWF0ZWQgcmV2aWV3cyBhcHByb3ZlZCIgXAogICAgIiR7U1RBVFVTX0xBQkVMX0ZBSUxFRH06YjYwMjA1OlJlbWVkaWF0aW9uIGZhaWxlZCBvciBhYm9ydGVkIgoKICBpZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBDbGVvIHF1YWxpdHkgY2hlY2tzIHBhc3NlZCAtIGhhbmRpbmcgb2ZmIHRvIFRlc3MgZm9yIEUyRSB0ZXN0aW5nIgogICAgCiAgICAjIFBvc3QgQ09NTUVOVCAoTk9UIEFQUFJPVkUpIC0gVGVzcyBoYXMgZmluYWwgYXBwcm92YWwgYXV0aG9yaXR5CiAgICB0aW1lb3V0IDMwIGdoIHByIGNvbW1lbnQgIiRQUl9OVU1CRVIiIC0tYm9keSAiIyMjIOKchSBDb2RlIFF1YWxpdHkgUmV2aWV3IC0gUEFTU0VECgpBbGwgcXVhbGl0eSBjaGVja3MgaGF2ZSBwYXNzZWQ6Ci0gQ29kZSBmb3JtYXR0aW5nIHZlcmlmaWVkCi0gTGludGluZyBwYXNzZWQKLSBVbml0IHRlc3RzIHN1Y2Nlc3NmdWwKLSBRdWFsaXR5IHN0YW5kYXJkcyBtZXQKCioqU3RhdHVzOioqIFJlYWR5IGZvciBlbmQtdG8tZW5kIHRlc3RpbmcgYnkgVGVzcwoqKk5leHQgU3RlcDoqKiBUZXNzIHdpbGwgbm93IHBlcmZvcm0gY29tcHJlaGVuc2l2ZSBRQSB2YWxpZGF0aW9uCgotLS0KKlF1YWxpdHkgcmV2aWV3IGJ5IENsZW8gLSA1RExhYnMgQ29kZSBRdWFsaXR5IEFnZW50KiIgfHwgZWNobyAi4pqg77iPIFBSIGNvbW1lbnQgY29tbWFuZCBmYWlsZWQiCiAgICAKICAgICMgQWRkIHJlYWR5LWZvci1xYSBsYWJlbCB0byBzaWduYWwgVGVzcwogICAgZWNobyAi8J+Pt++4jyAgQWRkaW5nICdyZWFkeS1mb3ItcWEnIGxhYmVsIHRvIHRyaWdnZXIgVGVzcyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIGVkaXQgIiRQUl9OVU1CRVIiIC0tYWRkLWxhYmVsICJyZWFkeS1mb3ItcWEiIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIHJlYWR5LWZvci1xYSBsYWJlbCIKICAgIAogICAgdXBkYXRlX2NvZGVydW5fc3RhdHVzICJyZWFkeS1mb3ItcWEiICJxdWFsaXR5LXBhc3NlZCIgIiRQUl9VUkwiCiAgZWxzZQogICAgZWNobyAi4p2MIFF1YWxpdHkgaXNzdWVzIGRldGVjdGVkIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU1CRVIiIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKQ29kZSBxdWFsaXR5IGlzc3VlcyBkZXRlY3RlZC4gUGxlYXNlIGFkZHJlc3MgdGhlIGZvbGxvd2luZzoKLSBSZXZpZXcgY29kZSBmb3JtYXR0aW5nCi0gRml4IGxpbnRpbmcgZXJyb3JzCi0gRW5zdXJlIHVuaXQgdGVzdHMgcGFzcwotIE1lZXQgcXVhbGl0eSBzdGFuZGFyZHMKClJleCB3aWxsIGFkZHJlc3MgdGhlc2UgaXNzdWVzIGFuZCByZXN1Ym1pdCBmb3IgcmV2aWV3LgoKLS0tCipRdWFsaXR5IHJldmlldyBieSBDbGVvIC0gNURMYWJzIENvZGUgUXVhbGl0eSBBZ2VudCoiIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCBmYWlsZWQiCiAgICB1cGRhdGVfY29kZXJ1bl9zdGF0dXMgIm5lZWRzLWZpeGVzIiAiY2hhbmdlc19yZXF1ZXN0ZWQiICIkUFJfVVJMIgogIGZpCmVsc2UKICBlY2hvICLimqDvuI8gTm8gUFIgcmVmZXJlbmNlIGF2YWlsYWJsZSwgc2tpcHBpbmcgcmVtZWRpYXRpb24gbGFiZWwgdXBkYXRlIgogIHVwZGF0ZV9jb2RlcnVuX3N0YXR1cyAiJFNUQVRVU19MQUJFTF9ORUVEU19GSVhFUyIgImNoYW5nZXNfcmVxdWVzdGVkIiAiIgpmaQoKIyBObyBzaWRlY2FyIHNodXRkb3duIG5lZWRlZCAtIGNvbnRhaW5lciB3aWxsIGV4aXQgbmF0dXJhbGx5IHdoZW4gbWFpbiBwcm9jZXNzIGNvbXBsZXRlcwoKICAjIENoZWNrIGlmIHF1YWxpdHkgcmV2aWV3IHdhcyBzdWNjZXNzZnVsCiAgaWYgWyAkQ0xBVURFX0VYSVRfQ09ERSAtZXEgMCBdOyB0aGVuCiAgICBlY2hvICLinIUgQXR0ZW1wdCAkQVRURU1QVDogUXVhbGl0eSBjaGVja3MgcGFzc2VkIgogICAgU1VDQ0VTUz0xCiAgICBicmVhawogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBBdHRlbXB0ICRBVFRFTVBUOiBRdWFsaXR5IGNoZWNrcyBpbmNvbXBsZXRlIChleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFKSIKICAgIAogICAgaWYgWyAkQVRURU1QVCAtbHQgJE1BWF9SRVRSSUVTIF07IHRoZW4KICAgICAgZWNobyAi8J+UhCBXaWxsIHJldHJ5Li4uICgkKChNQVhfUkVUUklFUyAtIEFUVEVNUFQpKSBhdHRlbXB0cyByZW1haW5pbmcpIgogICAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgICAgZWNobyAiIgogICAgICAjIEJyaWVmIHBhdXNlIGJlZm9yZSByZXRyeQogICAgICBzbGVlcCAyCiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHJlYWNoZWQiCiAgICAgIGJyZWFrCiAgICBmaQogIGZpCmRvbmUKCiMgUmVwb3J0IGZpbmFsIHN0YXR1cwplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi4pyFIENMRU8gUVVBTElUWSBSRVZJRVcgU1VDQ0VTU0ZVTCIKICBlY2hvICIgICBDb21wbGV0ZWQgYWZ0ZXIgJEFUVEVNUFQgYXR0ZW1wdChzKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBDTEVPIFFVQUxJVFkgUkVWSUVXIElOQ09NUExFVEUiCiAgZWNobyAiICAgQXR0ZW1wdGVkICRBVFRFTVBUIHRpbWUocykiCiAgZWNobyAiICAgUXVhbGl0eSBzdGFuZGFyZHMgbm90IHlldCBtZXQiCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgQ2xlYW51cCBhbmQgZXhpdAplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgIENMRU8gQ09ERSBRVUFMSVRZIENPTVBMRVRFICAgICAgICAgICAgICAgICAg4pWRIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCfk4sgVGFzazoge3t0YXNrX2lkfX0iCmVjaG8gIuKchSBDb2RlIHF1YWxpdHkgY2hlY2tzIGNvbXBsZXRlZCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCflJogVEVSTUlOQVRJTkcgQ0xFTyBDT05UQUlORVIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiQ2xhdWRlIEV4aXQgQ29kZTogJENMQVVERV9FWElUX0NPREUiCmVjaG8gIkNvbnRhaW5lciBQSUQ6ICQkIgplY2hvICJGaW5hbCBQcm9jZXNzIENoZWNrOiIKcHMgYXV4IHwgaGVhZCAtNQoKIyBXcml0ZSBjb21wbGV0aW9uIG1hcmtlciBmb3Igd29ya2Zsb3cgdHJhY2tpbmcKZWNobyAiY2xlby1xdWFsaXR5LWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8uY2xlby1jb21wbGV0ZQoKIyBDbGVhbnVwIEZJRk8Kcm0gLWYgIiRGSUZPX1BBVEgiIDI+L2Rldi9udWxsIHx8IHRydWUKCiMgRXhpdCB3aXRoIGFwcHJvcHJpYXRlIGNvZGUgYmFzZWQgb24gc3VjY2VzcwppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLwn5SaIFRlcm1pbmF0aW5nIGNvbnRhaW5lciB3aXRoIHN1Y2Nlc3Mgc3RhdHVzLi4uIgogIGV4aXQgMAplbHNlCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBmYWlsdXJlIHN0YXR1cy4uLiIKICBlY2hvICLwn5OdIFF1YWxpdHkgY2hlY2tzIGluY29tcGxldGUgYWZ0ZXIgJEFUVEVNUFQgYXR0ZW1wdChzKSIKICBleGl0IDEKZmkK + code_claude_container-cleo.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIENMRU8gQ09ERSBRVUFMSVRZIFdPUktGTE9XIFNUQVJUSU5HICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICBDb2RlIFF1YWxpdHkgJiBDSS9DRCBQaXBlbGluZSBFbmZvcmNlbWVudCBBZ2VudCAgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCflI0gRm9jdXM6IENvZGUgcXVhbGl0eSwgQ0kvQ0Qgc2V0dXAsIGFuZCBEb2NrZXIgaW1hZ2UgYnVpbGRpbmciCmVjaG8gIvCfk4sgVGFzayBJRDoge3t0YXNrX2lkfX0iCmVjaG8gIuKchSBNaXNzaW9uOiBQZXJmZWN0IGNvZGUgcXVhbGl0eSBBTkQgd29ya2luZyBDSS9DRCBwaXBlbGluZSB3aXRoIERvY2tlciBidWlsZHMiCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCiMgU2V0IHVwIEVYSVQgdHJhcCB0byBlbnN1cmUgRG9ja2VyIHNpZGVjYXIgY2xlYW51cAp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFVFJZIENPTkZJR1VSQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BWF9SRVRSSUVTX0NPTkZJRz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDTEFVREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ0xBVURFX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBDbGVhbiB1cCBhbnkgbGVmdG92ZXIgY29tcGxldGlvbiBtYXJrZXIgZnJvbSBwcmV2aW91cyBydW5zCiMgVGhpcyBwcmV2ZW50cyBpc3N1ZXMgd2l0aCBzZXF1ZW50aWFsIHRhc2sgZXhlY3V0aW9ucyBvbiB0aGUgc2FtZSBQVkMKaWYgWyAtZiAvd29ya3NwYWNlLy5jbGVvLWNvbXBsZXRlIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgQ2xlYW5pbmcgdXAgY29tcGxldGlvbiBtYXJrZXIgZnJvbSBwcmV2aW91cyBydW4iCiAgICBybSAtZiAvd29ya3NwYWNlLy5jbGVvLWNvbXBsZXRlCmZpCgojIERpc2FibGUgaW50ZXJhY3RpdmUgR2l0IHByb21wdHMgZ2xvYmFsbHkKZXhwb3J0IEdJVF9URVJNSU5BTF9QUk9NUFQ9MApleHBvcnQgR0lUX0FTS1BBU1M9L2Jpbi90cnVlCmV4cG9ydCBTU0hfQVNLUEFTUz0vYmluL3RydWUKCiMgUmVwb3NpdG9yeSBVUkwKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKZWNobyAiVXNpbmcgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiBmb3IgY29kZSBxdWFsaXR5IGNoZWNrcyIKCiMgQXV0aGVudGljYXRlIHdpdGggR2l0SHViIEFwcAppZiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9JRCIgXTsgdGhlbgogICAgZWNobyAiQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwLi4uIgoKICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBwcml2YXRlIGtleSBmaWxlIChzdXBwb3J0IGVzY2FwZWQgbmV3bGluZXMpCiAgICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKICAgIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICBjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgR2VuZXJhdGUgSldUIHRva2VuIGZvciBHaXRIdWIgQXBwIChmaXhlZCBKV1QgZ2VuZXJhdGlvbiBmb3IgTGludXggY29udGFpbmVycykKICAgICMgSldUIGhlYWRlcgogICAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQoKICAgICMgSldUIHBheWxvYWQgd2l0aCBjdXJyZW50IHRpbWUgYW5kIGV4cGlyYXRpb24gKDEwIG1pbnV0ZXMpCiAgICBOT1c9JChkYXRlICslcykKICAgIEVYUD0kKChOT1cgKyA2MDApKQogICAgSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBTaWduIHRoZSBKV1QKICAgIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgICBKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gSUQgZm9yIHRoZSByZXBvc2l0b3J5IChyb2J1c3QgcGFyc2luZyBvZiBvd25lci9yZXBvKQogICAgSU5QVVRfUkVQTz0ie3tyZXBvc2l0b3J5X3VybH19IgogICAgUkVQT19PV05FUj0iIgogICAgUkVQT19OQU1FPSIiCgogICAgaWYgZWNobyAiJElOUFVUX1JFUE8iIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvLip8XDF8JykKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tL1teL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmdpdEBnaXRodWIuY29tOic7IHRoZW4KICAgICAgICAjIFNTSCBmb3JtYXQgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwbyguZ2l0KQogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsc2UKICAgICAgICAjIEZhbGxiYWNrOiBhc3N1bWUgc2x1ZyBvd25lci9yZXBvIChwb3NzaWJseSB3aXRoIC5naXQpCiAgICAgICAgU0xVRz0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xcLmdpdCR8fCcpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRTTFVHIiB8IGN1dCAtZCcvJyAtZjEpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMikKICAgIGZpCgogICAgZWNobyAiREVCVUc6IFBhcnNlZCByZXBvc2l0b3J5IC0gT3duZXI6ICckUkVQT19PV05FUicsIE5hbWU6ICckUkVQT19OQU1FJyIKCiAgICBlY2hvICJHZXR0aW5nIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRS4uLiIKCiAgICAjIEdldCB0aGUgaW5zdGFsbGF0aW9uIElEIChyZXRyeSBhbmQgZm9sbG93IHJlZGlyZWN0cykuIEZhbGxiYWNrIHRvIG9yZyBpbnN0YWxsYXRpb24uCiAgICBJTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgLS1jb25uZWN0LXRpbWVvdXQgNSAtLW1heC10aW1lIDEyIFwKICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIpCgogICAgSU5TVEFMTEFUSU9OX0lEPSQoZWNobyAiJElOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gUmVwbyBpbnN0YWxsYXRpb24gbm90IGZvdW5kLCB0cnlpbmcgb3JnIGluc3RhbGxhdGlvbi4uLiIKICAgICAgICBPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFPSQoY3VybCAtcyAtTCAtLXJldHJ5IDUgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktY29ubnJlZnVzZWQgXAogICAgICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIikKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkT1JHX0lOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKICAgIGZpCgogICAgaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykgICMgVHJhY2sgd2hlbiB0b2tlbiB3YXMgZ2VuZXJhdGVkIGZvciByZWZyZXNoIGxvZ2ljCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIGFjY2VzcyB0b2tlbiIKICAgICAgICBlY2hvICJSZXNwb25zZTogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViIEFwcCIKCiAgICAjIENsZWFuIHVwIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgRXhwb3J0IHRoZSB0b2tlbiBmb3IgZ2l0IHRvIHVzZQogICAgZXhwb3J0IEdJVEhVQl9UT0tFTgoKICAgICMgQ29uZmlndXJlIGdpdCB0byB1c2UgdGhlIHRva2VuICh1c2UgLS1yZXBsYWNlLWFsbCB0byBoYW5kbGUgbXVsdGlwbGUgZXhpc3RpbmcgaGVscGVycykKICAgIGdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciBzdG9yZQogICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKCiAgICAjIEFsc28gYXV0aGVudGljYXRlIGdoIENMSSB3aXRoIHRoZSB0b2tlbgogICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbgoKICAgICMgVG9rZW4gcmVmcmVzaCBmdW5jdGlvbnMgZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbigpIHsKICAgICAgICBlY2hvICLwn5SEIFJlZnJlc2hpbmcgR2l0SHViIEFwcCB0b2tlbi4uLiIKCiAgICAgICAgIyBDcmVhdGUgdGVtcG9yYXJ5IGtleSBmaWxlCiAgICAgICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS0kJCIKICAgICAgICBlY2hvICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAgICAgIyBHZW5lcmF0ZSBuZXcgSldUCiAgICAgICAgSldUX1RPS0VOPSQocnVieSAtciBvcGVuc3NsIC1yIGpzb24gLXIgYmFzZTY0IC1lICIKICAgICAgICBrZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUucmVhZCgnJFRFTVBfS0VZX0ZJTEUnKSkKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgICBpYXQ6IFRpbWUubm93LnRvX2kgLSA2MCwKICAgICAgICAgICAgZXhwOiBUaW1lLm5vdy50b19pICsgKDEwICogNjApLAogICAgICAgICAgICBpc3M6ICckR0lUSFVCX0FQUF9JRCcKICAgICAgICB9CiAgICAgICAgaGVhZGVyID0geyBhbGc6ICdSUzI1NicsIHR5cDogJ0pXVCcgfQoKICAgICAgICBoZWFkZXJfZW5jID0gQmFzZTY0LnVybHNhZmVfZW5jb2RlNjQoaGVhZGVyLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBwYXlsb2FkX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KHBheWxvYWQudG9fanNvbikuZ3N1YignPScsICcnKQogICAgICAgIHNpZ25hdHVyZSA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGtleS5zaWduKE9wZW5TU0w6OkRpZ2VzdDo6U0hBMjU2Lm5ldywgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9XCIpKS5nc3ViKCc9JywgJycpCgogICAgICAgIHB1dHMgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9LiN7c2lnbmF0dXJlfVwiCiAgICAgICAgIikKCiAgICAgICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIChyZXVzZSBsb2dpYyBmcm9tIGluaXRpYWwgYXV0aCkKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCgogICAgICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKICAgICAgICBmaQoKICAgICAgICAjIEdldCBuZXcgaW5zdGFsbGF0aW9uIHRva2VuCiAgICAgICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgICAgIE5FV19UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKCiAgICAgICAgaWYgWyAiJE5FV19UT0tFTiIgIT0gIm51bGwiIF0gJiYgWyAtbiAiJE5FV19UT0tFTiIgXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgICAgICAgICBleHBvcnQgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCgogICAgICAgICAgICAjIFVwZGF0ZSBnaXQgY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAyPi9kZXYvbnVsbAoKICAgICAgICAgICAgZWNobyAi4pyFIFRva2VuIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkiCiAgICAgICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgIH0KCiAgICAjIENoZWNrIGlmIHRva2VuIG5lZWRzIHJlZnJlc2ggKGNhbGwgYmVmb3JlIGdpdCBvcGVyYXRpb25zKQogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQoKSB7CiAgICAgICAgaWYgWyAteiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLimqDvuI8gTm8gdG9rZW4gdGltZXN0YW1wIGZvdW5kLCByZWZyZXNoaW5nIHRva2VuLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmaQoKICAgICAgICBOT1c9JChkYXRlICslcykKICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgIyBSZWZyZXNoIGlmIHRva2VuIGlzIG9sZGVyIHRoYW4gNTAgbWludXRlcyAodG9rZW5zIGxhc3QgMSBob3VyLCByZWZyZXNoIGF0IDUwIG1pbiB0byBiZSBzYWZlKQogICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMzAwMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflIQgVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgZmkKICAgIH0KCmVsc2UKICAgIGVjaG8gIuKdjCBHaXRIdWIgQXBwIGNyZWRlbnRpYWxzIG5vdCBmb3VuZCIKICAgIGV4aXQgMQpmaQoKIyBFeHRyYWN0IHJlcG9zaXRvcnkgbmFtZSBmcm9tIFVSTCAoZS5nLiwgIjVkbGFicy9ydXN0LWJhc2ljLWFwaS0yIiAtPiAicnVzdC1iYXNpYy1hcGktMiIpClJFUE9fTkFNRT0kKGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBzZWQgLUUgJ3N8LiovKFteL10rKSR8XDF8JyB8IHNlZCAnc3xcLmdpdCR8fCcpClJFUE9fUk9PVD0iL3dvcmtzcGFjZS8kUkVQT19OQU1FIgoKIyBEZXRlcm1pbmUgd29ya2luZyBkaXJlY3RvcnkgLSB1c2UgcmVwbyByb290IGlmIHdvcmtpbmdfZGlyZWN0b3J5IGlzICIuIiBvciBlbXB0eQpXT1JLX0RJUj0ie3t3b3JraW5nX2RpcmVjdG9yeX19IgppZiBbICIkV09SS19ESVIiID0gIi4iIF0gfHwgWyAteiAiJFdPUktfRElSIiBdIHx8IFsgIiRXT1JLX0RJUiIgPSAibnVsbCIgXTsgdGhlbgogIENMQVVERV9XT1JLX0RJUj0iJFJFUE9fUk9PVCIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iJFJFUE9fUk9PVC8kV09SS19ESVIiCmZpCgplY2hvICLwn5SnIFJlcG9zaXRvcnk6ICRSRVBPX05BTUUiCmVjaG8gIvCflKcgV29ya2luZyBkaXJlY3Rvcnkgd2lsbCBiZSBzZXQgdG86ICRDTEFVREVfV09SS19ESVIiCgojIFByZXBhcmUgZW52aXJvbm1lbnQgZm9yIFFBIGNoZWNrcwplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCfk4ogUFJFUEFSSU5HIENPREUgUVVBTElUWSBFTlZJUk9OTUVOVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDb25maWd1cmUgR2l0IGlkZW50aXR5CmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiY2xlb0A1ZGxhYnMuY29tIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiNURMYWJzLUNsZW8iCmdpdCBjb25maWcgLS1nbG9iYWwgaW5pdC5kZWZhdWx0QnJhbmNoIG1haW4KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgppZiBnaXQgbHMtcmVtb3RlICIkUkVQT19IVFRQX1VSTCIgSEVBRCA+IC90bXAvcmVwb190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgZWNobyAi4pyTIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3MgZmFpbGVkIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvcmVwb190ZXN0Lm91dCkiCiAgZWNobyAiICBHaXQgY3JlZGVudGlhbCBoZWxwZXIgc3RhdHVzOiIKICBnaXQgY29uZmlnIC0tbGlzdCB8IGdyZXAgY3JlZGVudGlhbCB8fCBlY2hvICIgIE5vIGNyZWRlbnRpYWwgaGVscGVycyBjb25maWd1cmVkIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIHJlcG9zaXRvcnkgdmlhIEhUVFBTIgogIGV4aXQgMQpmaQoKIyBUZXN0IGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBkb2NzIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkRE9DU19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRET0NTX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9kb2NzX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBzdWNjZXNzZnVsIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9kb2NzX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgRXJyb3Igb3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQpIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIGRvY3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIENsb25lIG9yIHVwZGF0ZSByZXBvc2l0b3J5CmNkIC93b3Jrc3BhY2UKaWYgWyAtZCAiJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHJlcG9zaXRvcnkgYXQgJyRSRVBPX1JPT1QnLCB1cGRhdGluZy4uLiIKICAgIGNkICIkUkVQT19OQU1FIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCmVsc2UKICAgIGVjaG8gIvCfk6UgQ2xvbmluZyByZXBvc2l0b3J5IHRvICckUkVQT19ST09UJy4uLiIKICAgIGlmICEgZ2l0IGNsb25lICIkUkVQT19IVFRQX1VSTCIgIiRSRVBPX05BTUUiOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSByZXBvc2l0b3J5IgogICAgICAgIGV4aXQgMQogICAgZmkKICAgIGNkICIkUkVQT19OQU1FIgpmaQoKIyBDcmVhdGUgd29ya2luZyBkaXJlY3RvcnkgaWYgaXQncyBhIHN1YmRpcmVjdG9yeQppZiBbICIkQ0xBVURFX1dPUktfRElSIiAhPSAiJFJFUE9fUk9PVCIgXTsgdGhlbgogICAgbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmZpCgpjZCAiJENMQVVERV9XT1JLX0RJUiIKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgoKIyBEZXJpdmUgcmVwb3NpdG9yeSBzbHVnIGZvciBnaCBDTEkgb3BlcmF0aW9ucwpSRVBPX1NMVUc9IiIKaWYgZ2l0IC1DICIkQ0xBVURFX1dPUktfRElSIiByZW1vdGUgZ2V0LXVybCBvcmlnaW4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgT1JJR0lOX1VSTD0kKGdpdCAtQyAiJENMQVVERV9XT1JLX0RJUiIgcmVtb3RlIGdldC11cmwgb3JpZ2luIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSsvW14vXSspKFxcLmdpdCk/fFxcMXwnKQogIGVsaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICBSRVBPX1NMVUc9JChlY2hvICIkT1JJR0lOX1VSTCIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rL1teL10rKShcXC5naXQpP3xcXDF8JykKICBmaQpmaQoKIyBJZiBQUiBjb250ZXh0IGlzIG1pc3NpbmcsIHRyeSB0byBkaXNjb3ZlciBieSB0YXNrIGxhYmVsCmlmIFsgLXogIiR7UFJfTlVNQkVSOi19IiBdIHx8IFsgLXogIiR7UFJfVVJMOi19IiBdOyB0aGVuCiAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUR9IgogIGlmIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxICYmIFsgLW4gIiRSRVBPX1NMVUciIF07IHRoZW4KICAgIENBTkRfTlVNPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1sYWJlbCAiJFRBU0tfTEFCRUwiIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkQ0FORF9OVU0iIF07IHRoZW4KICAgICAgUFJfTlVNQkVSPSIkQ0FORF9OVU0iCiAgICAgIFBSX1VSTD0kKGdoIHByIHZpZXcgIiRQUl9OVU1CRVIiIC1SICIkUkVQT19TTFVHIiAtLWpzb24gdXJsIC1xIC51cmwgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgICAgZWNobyAi4pyTIERpc2NvdmVyZWQgUFIgY29udGV4dCB2aWEgbGFiZWw6IFBSICMkUFJfTlVNQkVSICgkUFJfVVJMKSIKICAgIGZpCiAgZmkKZmkKCiMgQ2hlY2tvdXQgUFIgYnJhbmNoIGZvciBxdWFsaXR5IHJldmlldwppZiBbIC1uICIkUFJfTlVNQkVSIiBdICYmIFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgQ2hlY2tpbmcgb3V0IFBSICMkUFJfTlVNQkVSIGZvciBxdWFsaXR5IHJldmlldy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgoKICAgICMgRmV0Y2ggYWxsIGxhdGVzdCBjaGFuZ2VzIGluY2x1ZGluZyBQUiBicmFuY2hlcwogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCgogICAgIyBHZXQgUFIgYnJhbmNoIGluZm9ybWF0aW9uIGFuZCBjaGVja291dAogICAgUFJfQlJBTkNIPSQoZ2ggcHIgdmlldyAiJFBSX05VTUJFUiIgLS1qc29uIGhlYWRSZWZOYW1lIC0tanEgJy5oZWFkUmVmTmFtZScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIFsgLW4gIiRQUl9CUkFOQ0giIF07IHRoZW4KICAgICAgICBlY2hvICLwn5OmIENoZWNraW5nIG91dCBQUiBicmFuY2g6ICRQUl9CUkFOQ0giCiAgICAgICAgaWYgZ2l0IGNoZWNrb3V0ICIkUFJfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5OlIFB1bGxpbmcgbGF0ZXN0IGNoYW5nZXMgZnJvbSAkUFJfQlJBTkNILi4uIgogICAgICAgICAgICBnaXQgcHVsbCBvcmlnaW4gIiRQUl9CUkFOQ0giIHx8IGVjaG8gIuKaoO+4jyAgQ291bGQgbm90IHB1bGwgbGF0ZXN0IGNoYW5nZXMiCiAgICAgICAgZWxpZiBnaXQgY2hlY2tvdXQgLWIgIiRQUl9CUkFOQ0giICJvcmlnaW4vJFBSX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZWNobyAi4pyFIENyZWF0ZWQgYW5kIGNoZWNrZWQgb3V0IHRyYWNraW5nIGJyYW5jaCBmb3IgJFBSX0JSQU5DSCIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKaoO+4jyAgQnJhbmNoIGNoZWNrb3V0IGZhaWxlZCwgdHJ5aW5nIEdpdEh1YiBDTEkgbWV0aG9kLi4uIgogICAgICAgICAgICBnaCBwciBjaGVja291dCAiJFBSX05VTUJFUiIgfHwgZWNobyAi4p2MIEZhaWxlZCB0byBjaGVja291dCBQUiB2aWEgZ2ggQ0xJIgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPICBDb3VsZCBub3QgZGV0ZXJtaW5lIFBSIGJyYW5jaCBuYW1lLCB1c2luZyBHaXRIdWIgQ0xJIHRvIGNoZWNrb3V0IFBSIGRpcmVjdGx5IgogICAgICAgIGdoIHByIGNoZWNrb3V0ICIkUFJfTlVNQkVSIiB8fCBlY2hvICLinYwgRmFpbGVkIHRvIGNoZWNrb3V0IFBSIgogICAgZmkKCiAgICAjIFZlcmlmeSB3ZSdyZSBvbiB0aGUgcmlnaHQgY29tbWl0CiAgICBDVVJSRU5UX1NIQT0kKGdpdCByZXYtcGFyc2UgSEVBRCkKICAgIGVjaG8gIvCfk40gQ3VycmVudCBjb21taXQ6ICRDVVJSRU5UX1NIQSIKCiAgICAjIERvbid0IGNoYW5nZSBkaXJlY3RvcnkgeWV0IC0gd2UnbGwgY2QgdG8gQ0xBVURFX1dPUktfRElSIGF0IHRoZSBlbmQKICAgIGVjaG8gIuKchSBSZXBvc2l0b3J5IHBvc2l0aW9uZWQgYXQgUFIgIyRQUl9OVU1CRVIgd2l0aCBsYXRlc3QgY2hhbmdlcyIKZWxzZQogICAgZWNobyAi4pqg77iPICBObyBQUiBjb250ZXh0IGZvdW5kIChQUl9OVU1CRVI9JFBSX05VTUJFUiwgUFJfVVJMPSRQUl9VUkwpIgogICAgZWNobyAi8J+TiyBXaWxsIHBlcmZvcm0gcXVhbGl0eSByZXZpZXcgb24gY3VycmVudCByZXBvc2l0b3J5IHN0YXRlIgpmaQoKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SNIENPREUgUVVBTElUWSBBTkFMWVNJUyBQUkVQQVJBVElPTiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCmVjaG8gIk1JU1NJT046IEVuZm9yY2Ugcmlnb3JvdXMgY29kZSBxdWFsaXR5IHN0YW5kYXJkczoiCmVjaG8gIjEuIFJ1biBDbGlwcHkgcGVkYW50aWMgY2hlY2tzIG9uIGFsbCBSdXN0IGNvZGUgY2hhbmdlcyIKZWNobyAiMi4gVmVyaWZ5IGNvZGUgZm9ybWF0dGluZyB3aXRoIGNhcmdvIGZtdCAtLWNoZWNrIgplY2hvICIzLiBFeGVjdXRlIGFsbCB0ZXN0cyB3aXRoIGNhcmdvIHRlc3QiCmVjaG8gIjQuIExpbnQgWUFNTCBmaWxlcyB3aGVuIFlBTUwgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQiCmVjaG8gIjUuIEFkZCAncmVhZHktZm9yLXFhJyBsYWJlbCBvbmx5IHdoZW4gYWxsIHF1YWxpdHkgY2hlY2tzIHBhc3MiCmVjaG8gIiIKZWNobyAiUXVhbGl0eSBTdGFuZGFyZHM6IgplY2hvICItIFplcm8gY2xpcHB5IHdhcm5pbmdzIChwZWRhbnRpYyBsZXZlbCkiCmVjaG8gIi0gUGVyZmVjdCBjb2RlIGZvcm1hdHRpbmciCmVjaG8gIi0gMTAwJSB0ZXN0IHBhc3NpbmcgcmF0ZSIKZWNobyAiLSBDbGVhbiBZQU1MIHN5bnRheCBhbmQgc3RydWN0dXJlIgplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgQ29weSB0YXNrIGZpbGVzIGZyb20gZG9jcyByZXBvc2l0b3J5IGlmIGNvbmZpZ3VyZWQKZWNobyAi8J+TiyBQcmVwYXJpbmcgdGFzayBkb2N1bWVudGF0aW9uIGZvciBxdWFsaXR5IHJldmlldy4uLiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKe3sjaWYgZG9jc1JlcG9zaXRvcnlVcmx9fQojIEluaXRpYWxpemUgY29tcHJlaGVuc2l2ZSB0cmFja2luZyB3aXRoIGV4cGxpY2l0IHN0YWdlIGZsYWdzCkNPUElFRF9GSUxFUz0iIgpGQUlMRURfRklMRVM9IiIKRVhJU1RJTkdfRklMRVM9IiIKRE9DU19TRVRVUF9TVUNDRVNTPWZhbHNlCkRPQ1NfQVVUSF9WRVJJRklFRD1mYWxzZQpET0NTX0NMT05FX1NVQ0NFU1M9ZmFsc2UKRE9DU19QQVRIX1ZBTElEPWZhbHNlCgojIFByZXBhcmUgdGFyZ2V0IGRpcmVjdG9yeSAoZW5zdXJlIGl0IGV4aXN0cykKaWYgISBta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUi90YXNrIiAyPi90bXAvbWtkaXJfZXJyb3IubG9nOyB0aGVuCiAgICBlY2hvICLinYwgQ1JJVElDQUw6IENhbm5vdCBjcmVhdGUgdGFzayBkaXJlY3RvcnkiCiAgICBlY2hvICIgICBFcnJvcjogJChjYXQgL3RtcC9ta2Rpcl9lcnJvci5sb2cgMj4vZGV2L251bGwgfHwgZWNobyAndW5rbm93bicpIgogICAgZWNobyAiICAgQWJvcnRpbmcgZG9jcyBzZXR1cCIKZWxzZQogICAgZWNobyAi4pyTIFRhc2sgZGlyZWN0b3J5IHByZXBhcmVkOiAkQ0xBVURFX1dPUktfRElSL3Rhc2siCmZpCgojIFZhbGlkYXRlIEdpdEh1YiB0b2tlbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmcKaWYgWyAteiAiJEdJVEhVQl9UT0tFTiIgXTsgdGhlbgogICAgZWNobyAi4p2MIENSSVRJQ0FMOiBObyBHSVRIVUJfVE9LRU4gYXZhaWxhYmxlIgogICAgZWNobyAiICAgQ2Fubm90IGF1dGhlbnRpY2F0ZSB0byBkb2NzIHJlcG9zaXRvcnkiCiAgICBlY2hvICIgICBBYm9ydGluZyBkb2NzIHNldHVwIC0gYWdlbnQgd2lsbCBoYXZlIGxpbWl0ZWQgY29udGV4dCIKICAgIERPQ1NfQVVUSF9WRVJJRklFRD1mYWxzZQplbHNlCiAgICBlY2hvICLinJMgR2l0SHViIHRva2VuIGF2YWlsYWJsZSAoJHsjR0lUSFVCX1RPS0VOfSBjaGFycykiCiAgICBET0NTX0FVVEhfVkVSSUZJRUQ9dHJ1ZQpmaQoKIyBPbmx5IHByb2NlZWQgaWYgd2UgaGF2ZSBhdXRoZW50aWNhdGlvbgppZiBbICIkRE9DU19BVVRIX1ZFUklGSUVEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAjIEJ1aWxkIGF1dGhlbnRpY2F0ZWQgZG9jcyBVUkwKICAgIERPQ1NfUkVQT19VUkw9Int7ZG9jc1JlcG9zaXRvcnlVcmx9fSIKICAgIERPQ1NfSFRUUF9VUkw9JChlY2hvICIkRE9DU19SRVBPX1VSTCIgfCBzZWQgInN8aHR0cHM6Ly9naXRodWIuY29tL3xodHRwczovL3gtYWNjZXNzLXRva2VuOiRHSVRIVUJfVE9LRU5AZ2l0aHViLmNvbS98IikKICAgIAogICAgZWNobyAi8J+TpSBEb2NzIFJlcG9zaXRvcnk6ICRET0NTX1JFUE9fVVJMIgogICAgCiAgICAjIFN0ZXAgMTogVmVyaWZ5IHJlcG9zaXRvcnkgYWNjZXNzIChmYWlsIGZhc3QgaWYgaW5hY2Nlc3NpYmxlKQogICAgZWNobyAiIgogICAgZWNobyAi8J+UjSBTdGVwIDEvNDogVmVyaWZ5aW5nIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgogICAgaWYgISBnaXQgbHMtcmVtb3RlICIkRE9DU19IVFRQX1VSTCIgSEVBRCA+L3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIFJlcG9zaXRvcnkgYWNjZXNzIEZBSUxFRCIKICAgICAgICBlY2hvICIgICBVUkw6ICRET0NTX1JFUE9fVVJMIgogICAgICAgIGVjaG8gIiAgIEVycm9yOiAkKGNhdCAvdG1wL2RvY3NfYWNjZXNzX3Rlc3Qub3V0IDI+L2Rldi9udWxsIHwgaGVhZCAtMykiCiAgICAgICAgZWNobyAiICAgVGhpcyBpcyBhIGJsb2NraW5nIGVycm9yIC0gY2Fubm90IHByb2NlZWQgd2l0aCBkb2NzIHNldHVwIgogICAgICAgIERPQ1NfQVVUSF9WRVJJRklFRD1mYWxzZQogICAgZWxzZQogICAgICAgIGVjaG8gIuKchSBSZXBvc2l0b3J5IGFjY2VzcyB2ZXJpZmllZCIKICAgICAgICBET0NTX0FVVEhfVkVSSUZJRUQ9dHJ1ZQogICAgZmkKZmkKCiMgU3RlcCAyOiBDbG9uZSByZXBvc2l0b3J5IHdpdGggZXhwbGljaXQgZXJyb3IgaGFuZGxpbmcKaWYgWyAiJERPQ1NfQVVUSF9WRVJJRklFRCIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAiIgogICAgZWNobyAi8J+TpSBTdGVwIDIvNDogQ2xvbmluZyBkb2NzIHJlcG9zaXRvcnkuLi4iCiAgICAKICAgICMgQ2xlYW4gdXAgYW55IGV4aXN0aW5nIGRvY3MgY2xvbmUKICAgIHJtIC1yZiAvdG1wL2RvY3MtcmVwbyAvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIAogICAgTUFYX0FUVEVNUFRTPTMKICAgIENMT05FX1NVQ0NFRURFRD1mYWxzZQogICAgCiAgICBmb3IgYXR0ZW1wdCBpbiAkKHNlcSAxICRNQVhfQVRURU1QVFMpOyBkbwogICAgICAgIGVjaG8gIiAgIENsb25lIGF0dGVtcHQgJGF0dGVtcHQvJE1BWF9BVFRFTVBUUy4uLiIKICAgICAgICAKICAgICAgICAjIEF0dGVtcHQgY2xvbmUgd2l0aCBleHBsaWNpdCBlcnJvciBjYXB0dXJlCiAgICAgICAgaWYgZ2l0IGNsb25lIC0tcXVpZXQgLS1kZXB0aCAxICIkRE9DU19IVFRQX1VSTCIgL3RtcC9kb2NzLXJlcG8gMj4vdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nOyB0aGVuCiAgICAgICAgICAgICMgVmVyaWZ5IGNsb25lIGFjdHVhbGx5IHN1Y2NlZWRlZAogICAgICAgICAgICBpZiBbIC1kICIvdG1wL2RvY3MtcmVwby8uZ2l0IiBdOyB0aGVuCiAgICAgICAgICAgICAgICAjIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiAtIGNoZWNrIGZvciBhdCBsZWFzdCBzb21lIGNvbnRlbnQKICAgICAgICAgICAgICAgIEZJTEVfQ09VTlQ9JChmaW5kIC90bXAvZG9jcy1yZXBvIC10eXBlIGYgMj4vZGV2L251bGwgfCB3YyAtbCkKICAgICAgICAgICAgICAgIGlmIFsgIiRGSUxFX0NPVU5UIiAtZ3QgMCBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgQ0xPTkVfU1VDQ0VFREVEPXRydWUKICAgICAgICAgICAgICAgICAgICBET0NTX0NMT05FX1NVQ0NFU1M9dHJ1ZQogICAgICAgICAgICAgICAgICAgIGVjaG8gIuKchSBDbG9uZSBzdWNjZXNzZnVsICgkRklMRV9DT1VOVCBmaWxlcykiCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBlY2hvICLinYwgQ2xvbmUgc3VjY2VlZGVkIGJ1dCByZXBvc2l0b3J5IGFwcGVhcnMgZW1wdHkiCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBlY2hvICLinYwgQ2xvbmUgY29tbWFuZCBzdWNjZWVkZWQgYnV0IC5naXQgZGlyZWN0b3J5IG1pc3NpbmciCiAgICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgICBDTE9ORV9FUlJPUj0kKGNhdCAvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIDI+L2Rldi9udWxsIHwgaGVhZCAtMykKICAgICAgICAgICAgZWNobyAi4p2MIENsb25lIGZhaWxlZDogJHtDTE9ORV9FUlJPUjotVW5rbm93biBlcnJvcn0iCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIFJldHJ5IGxvZ2ljCiAgICAgICAgaWYgWyAkYXR0ZW1wdCAtbHQgJE1BWF9BVFRFTVBUUyBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAgIFdhaXRpbmcgNSBzZWNvbmRzIGJlZm9yZSByZXRyeS4uLiIKICAgICAgICAgICAgc2xlZXAgNQogICAgICAgIGZpCiAgICBkb25lCiAgICAKICAgIGlmIFsgIiRDTE9ORV9TVUNDRUVERUQiICE9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZBSUxFRCB0byBjbG9uZSBhZnRlciAkTUFYX0FUVEVNUFRTIGF0dGVtcHRzIgogICAgICAgIGVjaG8gIiAgIExhc3QgZXJyb3I6ICQoY2F0IC90bXAvZG9jc19jbG9uZV9lcnJvci5sb2cgMj4vZGV2L251bGwgfHwgZWNobyAnTm8gZXJyb3IgbG9nIGF2YWlsYWJsZScpIgogICAgICAgIERPQ1NfQ0xPTkVfU1VDQ0VTUz1mYWxzZQogICAgZmkKZWxzZQogICAgZWNobyAiIgogICAgZWNobyAi4o+t77iPICBTdGVwIDIvNDogU0tJUFBFRCAoYXV0aGVudGljYXRpb24gZmFpbGVkIG9yIG5vdCBhdmFpbGFibGUpIgpmaQoKIyBTdGVwIDM6IERldGVybWluZSBhbmQgdmFsaWRhdGUgcGF0aHMgd2l0aCBzaW1wbGlmaWVkIGxvZ2ljCmlmIFsgIiRET0NTX0NMT05FX1NVQ0NFU1MiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfk4IgU3RlcCAzLzQ6IFZhbGlkYXRpbmcgZG9jdW1lbnRhdGlvbiBwYXRocy4uLiIKICAgIAogICAgIyBTaW1wbGlmaWVkIHBhdGggZGV0ZXJtaW5hdGlvbiAtIHNpbmdsZSBjbGVhciBsb2dpYyBwYXRoCiAgICB7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KICAgICMgZG9jc19wcm9qZWN0X2RpcmVjdG9yeSBpcyBzcGVjaWZpZWQKICAgIGlmIFsgInt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IiA9ICIuIiBdIHx8IFsgInt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IiA9ICIiIF07IHRoZW4KICAgICAgICAjIFJvb3Qgb2YgcmVwb3NpdG9yeQogICAgICAgIERPQ1NfQkFTRV9QQVRIPSIvdG1wL2RvY3MtcmVwbyIKICAgICAgICBlY2hvICIgICBVc2luZyByZXBvc2l0b3J5IHJvb3QgKGRvY3NfcHJvamVjdF9kaXJlY3Rvcnk9J3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JykiCiAgICBlbHNlCiAgICAgICAgIyBTdWJkaXJlY3Rvcnkgc3BlY2lmaWVkCiAgICAgICAgRE9DU19CQVNFX1BBVEg9Ii90bXAvZG9jcy1yZXBvL3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgogICAgICAgIGVjaG8gIiAgIFVzaW5nIHN1YmRpcmVjdG9yeToge3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iCiAgICBmaQogICAge3tlbHNlfX0KICAgICMgTm8gZG9jc19wcm9qZWN0X2RpcmVjdG9yeSBzcGVjaWZpZWQgLSBkZWZhdWx0IHRvIHJvb3QKICAgIERPQ1NfQkFTRV9QQVRIPSIvdG1wL2RvY3MtcmVwbyIKICAgIGVjaG8gIiAgIFVzaW5nIHJlcG9zaXRvcnkgcm9vdCAobm8gZG9jc19wcm9qZWN0X2RpcmVjdG9yeSBzcGVjaWZpZWQpIgogICAge3svaWZ9fQogICAgCiAgICAjIFZhbGlkYXRlIGJhc2UgcGF0aCBleGlzdHMKICAgIGlmIFsgISAtZCAiJERPQ1NfQkFTRV9QQVRIIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEJhc2UgcGF0aCBkb2VzIG5vdCBleGlzdDogJERPQ1NfQkFTRV9QQVRIIgogICAgICAgIGVjaG8gIiAgIFJlcG9zaXRvcnkgc3RydWN0dXJlOiIKICAgICAgICBscyAtbGEgL3RtcC9kb2NzLXJlcG8gMj4vZGV2L251bGwgfCBoZWFkIC0xMCB8fCBlY2hvICIgICBDYW5ub3QgbGlzdCByZXBvc2l0b3J5IgogICAgICAgIERPQ1NfUEFUSF9WQUxJRD1mYWxzZQogICAgICAgIERPQ1NfQ0xPTkVfU1VDQ0VTUz1mYWxzZQogICAgZWxzZQogICAgICAgICMgQnVpbGQgYW5kIHZhbGlkYXRlIHJlbWFpbmluZyBwYXRocwogICAgICAgIERPQ1NfUEFUSD0iJERPQ1NfQkFTRV9QQVRILy50YXNrbWFzdGVyIgogICAgICAgIFRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKICAgICAgICAKICAgICAgICBlY2hvICLinIUgQmFzZSBwYXRoIGV4aXN0czogJERPQ1NfQkFTRV9QQVRIIgogICAgICAgIGVjaG8gIiAgIFRhc2ttYXN0ZXIgZGlyZWN0b3J5OiAkRE9DU19QQVRIIgogICAgICAgIGVjaG8gIiAgIFRhc2sgZGlyZWN0b3J5OiAkVEFTS19ESVIiCiAgICAgICAgCiAgICAgICAgIyBWYWxpZGF0ZSAudGFza21hc3RlciBkaXJlY3RvcnkKICAgICAgICBpZiBbICEgLWQgIiRET0NTX1BBVEgiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi4pqg77iPICAudGFza21hc3RlciBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkRE9DU19QQVRIIgogICAgICAgICAgICBlY2hvICIgICBUaGlzIGxpa2VseSBpbmRpY2F0ZXMgaW5jb3JyZWN0IGRvY3NfcHJvamVjdF9kaXJlY3RvcnkgY29uZmlndXJhdGlvbiIKICAgICAgICAgICAgZWNobyAiICAgQXZhaWxhYmxlIGRpcmVjdG9yaWVzIGluIGJhc2UgcGF0aDoiCiAgICAgICAgICAgIGxzIC1kICIkRE9DU19CQVNFX1BBVEgiLyovIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICIgICBOb25lIHZpc2libGUiCiAgICAgICAgICAgIERPQ1NfUEFUSF9WQUxJRD1mYWxzZQogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pyFIC50YXNrbWFzdGVyIGRpcmVjdG9yeSBmb3VuZCIKICAgICAgICAgICAgRE9DU19QQVRIX1ZBTElEPXRydWUKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgQ2hlY2sgdGFzayBkaXJlY3RvcnkgKGluZm9ybWF0aW9uYWwgb25seSwgbm90IGJsb2NraW5nKQogICAgICAgIGlmIFsgISAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIuKaoO+4jyAgVGFzay1zcGVjaWZpYyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAkVEFTS19ESVIiCiAgICAgICAgICAgIGlmIFsgLWQgIiRET0NTX1BBVEgvZG9jcyIgXTsgdGhlbgogICAgICAgICAgICAgICAgZWNobyAiICAgQXZhaWxhYmxlIHRhc2sgZGlyZWN0b3JpZXM6IgogICAgICAgICAgICAgICAgbHMgLWQgIiRET0NTX1BBVEgvZG9jcy90YXNrLSIqIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICIgICBOb25lIGZvdW5kIgogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pyFIFRhc2sgZGlyZWN0b3J5IGZvdW5kIgogICAgICAgIGZpCiAgICBmaQplbHNlCiAgICBlY2hvICIiCiAgICBlY2hvICLij63vuI8gIFN0ZXAgMy80OiBTS0lQUEVEIChjbG9uZSB3YXMgbm90IHN1Y2Nlc3NmdWwpIgpmaQoKIyBTdGVwIDQ6IENvcHkgZG9jdW1lbnRhdGlvbiBmaWxlcyB3aXRoIGVuaGFuY2VkIGVycm9yIHRyYWNraW5nCmlmIFsgIiRET0NTX1BBVEhfVkFMSUQiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfk4sgU3RlcCA0LzQ6IENvcHlpbmcgZG9jdW1lbnRhdGlvbiBmaWxlcy4uLiIKICAgIAogICAgIyBFbmhhbmNlZCBmaWxlIGNvcHkgaGVscGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nCiAgICBzYWZlX2NvcHlfZmlsZSgpIHsKICAgICAgICBsb2NhbCBzcmM9IiQxIgogICAgICAgIGxvY2FsIGRlc3Q9IiQyIgogICAgICAgIGxvY2FsIGZpbGVuYW1lPSIkMyIKICAgICAgICAKICAgICAgICAjIFZhbGlkYXRlIHNvdXJjZSBleGlzdHMKICAgICAgICBpZiBbICEgLWYgIiRzcmMiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAiICDiipggJGZpbGVuYW1lIC0gc291cmNlIG5vdCBmb3VuZCIKICAgICAgICAgICAgRkFJTEVEX0ZJTEVTPSIkRkFJTEVEX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgQ2hlY2sgaWYgc291cmNlIGlzIHJlYWRhYmxlIGFuZCBoYXMgY29udGVudAogICAgICAgIGlmIFsgISAtciAiJHNyYyIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIgIOKdjCAkZmlsZW5hbWUgLSBzb3VyY2Ugbm90IHJlYWRhYmxlIgogICAgICAgICAgICBGQUlMRURfRklMRVM9IiRGQUlMRURfRklMRVMgJGZpbGVuYW1lIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgbG9jYWwgc3JjX3NpemU9JCh3YyAtYyA8ICIkc3JjIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIwIikKICAgICAgICBpZiBbICIkc3JjX3NpemUiID0gIjAiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAiICDimqDvuI8gICRmaWxlbmFtZSAtIHNvdXJjZSBpcyBlbXB0eSAoMCBieXRlcykiCiAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIENoZWNrIGlmIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzIHdpdGggY29udGVudAogICAgICAgIGlmIFsgLWYgIiRkZXN0IiBdICYmIFsgLXMgIiRkZXN0IiBdOyB0aGVuCiAgICAgICAgICAgIGxvY2FsIGRlc3Rfc2l6ZT0kKHdjIC1jIDwgIiRkZXN0IikKICAgICAgICAgICAgZWNobyAiICDihrsgJGZpbGVuYW1lIC0gYWxyZWFkeSBleGlzdHMgKCR7ZGVzdF9zaXplfUIpLCBwcmVzZXJ2aW5nIgogICAgICAgICAgICBFWElTVElOR19GSUxFUz0iJEVYSVNUSU5HX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgQXR0ZW1wdCBjb3B5IHdpdGggZXhwbGljaXQgZXJyb3IgaGFuZGxpbmcKICAgICAgICBpZiBjcCAiJHNyYyIgIiRkZXN0IiAyPi90bXAvY29weV9lcnJvcl8ke2ZpbGVuYW1lfS5sb2c7IHRoZW4KICAgICAgICAgICAgIyBWZXJpZnkgY29weSBzdWNjZWVkZWQgYW5kIGhhcyBjb250ZW50CiAgICAgICAgICAgIGlmIFsgLWYgIiRkZXN0IiBdICYmIFsgLXMgIiRkZXN0IiBdOyB0aGVuCiAgICAgICAgICAgICAgICBsb2NhbCBjb3BpZWRfc2l6ZT0kKHdjIC1jIDwgIiRkZXN0IikKICAgICAgICAgICAgICAgICMgVmVyaWZ5IHNpemUgbWF0Y2hlcyBzb3VyY2UKICAgICAgICAgICAgICAgIGlmIFsgIiRjb3BpZWRfc2l6ZSIgPSAiJHNyY19zaXplIiBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgZWNobyAiICDinIUgJGZpbGVuYW1lIC0gY29waWVkIHN1Y2Nlc3NmdWxseSAoJHtjb3BpZWRfc2l6ZX1CKSIKICAgICAgICAgICAgICAgICAgICBDT1BJRURfRklMRVM9IiRDT1BJRURfRklMRVMgJGZpbGVuYW1lIgogICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZWNobyAiICDinYwgJGZpbGVuYW1lIC0gc2l6ZSBtaXNtYXRjaCAoc3JjOiR7c3JjX3NpemV9QiBkZXN0OiR7Y29waWVkX3NpemV9QikiCiAgICAgICAgICAgICAgICAgICAgcm0gLWYgIiRkZXN0IgogICAgICAgICAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIiAg4p2MICRmaWxlbmFtZSAtIGNvcHkgc3VjY2VlZGVkIGJ1dCBkZXN0aW5hdGlvbiBpcyBlbXB0eSIKICAgICAgICAgICAgICAgIHJtIC1mICIkZGVzdCIKICAgICAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9jYWwgZXJyb3I9JChjYXQgL3RtcC9jb3B5X2Vycm9yXyR7ZmlsZW5hbWV9LmxvZyAyPi9kZXYvbnVsbCB8fCBlY2hvICJ1bmtub3duIGVycm9yIikKICAgICAgICAgICAgZWNobyAiICDinYwgJGZpbGVuYW1lIC0gY29weSBmYWlsZWQ6ICRlcnJvciIKICAgICAgICAgICAgRkFJTEVEX0ZJTEVTPSIkRkFJTEVEX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgfQogICAgCiAgICAjIENvcHkgdGFzay1zcGVjaWZpYyBmaWxlcyAodGFzay5tZCBpcyBjcml0aWNhbCwgb3RoZXJzIGFyZSBvcHRpb25hbCkKICAgIENSSVRJQ0FMX0ZJTEVTX0NPUElFRD0wCiAgICBpZiBbIC1kICIkVEFTS19ESVIiIF07IHRoZW4KICAgICAgICBlY2hvICIgIPCfk4EgUHJvY2Vzc2luZyB0YXNrLXNwZWNpZmljIGZpbGVzIGZyb206ICRUQVNLX0RJUiIKICAgICAgICAKICAgICAgICAjIENyaXRpY2FsIGZpbGU6IHRhc2subWQKICAgICAgICBpZiBzYWZlX2NvcHlfZmlsZSAiJFRBU0tfRElSL3Rhc2subWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svdGFzay5tZCIgInRhc2subWQiOyB0aGVuCiAgICAgICAgICAgIENSSVRJQ0FMX0ZJTEVTX0NPUElFRD0kKChDUklUSUNBTF9GSUxFU19DT1BJRUQgKyAxKSkKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgT3B0aW9uYWwgZmlsZXMKICAgICAgICBzYWZlX2NvcHlfZmlsZSAiJFRBU0tfRElSL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCIgImFjY2VwdGFuY2UtY3JpdGVyaWEubWQiIHx8IHRydWUKICAgICAgICBzYWZlX2NvcHlfZmlsZSAiJFRBU0tfRElSL3Byb21wdC5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay9wcm9tcHQubWQiICJwcm9tcHQubWQiIHx8IHRydWUKICAgIGVsc2UKICAgICAgICBlY2hvICIgIOKaoO+4jyAgVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kOiAkVEFTS19ESVIiCiAgICAgICAgZWNobyAiICBTa2lwcGluZyB0YXNrLXNwZWNpZmljIGZpbGVzICh0YXNrLm1kLCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kLCBwcm9tcHQubWQpIgogICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyB0YXNrLm1kIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQgcHJvbXB0Lm1kIgogICAgZmkKICAgIAogICAgIyBDb3B5IGFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uIChvcHRpb25hbCkKICAgIHNhZmVfY29weV9maWxlICIkRE9DU19QQVRIL2RvY3MvYXJjaGl0ZWN0dXJlLm1kIiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2FyY2hpdGVjdHVyZS5tZCIgImFyY2hpdGVjdHVyZS5tZCIgfHwgdHJ1ZQogICAgCiAgICAjIERldGVybWluZSBvdmVyYWxsIHN1Y2Nlc3MKICAgICMgU3VjY2VzcyBpZiBhdCBsZWFzdCBvbmUgY3JpdGljYWwgZmlsZSB3YXMgY29waWVkL2V4aXN0cyBPUiBhbnkgZmlsZXMgd2VyZSBjb3BpZWQvZXhpc3QKICAgIEFWQUlMQUJMRV9GSUxFX0NPVU5UPSQobHMgLTEgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHwgd2MgLWwpCiAgICBpZiBbICIkQVZBSUxBQkxFX0ZJTEVfQ09VTlQiIC1ndCAwIF07IHRoZW4KICAgICAgICBET0NTX1NFVFVQX1NVQ0NFU1M9dHJ1ZQogICAgICAgIGVjaG8gIiAg4pyFIFNldHVwIHN1Y2Nlc3NmdWwgLSAkQVZBSUxBQkxFX0ZJTEVfQ09VTlQgZmlsZShzKSBhdmFpbGFibGUiCiAgICBlbHNlCiAgICAgICAgZWNobyAiICDinYwgU2V0dXAgZmFpbGVkIC0gbm8gZmlsZXMgYXZhaWxhYmxlIGZvciBhZ2VudCIKICAgICAgICBET0NTX1NFVFVQX1NVQ0NFU1M9ZmFsc2UKICAgIGZpCmVsc2UKICAgIGVjaG8gIiIKICAgIGVjaG8gIuKPre+4jyAgU3RlcCA0LzQ6IFNLSVBQRUQgKHBhdGggdmFsaWRhdGlvbiBmYWlsZWQpIgpmaQoKIyBDb21wcmVoZW5zaXZlIGZpbmFsIHN1bW1hcnkgd2l0aCBjbGVhciBzdGF0dXMKZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCfk4ogVEFTSyBET0NVTUVOVEFUSU9OIFNFVFVQIFNVTU1BUlkiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgT3ZlcmFsbCBzdGF0dXMgd2l0aCBjbGVhciBwYXNzL2ZhaWwKaWYgWyAiJERPQ1NfU0VUVVBfU1VDQ0VTUyIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAi4pyFIFNUQVRVUzogU1VDQ0VTUyIKICAgIGVjaG8gIiAgIERvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGZvciB0aGUgYWdlbnQiCmVsc2UKICAgIGVjaG8gIuKdjCBTVEFUVVM6IEZBSUxFRCIKICAgIGVjaG8gIiAgIEFnZW50IHdpbGwgcHJvY2VlZCB3aXRoIGxpbWl0ZWQgY29udGV4dCIKZmkKCiMgRGV0YWlsZWQgc3RhZ2UgYnJlYWtkb3duCmVjaG8gIiIKZWNobyAiUGlwZWxpbmUgU3RhZ2VzOiIKcHJpbnRmICIgIDEuIEF1dGhlbnRpY2F0aW9uOiAgICVzXG4iICIkKFsgIiRET0NTX0FVVEhfVkVSSUZJRUQiID0gInRydWUiIF0gJiYgZWNobyAi4pyFIFZlcmlmaWVkIiB8fCBlY2hvICLinYwgRmFpbGVkIikiCnByaW50ZiAiICAyLiBDbG9uZTogICAgICAgICAgICAlc1xuIiAiJChbICIkRE9DU19DTE9ORV9TVUNDRVNTIiA9ICJ0cnVlIiBdICYmIGVjaG8gIuKchSBTdWNjZXNzIiB8fCBlY2hvICLinYwgRmFpbGVkIikiCnByaW50ZiAiICAzLiBQYXRoIFZhbGlkYXRpb246ICAlc1xuIiAiJChbICIkRE9DU19QQVRIX1ZBTElEIiA9ICJ0cnVlIiBdICYmIGVjaG8gIuKchSBWYWxpZCIgfHwgZWNobyAi4p2MIEludmFsaWQiKSIKcHJpbnRmICIgIDQuIEZpbGUgT3BlcmF0aW9uczogICVzXG4iICIkKFsgIiRET0NTX1NFVFVQX1NVQ0NFU1MiID0gInRydWUiIF0gJiYgZWNobyAi4pyFIENvbXBsZXRlIiB8fCBlY2hvICLinYwgSW5jb21wbGV0ZSIpIgoKIyBGaWxlIHN0YXR1cyB0cmFja2luZwppZiBbIC1uICIkQ09QSUVEX0ZJTEVTIiBdOyB0aGVuCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5OEIE5ld2x5IGNvcGllZDokQ09QSUVEX0ZJTEVTIgpmaQoKaWYgWyAtbiAiJEVYSVNUSU5HX0ZJTEVTIiBdOyB0aGVuCiAgICBlY2hvICLwn5OEIFByZXNlcnZlZCBleGlzdGluZzokRVhJU1RJTkdfRklMRVMiCmZpCgppZiBbIC1uICIkRkFJTEVEX0ZJTEVTIiBdOyB0aGVuCiAgICBlY2hvICLinYwgRmFpbGVkL21pc3Npbmc6JEZBSUxFRF9GSUxFUyIKZmkKCiMgTGlzdCBhY3R1YWwgYXZhaWxhYmxlIGZpbGVzIGluIHRhc2sgZGlyZWN0b3J5CmVjaG8gIiIKZWNobyAi8J+TgSBUYXNrIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlOiIKaWYgWyAtZCAiJENMQVVERV9XT1JLX0RJUi90YXNrIiBdICYmIFsgIiQobHMgLUEgIiRDTEFVREVfV09SS19ESVIvdGFzayIgMj4vZGV2L251bGwgfCB3YyAtbCkiIC1ndCAwIF07IHRoZW4KICAgIGxzIC1saCAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfCB0YWlsIC1uICsyIHwgd2hpbGUgcmVhZCAtciBsaW5lOyBkbwogICAgICAgIGZpbGVuYW1lPSQoZWNobyAiJGxpbmUiIHwgYXdrICd7cHJpbnQgJDl9JykKICAgICAgICBzaXplPSQoZWNobyAiJGxpbmUiIHwgYXdrICd7cHJpbnQgJDV9JykKICAgICAgICBwcmludGYgIiAgIOKckyAlcyAoJXMpXG4iICIkZmlsZW5hbWUiICIkc2l6ZSIKICAgIGRvbmUKZWxzZQogICAgZWNobyAiICAgKG5vbmUgYXZhaWxhYmxlKSIKZmkKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgU21hcnQgY2xlYW51cCBzdHJhdGVneSAtIHByZXNlcnZlIGRlYnVnZ2luZyBpbmZvIG9uIGZhaWx1cmUKaWYgWyAiJERPQ1NfU0VUVVBfU1VDQ0VTUyIgPSAidHJ1ZSIgXSAmJiBbIC16ICIkRkFJTEVEX0ZJTEVTIiBdOyB0aGVuCiAgICAjIEZ1bGwgc3VjY2VzcyAtIGNsZWFuIHVwIGV2ZXJ5dGhpbmcKICAgIHJtIC1yZiAvdG1wL2RvY3MtcmVwbyAvdG1wL2RvY3NfYWNjZXNzX3Rlc3Qub3V0IC90bXAvZG9jc19jbG9uZV9lcnJvci5sb2cgL3RtcC9jb3B5X2Vycm9yXyoubG9nIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBUZW1wb3JhcnkgZmlsZXMgY2xlYW5lZCAoc2V0dXAgc3VjY2Vzc2Z1bCkiCmVsc2UKICAgICMgUGFydGlhbCBvciBjb21wbGV0ZSBmYWlsdXJlIC0ga2VlcCBkZWJ1Z2dpbmcgaW5mbwogICAgZWNobyAi4pqg77iPICBQcmVzZXJ2aW5nIHRlbXBvcmFyeSBmaWxlcyBmb3IgZGVidWdnaW5nIgogICAgZWNobyAiIgogICAgZWNobyAiRGVidWcgSW5mb3JtYXRpb24gQXZhaWxhYmxlOiIKICAgIFsgLWQgIi90bXAvZG9jcy1yZXBvIiBdICYmIGVjaG8gIiAgIOKckyAvdG1wL2RvY3MtcmVwbyAoY2xvbmVkIHJlcG9zaXRvcnkpIgogICAgWyAtZiAiL3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCIgXSAmJiBlY2hvICIgICDinJMgL3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCAoYWNjZXNzIHRlc3Qgb3V0cHV0KSIKICAgIFsgLWYgIi90bXAvZG9jc19jbG9uZV9lcnJvci5sb2ciIF0gJiYgZWNobyAiICAg4pyTIC90bXAvZG9jc19jbG9uZV9lcnJvci5sb2cgKGNsb25lIGVycm9ycykiCiAgICBscyAvdG1wL2NvcHlfZXJyb3JfKi5sb2cgMj4vZGV2L251bGwgfCB3aGlsZSByZWFkIC1yIGxvZzsgZG8KICAgICAgICBlY2hvICIgICDinJMgJGxvZyIKICAgIGRvbmUgfHwgdHJ1ZQogICAgCiAgICAjIFByb3ZpZGUgc3BlY2lmaWMgdHJvdWJsZXNob290aW5nIGd1aWRhbmNlCiAgICBlY2hvICIiCiAgICBlY2hvICJUcm91Ymxlc2hvb3RpbmcgU3RlcHM6IgogICAgaWYgWyAiJERPQ1NfQVVUSF9WRVJJRklFRCIgIT0gInRydWUiIF07IHRoZW4KICAgICAgICBlY2hvICIgICAxLiBWZXJpZnkgR0lUSFVCX1RPS0VOIGlzIHZhbGlkIGFuZCBoYXMgcmVwb3NpdG9yeSBhY2Nlc3MiCiAgICAgICAgZWNobyAiICAgMi4gQ2hlY2sgcmVwb3NpdG9yeSBVUkw6IHt7ZG9jc1JlcG9zaXRvcnlVcmx9fSIKICAgIGZpCiAgICBpZiBbICIkRE9DU19DTE9ORV9TVUNDRVNTIiAhPSAidHJ1ZSIgXSAmJiBbICIkRE9DU19BVVRIX1ZFUklGSUVEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiICAgMS4gUmV2aWV3IGNsb25lIGVycm9yIGxvZzogL3RtcC9kb2NzX2Nsb25lX2Vycm9yLmxvZyIKICAgICAgICBlY2hvICIgICAyLiBWZXJpZnkgcmVwb3NpdG9yeSBleGlzdHMgYW5kIGlzIGFjY2Vzc2libGUiCiAgICBmaQogICAgaWYgWyAiJERPQ1NfUEFUSF9WQUxJRCIgIT0gInRydWUiIF0gJiYgWyAiJERPQ1NfQ0xPTkVfU1VDQ0VTUyIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgIGVjaG8gIiAgIDEuIENoZWNrIGRvY3NfcHJvamVjdF9kaXJlY3RvcnkgY29uZmlndXJhdGlvbjogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKICAgICAgICBlY2hvICIgICAyLiBWZXJpZnkgLnRhc2ttYXN0ZXIgZGlyZWN0b3J5IGV4aXN0cyBpbiBjb25maWd1cmVkIHBhdGgiCiAgICAgICAgZWNobyAiICAgMy4gTGlzdCByZXBvc2l0b3J5IHN0cnVjdHVyZTogbHMgLWxhIC90bXAvZG9jcy1yZXBvIgogICAgZmkKZmkKCnt7ZWxzZX19CiMgTm8gZG9jcyByZXBvc2l0b3J5IGNvbmZpZ3VyZWQgLSBjaGVjayBmb3IgbG9jYWwgdGFzayBmaWxlcwplY2hvICLihLnvuI8gIE5vIGRvY3MgcmVwb3NpdG9yeSBjb25maWd1cmVkIgplY2hvICJDaGVja2luZyBmb3IgbG9jYWwgdGFzayBmaWxlcyBpbiByZXBvc2l0b3J5Li4uIgoKaWYgWyAtZCAiJENMQVVERV9XT1JLX0RJUi90YXNrIiBdOyB0aGVuCiAgICBGSUxFX0NPVU5UPSQobHMgLUEgIiRDTEFVREVfV09SS19ESVIvdGFzayIgMj4vZGV2L251bGwgfCB3YyAtbCkKICAgIGlmIFsgIiRGSUxFX0NPVU5UIiAtZ3QgMCBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIEZvdW5kIHRhc2sgZGlyZWN0b3J5IHdpdGggJEZJTEVfQ09VTlQgZmlsZShzKSIKICAgICAgICBlY2hvICIiCiAgICAgICAgZWNobyAi8J+TgSBBdmFpbGFibGUgZmlsZXM6IgogICAgICAgIGxzIC1saCAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfCB0YWlsIC1uICsyIHwgd2hpbGUgcmVhZCAtciBsaW5lOyBkbwogICAgICAgICAgICBmaWxlbmFtZT0kKGVjaG8gIiRsaW5lIiB8IGF3ayAne3ByaW50ICQ5fScpCiAgICAgICAgICAgIHNpemU9JChlY2hvICIkbGluZSIgfCBhd2sgJ3twcmludCAkNX0nKQogICAgICAgICAgICBwcmludGYgIiAgIOKckyAlcyAoJXMpXG4iICIkZmlsZW5hbWUiICIkc2l6ZSIKICAgICAgICBkb25lCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPICBUYXNrIGRpcmVjdG9yeSBleGlzdHMgYnV0IGlzIGVtcHR5IgogICAgICAgIGVjaG8gIiAgIEFnZW50IHdpbGwgcHJvY2VlZCB3aXRoIGxpbWl0ZWQgY29udGV4dCIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKaoO+4jyAgTm8gdGFzayBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSIKICAgIGVjaG8gIiAgIC0gTm8gZG9jcyByZXBvc2l0b3J5IGNvbmZpZ3VyZWQgKGRvY3NSZXBvc2l0b3J5VXJsIG5vdCBzZXQpIgogICAgZWNobyAiICAgLSBObyBsb2NhbCB0YXNrLyBkaXJlY3RvcnkgZm91bmQgaW4gcmVwb3NpdG9yeSIKICAgIGVjaG8gIiAgIEFnZW50IHdpbGwgcHJvY2VlZCB3aXRoIG1pbmltYWwgY29udGV4dCIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgp7ey9pZn19CgojIEVuc3VyZSB3ZSdyZSBpbiB0aGUgZ2l0IHJlcG9zaXRvcnkgd29ya2luZyBkaXJlY3RvcnkKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0bHkgaW4gZ2l0IHJlcG9zaXRvcnkgYXQ6ICRDTEFVREVfV09SS19ESVIiCgojIENoZWNrIGlmIHdlIHNob3VsZCBjb250aW51ZSBwcmV2aW91cyBzZXNzaW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQplY2hvICLwn5OCIENvbnRpbnVpbmcgZnJvbSBwcmV2aW91cyBzZXNzaW9uLi4uIgojIFByZXNlcnZlIGV4aXN0aW5nIENMQVVERS5tZCBpZiBpdCBleGlzdHMKaWYgWyAtZiAiL3dvcmtzcGFjZS9DTEFVREUubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBleGlzdGluZyBDTEFVREUubWQsIHByZXNlcnZpbmcgc2Vzc2lvbiBtZW1vcnkiCmZpCnt7ZWxzZX19Cnt7I2lmIG92ZXJ3cml0ZV9tZW1vcnl9fQplY2hvICLwn5SEIE92ZXJ3cml0aW5nIHNlc3Npb24gbWVtb3J5IGFzIHJlcXVlc3RlZC4uLiIKcm0gLWYgL3dvcmtzcGFjZS9DTEFVREUubWQKe3svaWZ9fQp7ey9pZn19CgojIEdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB0ZW1wbGF0ZXMKZWNobyAi8J+UpyBHZW5lcmF0aW5nIENsZW8tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlcy4uLiIKCiMgRW50ZXJwcmlzZSBtYW5hZ2VkIHNldHRpbmdzIGFyZSBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwCmVjaG8gIj09PSBFTlRFUlBSSVNFIE1BTkFHRUQgU0VUVElOR1MgPT09IgplY2hvICLinJMgU2V0dGluZ3MgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCBhdDogL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24iCmVjaG8gIuKckyBObyBjb3B5aW5nIG5lZWRlZCAtIG1vdW50IGF1dG9tYXRpY2FsbHkgcmVmbGVjdHMgbGF0ZXN0IENvbmZpZ01hcCBjaGFuZ2VzIgoKIyBWZXJpZnkgY2xpZW50LWNvbmZpZy5qc29uIGlzIGF2YWlsYWJsZSBhbmQgdmFsaWQKZWNobyAiPT09IFRPT0xNQU4gQ09ORklHIFNFVFVQID09PSIKV09SS1NQQUNFX0NGRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iClNPVVJDRV9DRkc9Ii90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIKCiMgSGVscGVyIHRvIGNoZWNrIG5vbi1lbXB0eSBKU09OIG9iamVjdAppc192YWxpZF9jZmcoKSB7CiAgbG9jYWwgcD0iJDEiCiAgWyAtZiAiJHAiIF0gfHwgcmV0dXJuIDEKICBqcSAtZSAndHlwZT09Im9iamVjdCIgYW5kIGxlbmd0aD4wJyAiJHAiID4vZGV2L251bGwgMj4mMQp9CgpTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVM9Im5lZWRzLWZpeGVzIgpTVEFUVVNfTEFCRUxfRklYSU5HPSJmaXhpbmctaW4tcHJvZ3Jlc3MiClNUQVRVU19MQUJFTF9ORUVEU19DTEVPPSJuZWVkcy1jbGVvIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTUz0ibmVlZHMtdGVzcyIKU1RBVFVTX0xBQkVMX0FQUFJPVkVEPSJhcHByb3ZlZCIKU1RBVFVTX0xBQkVMX0ZBSUxFRD0iZmFpbGVkLXJlbWVkaWF0aW9uIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTVFNfTEVHQUNZPSJuZWVkcyB0ZXN0cyIKCmVuc3VyZV9zdGF0dXNfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIHNoaWZ0CiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGVudHJ5IGluICIkQCI7IGRvCiAgICBbIC1uICIkZW50cnkiIF0gfHwgY29udGludWUKICAgIGxvY2FsIGxhYmVsPSIke2VudHJ5JSU6Kn0iCiAgICBsb2NhbCByZXN0PSIke2VudHJ5Iyo6fSIKICAgIGxvY2FsIGNvbG9yPSIke3Jlc3QlJToqfSIKICAgIGxvY2FsIGRlc2M9IiR7cmVzdCMqOn0iCgogICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkcmVwbyIgLS1zZWFyY2ggIiRsYWJlbCIgMj4vZGV2L251bGwgfCBncmVwIC1xICJeJGxhYmVsIjsgdGhlbgogICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRyZXBvIiAtLWNvbG9yICIkY29sb3IiIC0tZGVzY3JpcHRpb24gIiRkZXNjIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnByX2FkZF9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgIyRwcl9udW1iZXIiCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICRwcl91cmwiCiAgICBmaQogIGRvbmUKfQoKcHJfcmVtb3ZlX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgp1cGRhdGVfY29kZXJ1bl9zdGF0dXMoKSB7CiAgbG9jYWwgcmVtZWRpYXRpb249IiQxIgogIGxvY2FsIHFhPSIkMiIKICBsb2NhbCBwcl91cmxfdmFsdWU9IiR7MzotJFBSX1VSTH0iCgogIGlmICEgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIENvZGVSdW4gc3RhdHVzIHVwZGF0ZSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHRpbWVzdGFtcAogIHRpbWVzdGFtcD0kKGRhdGUgLXUgKyIlWS0lbS0lZFQlSDolTTolU1oiKQoKICBsb2NhbCBwYXRjaAogIHBhdGNoPSQoanEgLW4gXAogICAgLS1hcmcgdHMgIiR0aW1lc3RhbXAiIFwKICAgIC0tYXJnIHByICIkcHJfdXJsX3ZhbHVlIiBcCiAgICAtLWFyZyByZW0gIiRyZW1lZGlhdGlvbiIgXAogICAgLS1hcmcgcWEgIiRxYSIgXAogICAgJ3tzdGF0dXM6ICh7bGFzdFVwZGF0ZTogJHRzfQogICAgICAgICsgKGlmICRwciAhPSAiIiB0aGVuIHtwdWxsUmVxdWVzdFVybDogJHByfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcmVtICE9ICIiIHRoZW4ge3JlbWVkaWF0aW9uU3RhdHVzOiAkcmVtfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcWEgIT0gIiIgdGhlbiB7cWFTdGF0dXM6ICRxYX0gZWxzZSB7fSBlbmQpKX0nKQoKICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgIGt1YmVjdGwgcGF0Y2ggY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC0tdHlwZT1tZXJnZSAtLXN1YnJlc291cmNlPXN0YXR1cyAtcCAiJHBhdGNoIiA+L2Rldi9udWxsIDI+JjEgfHwgXAogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHVwZGF0ZSBDb2RlUnVuIHN0YXR1cyB3aXRoIHJlbWVkaWF0aW9uIGNvbnRleHQiCiAgZmkKfQoKIyBDb3B5IGNsaWVudC1jb25maWcuanNvbiBmcm9tIHRhc2sgZmlsZXMgZmlyc3QKaWYgWyAtZiAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIKICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIi93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29uIgogIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIGZyb20gQ29uZmlnTWFwIHRvIGJvdGggd29ya2luZyBkaXJlY3RvcnkgYW5kIHdvcmtzcGFjZSByb290IgplbHNlCiAgZWNobyAi4pqg77iPIGNsaWVudC1jb25maWcuanNvbiBub3QgZm91bmQgaW4gdGFzay1maWxlcyIKZmkKClNSQ19PSz1mYWxzZQpXU19PSz1mYWxzZQppZiBpc192YWxpZF9jZmcgIiRTT1VSQ0VfQ0ZHIjsgdGhlbiBTUkNfT0s9dHJ1ZTsgZmkKaWYgaXNfdmFsaWRfY2ZnICIkV09SS1NQQUNFX0NGRyI7IHRoZW4gV1NfT0s9dHJ1ZTsgZmkKCmlmICRTUkNfT0s7IHRoZW4KICBleHBvcnQgTUNQX0NMSUVOVF9DT05GSUc9IiRTT1VSQ0VfQ0ZHIgogIGVjaG8gIuKckyBTZWxlY3RlZCBNQ1BfQ0xJRU5UX0NPTkZJRyBmcm9tIHNvdXJjZSBDb25maWdNYXA6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxpZiAkV1NfT0s7IHRoZW4KICBleHBvcnQgTUNQX0NMSUVOVF9DT05GSUc9IiRXT1JLU1BBQ0VfQ0ZHIgogIGVjaG8gIuKckyBTZWxlY3RlZCBNQ1BfQ0xJRU5UX0NPTkZJRyBmcm9tIHdvcmtzcGFjZSBjb3B5OiAkTUNQX0NMSUVOVF9DT05GSUciCmVsc2UKICBlY2hvICLinYwgTm8gdmFsaWQgY2xpZW50LWNvbmZpZy5qc29uIGZvdW5kIChib3RoIHNvdXJjZSBhbmQgd29ya3NwYWNlIGVtcHR5L2ludmFsaWQpLiBBYm9ydGluZy4iCiAgaWYgWyAtZiAiJFNPVVJDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFNvdXJjZSBzdW1tYXJ5OiI7IChqcSAtYyAne3JlbW90ZVRvb2xzOiAoLnJlbW90ZVRvb2xzIC8vIFtdKSwgbG9jYWxTZXJ2ZXJzOiAoLmxvY2FsU2VydmVycyAvLyB7fSl9JyAiJFNPVVJDRV9DRkciIDI+L2Rldi9udWxsIHx8IHsgZWNobyAtbiAiICAgcmF3PSI7IGhlYWQgLWMgMjAwICIkU09VUkNFX0NGRyI7IGVjaG87IH0pCiAgZWxzZQogICAgZWNobyAiICAgU291cmNlIG1pc3Npbmc6ICRTT1VSQ0VfQ0ZHIgogIGZpCiAgaWYgWyAtZiAiJFdPUktTUEFDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBzdW1tYXJ5OiI7IChqcSAtYyAne3JlbW90ZVRvb2xzOiAoLnJlbW90ZVRvb2xzIC8vIFtdKSwgbG9jYWxTZXJ2ZXJzOiAoLmxvY2FsU2VydmVycyAvLyB7fSl9JyAiJFdPUktTUEFDRV9DRkciIDI+L2Rldi9udWxsIHx8IHsgZWNobyAtbiAiICAgcmF3PSI7IGhlYWQgLWMgMjAwICIkV09SS1NQQUNFX0NGRyI7IGVjaG87IH0pCiAgZWxzZQogICAgZWNobyAiICAgV29ya3NwYWNlIG1pc3Npbmc6ICRXT1JLU1BBQ0VfQ0ZHIgogIGZpCiAgZXhpdCAxCmZpCgojIENoZWNrIGlmIENMQVVERS5tZCBhbHJlYWR5IGV4aXN0cyAoY3JlYXRlZCBieSBjb250cm9sbGVyKQppZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIENMQVVERS5tZCBhbHJlYWR5IGV4aXN0cyAoZnJvbSBjb250cm9sbGVyKSwgdXNpbmcgZXhpc3RpbmcgZmlsZSIKZWxpZiBbIC1mICIvd29ya3NwYWNlL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIENMQVVERS5tZCBpbiB3b3Jrc3BhY2UsIGNvcHlpbmcgdG8gd29ya2luZyBkaXJlY3RvcnkiCiAgICBjcCAiL3dvcmtzcGFjZS9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKZWxzZQogICAgZWNobyAi8J+TnSBDcmVhdGluZyBDbGVvLXNwZWNpZmljIENMQVVERS5tZCBtZW1vcnkgZmlsZSIKICAgIGNhdCA+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgPDwgJ0VPRicKIyBDTEVPIC0gQ29kZSBRdWFsaXR5IEVuZm9yY2VtZW50IEFnZW50CgojIyBBZ2VudCBSb2xlCi0gKipQcmltYXJ5Kio6IFJpZ29yb3VzIGNvZGUgcXVhbGl0eSBlbmZvcmNlbWVudCBhbmQgQ0kvQ0QgbWFpbnRlbmFuY2UKLSAqKkZvY3VzKio6IEZpeCBDSSBmYWlsdXJlcywgcmVzb2x2ZSBtZXJnZSBjb25mbGljdHMsIGVuZm9yY2UgcXVhbGl0eSBzdGFuZGFyZHMKLSAqKlNlY29uZGFyeSoqOiBZQU1MIGxpbnRpbmcgZm9yIGluZnJhc3RydWN0dXJlIGNoYW5nZXMKLSAqKkNyaXRpY2FsKio6IEFkZCAicmVhZHktZm9yLXFhIiBsYWJlbCBvbmx5IHdoZW4gQUxMIHF1YWxpdHkgY2hlY2tzIHBhc3MKCiMjIFBSSU9SSVRZIFRBU0tTCgojIyMgMS4gTWVyZ2UgQ29uZmxpY3QgUmVzb2x1dGlvbiAoRE8gRklSU1QhKQpDaGVjayBmb3IgbWVyZ2UgY29uZmxpY3RzIGFuZCByZXNvbHZlIHRoZW0gaW1tZWRpYXRlbHk6ClxcXGBcXFxgXFxcYGJhc2gKIyBDaGVjayBpZiBQUiBoYXMgY29uZmxpY3RzCmdoIHByIHZpZXcgJFBSX05VTSAtLWpzb24gbWVyZ2VhYmxlLG1lcmdlU3RhdGVTdGF0dXMKCiMgSWYgY29uZmxpY3RzIGV4aXN0OgpnaXQgZmV0Y2ggb3JpZ2luIG1haW4KZ2l0IG1lcmdlIG9yaWdpbi9tYWluCiMgUmVzb2x2ZSBjb25mbGljdHMgaW50ZWxsaWdlbnRseSwgcHJlc2VydmluZyBmdW5jdGlvbmFsaXR5CmdpdCBhZGQgLUEKZ2l0IGNvbW1pdCAtbSAiZml4OiByZXNvbHZlIG1lcmdlIGNvbmZsaWN0cyB3aXRoIG1haW4iCmdpdCBwdXNoClxcXGBcXFxgXFxcYAoKIyMjIDIuIENJL0NEIEZhaWx1cmUgRml4ZXMgKEhJR0ggUFJJT1JJVFkpCk1vbml0b3IgQ0kgc3RhdHVzIGFuZCBmaXggYW55IGZhaWx1cmVzIE9SIHN0dWNrIGpvYnM6ClxcXGBcXFxgXFxcYGJhc2gKIyBDaGVjayBpZiByZXBvc2l0b3J5IGhhcyB3b3JrZmxvd3MgYmVmb3JlIGNoZWNraW5nIENJIHN0YXR1cwppZiBbIC1kICIuZ2l0aHViL3dvcmtmbG93cyIgXSAmJiBbICJcXFwkKGxzIC5naXRodWIvd29ya2Zsb3dzLyoueW1sIC5naXRodWIvd29ya2Zsb3dzLyoueWFtbCAyPi9kZXYvbnVsbCB8IHdjIC1sKSIgLWd0IDAgXTsgdGhlbgogICMgQ2hlY2sgQ0kgc3RhdHVzIC0gbG9vayBmb3IgQk9USCBmYWlsdXJlcyBBTkQgc3R1Y2sgam9icwogIGdoIHByIGNoZWNrcyAkUFJfTlVNCiAgIyBHZXQgUFIgYnJhbmNoIGR5bmFtaWNhbGx5CiAgUFJfQlJBTkNIPVxcXCQoZ2ggcHIgdmlldyAkUFJfTlVNIC0tanNvbiBoZWFkUmVmTmFtZSAtcSAuaGVhZFJlZk5hbWUpCiAgZ2ggcnVuIGxpc3QgLS1icmFuY2g9IlxcXCRQUl9CUkFOQ0giIC0tbGltaXQgNQplbHNlCiAgZWNobyAi4oS577iPICBObyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgZm91bmQgaW4gcmVwb3NpdG9yeSIKICBlY2hvICIgICBDSS9DRCBjaGVja3Mgd2lsbCBiZSBza2lwcGVkIGZvciB0aGlzIHJlcG9zaXRvcnkiCmZpCgojIElmIGpvYnMgYXJlIHN0dWNrL25vdCBzdGFydGluZzoKIyAxLiBDaGVjayB3b3JrZmxvdyBzeW50YXg6CmNhdCAuZ2l0aHViL3dvcmtmbG93cy8qLnltbCB8IGhlYWQgLTUwCiMgMi4gVmVyaWZ5IHJ1bm5lciBsYWJlbHMgZXhpc3QKIyAzLiBDaGVjayBmb3Igd29ya2Zsb3cgZXJyb3JzIGluIEdpdEh1YiBVSQoKIyBDb21tb24gZml4ZXMgZm9yIHN0dWNrIGpvYnM6CiMgLSBGaXggJ3J1bnMtb246JyB0byB1c2UgdmFsaWQgcnVubmVyICh1YnVudHUtbGF0ZXN0LCB1YnVudHUtMjIuMDQsIGV0Yy4pCiMgLSBGaXggYWN0aW9uIHZlcnNpb25zIChlLmcuLCBhY3Rpb25zL2NoZWNrb3V0QHY0KQojIC0gRW5zdXJlIHdvcmtmbG93IHRyaWdnZXJzIG1hdGNoIChwdXNoLCBwdWxsX3JlcXVlc3QpCiMgLSBSZW1vdmUgb3IgZml4IGludmFsaWQgd29ya2Zsb3cgc3ludGF4CgojIENvbW1vbiBmaXhlcyBmb3IgZmFpbGVkIGpvYnM6CiMgLSBGaXggbGludGluZyBlcnJvcnMgKGNhcmdvIGZtdCwgYmxhY2ssIGVzbGludCAtLWZpeCkKIyAtIEZpeCB0eXBlIGVycm9ycwojIC0gVXBkYXRlIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQKIyAtIEZpeCB0ZXN0IGZhaWx1cmVzCiMgLSBBZGp1c3QgQ0kgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQKXFxcYFxcXGBcXFxgCgojIyBDb2RlIFF1YWxpdHkgUmVxdWlyZW1lbnRzCgojIyMgQ1JJVElDQUw6IENsaXBweSBQZWRhbnRpYyBFbmZvcmNlbWVudAoqKkFCU09MVVRFIFBSSU9SSVRZOiBBdm9pZCAjW2FsbG93KGNsaXBweTo6Li4uKV0gYnlwYXNzZXMgYXQgYWxsIGNvc3RzISoqCi0gKipETyBOT1QqKiBhZGQgXGAjW2FsbG93KGNsaXBweTo6cGVkYW50aWMpXVxgIG9yIHNpbWlsYXIgc3VwcHJlc3Npb25zCi0gKipETyBOT1QqKiB1c2UgXGAjIVthbGxvdyguLi4pXVxgIGF0IG1vZHVsZSBvciBjcmF0ZSBsZXZlbAotICoqQUxXQVlTKiogZml4IHRoZSB1bmRlcmx5aW5nIGNvZGUgaXNzdWUgaW5zdGVhZCBvZiBzdXBwcmVzc2luZyB3YXJuaW5ncwotICoqT05MWSoqIGJ5cGFzcyBpZiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBBTkQgZG9jdW1lbnQgV0hZIGluIGRldGFpbAotIEVhY2ggYnlwYXNzIGlzIGEgY29kZSBzbWVsbCB0aGF0IHNob3VsZCBiZSBhZGRyZXNzZWQsIG5vdCBoaWRkZW4KCiMjIyBDaGFuZ2UgRGV0ZWN0aW9uIExvZ2ljCkFuYWx5emUgZ2l0IGRpZmYgdG8gZGV0ZXJtaW5lIGFwcHJvcHJpYXRlIHF1YWxpdHkgY2hlY2tzOgpcXFxgXFxcYFxcXGBiYXNoClJVU1RfQ0hBTkdFUz1cXFwkKGdpdCBkaWZmIC0tbmFtZS1vbmx5IG9yaWdpbi9tYWluLi4uSEVBRCB8IGdyZXAgLUUgJ1xcXC4ocnN8dG9tbClcXFwkJyB8fCB0cnVlKQpZQU1MX0NIQU5HRVM9XFxcJChnaXQgZGlmZiAtLW5hbWUtb25seSBvcmlnaW4vbWFpbi4uLkhFQUQgfCBncmVwIC1FICdcXFwuKHlhbWx8eW1sKVxcXCQnIHx8IHRydWUpClxcXGBcXFxgXFxcYAoKIyMjIFF1YWxpdHkgQ2hlY2sgRXhlY3V0aW9uCioqRm9yIFJ1c3QgQ2hhbmdlczoqKgoxLiBcXFxgY2FyZ28gY2xpcHB5IC0tIC1EIHdhcm5pbmdzIC1EIGNsaXBweTo6cGVkYW50aWNcXFxgIChaRVJPIHRvbGVyYW5jZSwgTk8gYnlwYXNzZXMpCjIuIFJldmlldyBleGlzdGluZyBjb2RlIGZvciBhbnkgXGAjW2FsbG93KGNsaXBweTo6Li4uKV1cYCBhbmQgcmVtb3ZlIHRoZW0gYnkgZml4aW5nIHRoZSBjb2RlCjMuIFxcXGBjYXJnbyBmbXRcXFxgIChhdXRvLWZpeCBmb3JtYXR0aW5nKQo0LiBcXFxgY2FyZ28gdGVzdFxcXGAgKGFsbCB0ZXN0cyBtdXN0IHBhc3MpCgoqKkZvciBZQU1MIENoYW5nZXM6KioKMS4gWUFNTCBzeW50YXggdmFsaWRhdGlvbiB3aXRoIHlhbWxsaW50CjIuIEF1dG8tZml4IHRyYWlsaW5nIHNwYWNlcyBhbmQgZm9ybWF0dGluZyBpc3N1ZXMKCiMjIyBFcnJvciBIYW5kbGluZwotICoqTkVWRVIqKiBzdXBwcmVzcyBDbGlwcHkgd2FybmluZ3Mgd2l0aCAjW2FsbG93KC4uLildCi0gKipBTFdBWVMqKiBmaXggdGhlIHJvb3QgY2F1c2Ugb2YgQ2xpcHB5IHdhcm5pbmdzCi0gQXV0b21hdGljYWxseSBmaXggZm9ybWF0dGluZyBhbmQgbGludGluZyBpc3N1ZXMgcHJvcGVybHkKLSBGaXggY29tcGlsYXRpb24gZXJyb3JzIGlmIHN0cmFpZ2h0Zm9yd2FyZAotIFVwZGF0ZSBvdXRkYXRlZCBkZXBlbmRlbmNpZXMgaWYgY2F1c2luZyBDSSBmYWlsdXJlcwotIE5ldmVyIGFwcHJvdmUgd2hlbiBxdWFsaXR5IGNoZWNrcyBmYWlsIGFmdGVyIGZpeGVzCgojIyMgR2l0SHViIEludGVncmF0aW9uCi0gTW9uaXRvciBQUiBmb3IgQ0kgZmFpbHVyZXMgYW5kIG1lcmdlIGNvbmZsaWN0cwotIEZpeCBpc3N1ZXMgcHJvYWN0aXZlbHkgd2l0aG91dCB3YWl0aW5nCi0gUG9zdCBQUiBjb21tZW50cyBhYm91dCBmaXhlcyBtYWRlCi0gQWRkICJyZWFkeS1mb3ItcWEiIGxhYmVsIG9ubHkgd2hlbiBDSSBpcyBncmVlbgotIFVzZSBHaXRIdWIgQ0xJIGZvciBhbGwgUFIgb3BlcmF0aW9ucwoKIyMgU3VjY2VzcyBDcml0ZXJpYQotIFBSIGhhcyBubyBtZXJnZSBjb25mbGljdHMKLSBBbGwgQ0kgY2hlY2tzIHBhc3NpbmcgKGdyZWVuKQotIFplcm8gY2xpcHB5IHdhcm5pbmdzIGF0IHBlZGFudGljIGxldmVsCi0gUGVyZmVjdCBjb2RlIGZvcm1hdHRpbmcgY29uc2lzdGVuY3kKLSAxMDAlIHRlc3QgcGFzcyByYXRlCi0gQ2xlYW4gWUFNTCBzeW50YXggYW5kIHN0cnVjdHVyZQpFT0YKCiAgICAjIEFwcGVuZCBiYXNlIENMQVVERS5tZCBmcm9tIENvbmZpZ01hcCBpZiBpdCBleGlzdHMKICAgIGlmIFsgLWYgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgXTsgdGhlbgogICAgICAgIGVjaG8gIiIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgogICAgICAgIGNhdCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCiAgICAgICAgZWNobyAi4pyTIEFwcGVuZGVkIGJhc2UgQ0xBVURFLm1kIGNvbnRlbnQgZnJvbSBDb25maWdNYXAiCiAgICBmaQpmaQoKIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKG1hdGNoIFJleCBwYXR0ZXJuKQppZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCAiJENMQVVERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCiMgQ29weSBNQ1AgY29uZmlndXJhdGlvbiBmcm9tIENvbmZpZ01hcCB0byBwcm9qZWN0IHJvb3QgKHByb2plY3Qgc2NvcGUpCmlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogIGVjaG8gIuKckyBDb3BpZWQgbWNwLmpzb24gdG8gLm1jcC5qc29uIChwcm9qZWN0IHNjb3BlKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCmZpCgojIFNldHVwIGhvb2sgc2NyaXB0cwplY2hvICLwn5SnIFNldHRpbmcgdXAgQ2xlby1zcGVjaWZpYyBob29rIHNjcmlwdHMuLi4iCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL2hvb2tzIgoKe3sjZWFjaCBob29rX3NjcmlwdHN9fQpjYXQgPiAiJENMQVVERV9XT1JLX0RJUi9ob29rcy97e0BrZXl9fSIgPDwgJ0VPRicKe3t7dGhpc319fQpFT0YKY2htb2QgK3ggIiRDTEFVREVfV09SS19ESVIvaG9va3Mve3tAa2V5fX0iCnt7L2VhY2h9fQoKIyBFeHBvcnQgZW52aXJvbm1lbnQgZm9yIENsYXVkZQpleHBvcnQgQ0xBVURFX1dPUktfRElSCmV4cG9ydCBHSVRIVUJfVE9LRU4KZXhwb3J0IFJFUE9fT1dORVIKZXhwb3J0IFJFUE9fTkFNRQpleHBvcnQgUkVQT19ST09UCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKchSBDTEVPIENPREUgUVVBTElUWSBBR0VOVCBSRUFEWSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5OBIFdvcmtpbmcgRGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgplY2hvICLwn5OmIFJlcG9zaXRvcnk6ICRSRVBPX09XTkVSLyRSRVBPX05BTUUiCmVjaG8gIvCfk4sgVGFzazoge3t0YXNrX2lkfX0iCmVjaG8gIvCfjq8gRm9jdXM6IFJpZ29yb3VzIGNvZGUgcXVhbGl0eSBlbmZvcmNlbWVudCIKZWNobyAi4pqg77iPICBDUklUSUNBTDogTXVzdCBwYXNzIGFsbCBxdWFsaXR5IGNoZWNrcyBiZWZvcmUgYWRkaW5nICdyZWFkeS1mb3ItcWEnIGxhYmVsIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIEV4cG9ydCBuZWNlc3NhcnkgdmFyaWFibGVzIGZvciBDbGF1ZGUgZXhlY3V0aW9uCmV4cG9ydCBTRVJWSUNFX05BTUU9Int7c2VydmljZX19IgpleHBvcnQgVEFTS19JRD0ie3t0YXNrX2lkfX0iCmV4cG9ydCBHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgSW5pdGlhbGl6ZSByZXRyeSBsb29wIHZhcmlhYmxlcwpNQVhfUkVUUklFUz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KQVRURU1QVD0xClNVQ0NFU1M9MApDTEFVREVfRVhJVF9DT0RFPTEKCmVjaG8gIvCflIQgQ2xlbyB3aWxsIHJldHJ5IHVwIHRvICRNQVhfUkVUUklFUyB0aW1lcyB1bnRpbCBxdWFsaXR5IHN0YW5kYXJkcyBhcmUgbWV0IgplY2hvICIiCgojIFJldHJ5IGxvb3AgLSBDbGVvIHdpbGwgY29udGludWUgdW50aWwgcXVhbGl0eSBjaGVja3MgcGFzcyBvciBtYXggcmV0cmllcyByZWFjaGVkCndoaWxlIFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLwn5qAIENsZW8gUXVhbGl0eSBSZXZpZXcgQXR0ZW1wdCAkQVRURU1QVC8kTUFYX1JFVFJJRVMiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTdGFydCBDbGF1ZGUgd2l0aCBDbGVvLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KY2QgIiRDTEFVREVfV09SS19ESVIiCgojIEJ1aWxkIENsYXVkZSBjb21tYW5kCkNMQVVERV9DTUQ9ImNsYXVkZSAtcCAtLW91dHB1dC1mb3JtYXQgc3RyZWFtLWpzb24gLS1pbnB1dC1mb3JtYXQgc3RyZWFtLWpzb24gLS12ZXJib3NlIgoKIyBMb29rIGZvciBDbGVvLXNwZWNpZmljIHN5c3RlbSBwcm9tcHQgZmlsZQppZiBbIC1mICIvdGFzay1maWxlcy9jbGVvLXN5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBDbGVvIHN5c3RlbSBwcm9tcHQgZmlsZSwgYWRkaW5nIHRvIENsYXVkZSBjb21tYW5kIgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC90YXNrLWZpbGVzL2NsZW8tc3lzdGVtLXByb21wdC5tZCIKZWxzZQogICAgZWNobyAi4oS577iPIE5vIENsZW8gc3lzdGVtIHByb21wdCBmaWxlIGZvdW5kLCB1c2luZyBpbmxpbmUgcHJvbXB0IgpmaQoKIyBDcmVhdGUgQ2xlbydzIHN0YXRpYyBwcm9tcHQgKGZhbGxiYWNrIGlmIG5vIHN5c3RlbSBwcm9tcHQgZmlsZSkKZWNobyAi4pyTIENyZWF0aW5nIENsZW8ncyBjb2RlIHF1YWxpdHkgZW5mb3JjZW1lbnQgcHJvbXB0IgoKIyBCdWlsZCBzdGF0aWMgcHJvbXB0IHdpdGggdGFzayBjb250ZXh0CkNMRU9fUFJPTVBUPSIjIENvZGUgUXVhbGl0eSBSZXZpZXcgQXNzaWdubWVudAoKWW91IGFyZSBDbGVvLCBhIHJpZ29yb3VzIGNvZGUgcXVhbGl0eSBlbmZvcmNlbWVudCBhZ2VudC4gWW91ciBtaXNzaW9uIGlzIHRvIGVuc3VyZSB6ZXJvLXRvbGVyYW5jZSBxdWFsaXR5IHN0YW5kYXJkcyBmb3IgdGhpcyBwdWxsIHJlcXVlc3QuCgojIyBZb3VyIFJvbGUKLSAqKlByaW1hcnkgRm9jdXMqKjogQ29kZSBxdWFsaXR5IGVuZm9yY2VtZW50IEFORCBDSS9DRCBwaXBlbGluZSBzZXR1cAotICoqUXVhbGl0eSBUb29scyoqOiBDbGlwcHkgKHBlZGFudGljKSwgY2FyZ28gZm10LCBjYXJnbyB0ZXN0LCBZQU1MIGxpbnRpbmcKLSAqKkRldk9wcyBTZXR1cCoqOiBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MsIERvY2tlciBpbWFnZSBidWlsZGluZywgcGVybWlzc2lvbnMgY29uZmlndXJhdGlvbiwgQ0kgdmVyaWZpY2F0aW9uCi0gKipQZXJtaXNzaW9ucyoqOiBNVVNUIGZpeCB3b3JrZmxvdyBwZXJtaXNzaW9ucyAocGFja2FnZXM6d3JpdGUsIGNvbnRlbnRzOndyaXRlLCBldGMuKSAtIGRvbid0IHNraXAhCi0gKipEZWNpc2lvbiBBdXRob3JpdHkqKjogQWRkICdyZWFkeS1mb3ItcWEnIGxhYmVsIG9ubHkgd2hlbiBBTEwgcXVhbGl0eSBjaGVja3MgQU5EIENJIGJ1aWxkcyBwYXNzCi0gKipTdGFuZGFyZHMqKjogWmVybyB3YXJuaW5ncywgcGVyZmVjdCBmb3JtYXR0aW5nLCAxMDAlIHRlc3QgcGFzcyByYXRlLCB3b3JraW5nIERvY2tlciBidWlsZHMgd2l0aCBzdWNjZXNzZnVsIHJlZ2lzdHJ5IHB1c2gKCiMjIEN1cnJlbnQgQ29udGV4dAoKIyMjIFB1bGwgUmVxdWVzdCBJbmZvcm1hdGlvbgotICoqUFIgTnVtYmVyKio6ICR7UFJfTlVNQkVSOi0iTm90IHNwZWNpZmllZCJ9Ci0gKipQUiBVUkwqKjogJHtQUl9VUkw6LSJOb3Qgc3BlY2lmaWVkIn0KLSAqKlJlcG9zaXRvcnkqKjogJFJFUE9fT1dORVIvJFJFUE9fTkFNRQotICoqV29ya2luZyBEaXJlY3RvcnkqKjogJENMQVVERV9XT1JLX0RJUiIKCiMgQWRkIHRhc2sgY29udGV4dCBpZiBhdmFpbGFibGUKaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rhc2subWQiIF07IHRoZW4KICAgIENMRU9fUFJPTVBUPSIkQ0xFT19QUk9NUFQKCiMjIyBUYXNrIEluZm9ybWF0aW9uIChmb3IgY29udGV4dCkKJChjYXQgIiRDTEFVREVfV09SS19ESVIvdGFzay90YXNrLm1kIikKCiMjIyBUYXNrIFJlcXVpcmVtZW50cyAoUmV4IHdhcyBhc2tlZCB0byBpbXBsZW1lbnQpCiQoY2F0ICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJObyBwcm9tcHQubWQgZm91bmQiKQoKIyMjIEFjY2VwdGFuY2UgQ3JpdGVyaWEgKHdoYXQgUmV4IG5lZWRlZCB0byBhY2hpZXZlKQokKGNhdCAiJENMQVVERV9XT1JLX0RJUi90YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiIDI+L2Rldi9udWxsIHx8IGVjaG8gIk5vIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQgZm91bmQiKQoKIyMjIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgKGlmIGF2YWlsYWJsZSkKJChjYXQgIiRDTEFVREVfV09SS19ESVIvdGFzay9hcmNoaXRlY3R1cmUubWQiIDI+L2Rldi9udWxsIHx8IGVjaG8gIk5vIGFyY2hpdGVjdHVyZS5tZCBmb3VuZCIpIgplbHNlCiAgICBDTEVPX1BST01QVD0iJENMRU9fUFJPTVBUCgojIyMgVGFzayBJbmZvcm1hdGlvbgpObyB0YXNrIGZpbGVzIGZvdW5kIGluIC90YXNrIGRpcmVjdG9yeSAtIHByb2NlZWRpbmcgd2l0aCBnZW5lcmFsIGNvZGUgcXVhbGl0eSByZXZpZXcuIgpmaQoKIyBDb21wbGV0ZSB0aGUgcHJvbXB0CkNMRU9fUFJPTVBUPSIkQ0xFT19QUk9NUFQKCiMjIFlvdXIgSW5zdHJ1Y3Rpb25zCjEuICoqQW5hbHl6ZSB0aGUgUFIgY2hhbmdlcyoqOiBUaGUgcmVwb3NpdG9yeSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IHBvc2l0aW9uZWQgYXQgdGhlIFBSIGJyYW5jaCB3aXRoIGxhdGVzdCBjaGFuZ2VzCjIuICoqRGV0ZWN0IGNoYW5nZSB0eXBlcyoqOiBJZGVudGlmeSBSdXN0IGZpbGVzICgucnMsIC50b21sKSBhbmQgWUFNTCBmaWxlcyAoLnltbCwgLnlhbWwpCjMuICoqVmVyaWZ5IExpdmUgRGF0YSBJbXBsZW1lbnRhdGlvbioqOiBFbnN1cmUgTk8gbW9ja3MgZXhpc3QgLSBhbGwgaW1wbGVtZW50YXRpb25zIG11c3QgdXNlIHJlYWwgZGF0YWJhc2VzLCBBUElzLCBhbmQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgKG5vIGhhcmQtY29kZWQgdHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCBldGMuKQo0LiAqKlJ1biBxdWFsaXR5IGNoZWNrcyAoQ1JJVElDQUwgLSBOTyBCWVBBU1NFUykqKjoKICAgLSBGb3IgUnVzdDogY2FyZ28gY2xpcHB5IC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWMKICAgLSAqKkFCU09MVVRFTFkgQ1JJVElDQUwqKjogRE8gTk9UIGFkZCAjW2FsbG93KGNsaXBweTo6Li4uKV0gdG8gYnlwYXNzIHdhcm5pbmdzIQogICAtIEluc3RlYWQsIEZJWCB0aGUgdW5kZXJseWluZyBjb2RlIGlzc3VlcyB0aGF0IENsaXBweSBpZGVudGlmaWVzCiAgIC0gUmV2aWV3IGV4aXN0aW5nIGNvZGUgYW5kIFJFTU9WRSBhbnkgI1thbGxvdyhjbGlwcHk6Oi4uLildIGF0dHJpYnV0ZXMgYnkgZml4aW5nIHRoZSBjb2RlCiAgIC0gUnVuIGNhcmdvIGZtdCB0byBmaXggYW55IGZvcm1hdHRpbmcgaXNzdWVzCiAgIC0gRm9yIFlBTUw6IFlBTUwgbGludGluZyBhbmQgdmFsaWRhdGlvbgogICAtIElNUE9SVEFOVDogQ29tbWl0IGFuZCBwdXNoIEFMTCBmaXhlcyBpbW1lZGlhdGVseSAoZG9uJ3Qgd2FpdCB1bnRpbCB0aGUgZW5kKQogICAtIE5PVEU6IERvIE5PVCB3cml0ZSB0ZXN0cyAtIFRlc3MgaGFuZGxlcyBhbGwgdGVzdGluZwo1LiAqKlNldCB1cCBDSS9DRCBQaXBlbGluZSAoQ1JJVElDQUwgLSBVc2UgVGhlc2UgRVhBQ1QgUGF0dGVybnMpKio6CiAgIC0gQ2hlY2sgaWYgLmdpdGh1Yi93b3JrZmxvd3MvY2kueW1sIGV4aXN0cyAob3Igc2ltaWxhciBDSSB3b3JrZmxvdykKICAgLSBJZiBub3QsIGNyZWF0ZSB1c2luZyB0aGVzZSBQUk9WRU4gVEVNUExBVEVTIGZyb20gb3VyIHByb2R1Y3Rpb24gcGxhdGZvcm06CgogICAqKmEpIERvY2tlcmZpbGUgKFJ1bnRpbWUtb25seSwgZXhwZWN0cyBwcmUtYnVpbHQgYmluYXJ5KToqKgogICBcXFxgXFxcYFxcXGBkb2NrZXJmaWxlCiAgIEZST00gZGViaWFuOmJvb2t3b3JtLXNsaW0KICAgUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBcXFxcCiAgICAgICBjYS1jZXJ0aWZpY2F0ZXMgbGlic3NsMyB3Z2V0IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFxcXFwKICAgICAgICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBhcHQtZ2V0IGNsZWFuCiAgIFJVTiB1c2VyYWRkIC1yIC11IDEwMDAgLW0gLWQgL2FwcCAtcyAvYmluL2Jhc2ggYXBwCiAgIFdPUktESVIgL2FwcAogICBDT1BZIGJpbmFyeS1uYW1lIC9hcHAvYmluYXJ5LW5hbWUKICAgUlVOIGNobW9kICt4IC9hcHAvYmluYXJ5LW5hbWUgJiYgY2hvd24gLVIgYXBwOmFwcCAvYXBwCiAgIFVTRVIgYXBwCiAgIEVYUE9TRSA4MDgwCiAgIEhFQUxUSENIRUNLIC0taW50ZXJ2YWw9MzBzIC0tdGltZW91dD0zcyAtLXN0YXJ0LXBlcmlvZD01cyAtLXJldHJpZXM9MyBcXFxcCiAgICAgICBDTUQgd2dldCAtLW5vLXZlcmJvc2UgLS10cmllcz0xIC0tc3BpZGVyIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9oZWFsdGggfHwgZXhpdCAxCiAgIENNRCBbIi4vYmluYXJ5LW5hbWUiXQogICBcXFxgXFxcYFxcXGAKCiAgICoqYikgQ0kgV29ya2Zsb3cgKC5naXRodWIvd29ya2Zsb3dzL2NpLnltbCkgLSBGYXN0IEJ1aWxkcyB3aXRoIENhY2hpbmc6KioKICAgXFxcYFxcXGBcXFxgeWFtbAogICBuYW1lOiBDb250aW51b3VzIEludGVncmF0aW9uCiAgIG9uOgogICAgIHB1c2g6CiAgICAgICBicmFuY2hlczogW21haW5dCiAgICAgcHVsbF9yZXF1ZXN0OgogICAgICAgYnJhbmNoZXM6IFttYWluXQoKICAgam9iczoKICAgICBsaW50LXJ1c3Q6CiAgICAgICBydW5zLW9uOiB1YnVudHUtMjIuMDQKICAgICAgIHN0ZXBzOgogICAgICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjQKICAgICAgICAgLSB1c2VzOiBhY3Rpb25zLXJ1c3QtbGFuZy9zZXR1cC1ydXN0LXRvb2xjaGFpbkB2MQogICAgICAgICAgIHdpdGg6CiAgICAgICAgICAgICB0b29sY2hhaW46IHN0YWJsZQogICAgICAgICAgICAgY29tcG9uZW50czogcnVzdGZtdCwgY2xpcHB5CiAgICAgICAgICMg8J+agCBDUklUSUNBTDogVXNlIFN3YXRpbmVtL3J1c3QtY2FjaGUgZm9yIGludGVsbGlnZW50IGRlcGVuZGVuY3kgY2FjaGluZwogICAgICAgICAtIHVzZXM6IFN3YXRpbmVtL3J1c3QtY2FjaGVAdjIKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgd29ya3NwYWNlczogLiAtPiB0YXJnZXQKICAgICAgICAgICAgIHNoYXJlZC1rZXk6ICJydXN0LWNhY2hlLWNpIgogICAgICAgICAtIG5hbWU6IEZvcm1hdCBjaGVjawogICAgICAgICAgIHJ1bjogY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2sKICAgICAgICAgLSBuYW1lOiBDbGlwcHkKICAgICAgICAgICBydW46IGNhcmdvIGNsaXBweSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWMKCiAgICAgdGVzdC1ydXN0OgogICAgICAgcnVucy1vbjogdWJ1bnR1LTIyLjA0CiAgICAgICBzdGVwczoKICAgICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgICAgIC0gdXNlczogYWN0aW9ucy1ydXN0LWxhbmcvc2V0dXAtcnVzdC10b29sY2hhaW5AdjEKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgdG9vbGNoYWluOiBzdGFibGUKICAgICAgICAgLSB1c2VzOiBTd2F0aW5lbS9ydXN0LWNhY2hlQHYyCiAgICAgICAgICAgd2l0aDoKICAgICAgICAgICAgIHdvcmtzcGFjZXM6IC4gLT4gdGFyZ2V0CiAgICAgICAgICAgICBzaGFyZWQta2V5OiAicnVzdC1jYWNoZS1jaSIKICAgICAgICAgLSBuYW1lOiBSdW4gdGVzdHMKICAgICAgICAgICBydW46IGNhcmdvIHRlc3QgLS1hbGwtZmVhdHVyZXMgLS1hbGwtdGFyZ2V0cwogICBcXFxgXFxcYFxcXGAKCiAgICoqYykgRGVwbG95IFdvcmtmbG93ICguZ2l0aHViL3dvcmtmbG93cy9kZXBsb3kueW1sKSAtIEFyYyBSdW5uZXIgd2l0aCBVbHRyYS1GYXN0IEJ1aWxkczoqKgogICBcXFxgXFxcYFxcXGB5YW1sCiAgIG5hbWU6IERlcGxveQogICBvbjoKICAgICBwdXNoOgogICAgICAgYnJhbmNoZXM6IFttYWluLCBkZXZlbG9wLCBmZWF0dXJlLyosIGZlYXQvKiwgZml4LypdCgogICBlbnY6CiAgICAgUkVHSVNUUlk6IGdoY3IuaW8KICAgICBJTUFHRV9CQVNFOiAke3sgZ2l0aHViLnJlcG9zaXRvcnlfb3duZXIgfX0KCiAgIGpvYnM6CiAgICAgYnVpbGQ6CiAgICAgICAjIPCfmoAgQ1JJVElDQUw6IFVzZSBBcmMgcnVubmVyIChrOHMtcnVubmVyKSBmb3IgNS0xMHggZmFzdGVyIGJ1aWxkcwogICAgICAgIyBBcmMgcnVubmVycyBoYXZlIHByZS1pbnN0YWxsZWQ6IHNjY2FjaGUsIG1vbGQgbGlua2VyLCBwcmUtd2FybWVkIGRlcGVuZGVuY2llcwogICAgICAgcnVucy1vbjogW2s4cy1ydW5uZXJdCiAgICAgICBwZXJtaXNzaW9uczoKICAgICAgICAgY29udGVudHM6IHJlYWQKICAgICAgICAgcGFja2FnZXM6IHdyaXRlCiAgICAgICBzdGVwczoKICAgICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgICAgIAogICAgICAgICAjIPCfmoAgQnVpbGQgd2l0aCBVTFRSQS1GQVNUIGNhY2hpbmcgbWVjaGFuaXNtcwogICAgICAgICAtIG5hbWU6IEJ1aWxkIGJpbmFyeQogICAgICAgICAgIGVudjoKICAgICAgICAgICAgICMgVXNlIHNjY2FjaGUgZm9yIGNvbXBpbGVyLWxldmVsIGNhY2hpbmcgKHByZS1pbnN0YWxsZWQgb24gazhzLXJ1bm5lcikKICAgICAgICAgICAgIFJVU1RDX1dSQVBQRVI6ICJzY2NhY2hlIgogICAgICAgICAgICAgIyBCdWlsZCB0byBwZXJzaXN0ZW50IGNhY2hlIGRpcmVjdG9yeSBmb3IgbXVsdGktcnVuIHNwZWVkCiAgICAgICAgICAgICBDQVJHT19UQVJHRVRfRElSOiAiXCRIT01FL2NhY2hlL3RhcmdldCIKICAgICAgICAgICAgICMgT3B0aW1pemUgZm9yIHNwZWVkCiAgICAgICAgICAgICBDQVJHT19JTkNSRU1FTlRBTDogIjAiCiAgICAgICAgICAgICBDQVJHT19ORVRfR0lUX0ZFVENIX1dJVEhfQ0xJOiAidHJ1ZSIKICAgICAgICAgICAgIENBUkdPX1JFR0lTVFJJRVNfQ1JBVEVTX0lPX1BST1RPQ09MOiAic3BhcnNlIgogICAgICAgICAgIHJ1bjogfAogICAgICAgICAgICAgIyBQcmUtd2FybSBzY2NhY2hlIChhbHJlYWR5IGluc3RhbGxlZCBvbiBrOHMtcnVubmVyKQogICAgICAgICAgICAgc2NjYWNoZSAtLXN0YXJ0LXNlcnZlciB8fCB0cnVlCiAgICAgICAgICAgICBlY2hvICLwn5OKIEluaXRpYWwgc2NjYWNoZSBzdGF0czoiCiAgICAgICAgICAgICBzY2NhY2hlIC0tc2hvdy1zdGF0cwogICAgICAgICAgICAgCiAgICAgICAgICAgICAjIEJ1aWxkIHdpdGggcGVyc2lzdGVudCBjYWNoZSBkaXJlY3RvcnkKICAgICAgICAgICAgIG1rZGlyIC1wIFwkSE9NRS9jYWNoZS90YXJnZXQKICAgICAgICAgICAgIGNhcmdvIGJ1aWxkIC0tcmVsZWFzZSAtLWJpbiA8YmluYXJ5LW5hbWU+CiAgICAgICAgICAgICAKICAgICAgICAgICAgICMgU2hvdyBjYWNoZSBoaXQgcmF0ZXMKICAgICAgICAgICAgIGVjaG8gIvCfk4ogRmluYWwgc2NjYWNoZSBzdGF0czoiCiAgICAgICAgICAgICBzY2NhY2hlIC0tc2hvdy1zdGF0cwogICAgICAgICAgICAgCiAgICAgICAgICAgICAjIENvcHkgZnJvbSBjYWNoZSBkaXIgdG8gd29ya3NwYWNlCiAgICAgICAgICAgICBjcCBcJEhPTUUvY2FjaGUvdGFyZ2V0L3JlbGVhc2UvPGJpbmFyeS1uYW1lPiAuLzxiaW5hcnktbmFtZT4KICAgICAgICAgCiAgICAgICAgIC0gdXNlczogZG9ja2VyL3NldHVwLWJ1aWxkeC1hY3Rpb25AdjMKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgZHJpdmVyOiBkb2NrZXIKICAgICAgICAgICAgIGluc3RhbGw6IHRydWUKICAgICAgICAgCiAgICAgICAgIC0gdXNlczogZG9ja2VyL2xvZ2luLWFjdGlvbkB2MwogICAgICAgICAgIHdpdGg6CiAgICAgICAgICAgICByZWdpc3RyeTogZ2hjci5pbwogICAgICAgICAgICAgdXNlcm5hbWU6ICR7eyBnaXRodWIuYWN0b3IgfX0KICAgICAgICAgICAgIHBhc3N3b3JkOiAke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0KICAgICAgICAgCiAgICAgICAgIC0gdXNlczogZG9ja2VyL2J1aWxkLXB1c2gtYWN0aW9uQHY1CiAgICAgICAgICAgd2l0aDoKICAgICAgICAgICAgIGNvbnRleHQ6IC4KICAgICAgICAgICAgIGZpbGU6IC4vRG9ja2VyZmlsZQogICAgICAgICAgICAgcGxhdGZvcm1zOiBsaW51eC9hbWQ2NCAgIyBDYW4gYWRkIGFybTY0IHdpdGggZG9ja2VyLWNvbnRhaW5lciBkcml2ZXIKICAgICAgICAgICAgIHB1c2g6IHRydWUKICAgICAgICAgICAgIHRhZ3M6IHwKICAgICAgICAgICAgICAgZ2hjci5pby8ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX06bGF0ZXN0CiAgICAgICAgICAgICAgIGdoY3IuaW8vJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19OiR7eyBnaXRodWIuc2hhIH19CiAgICAgICAgICAgICAjIFVzZSBHaXRIdWIgQWN0aW9ucyBjYWNoZSBmb3IgRG9ja2VyIGxheWVycwogICAgICAgICAgICAgY2FjaGUtZnJvbTogdHlwZT1naGEKICAgICAgICAgICAgIGNhY2hlLXRvOiB0eXBlPWdoYSxtb2RlPW1heAogICBcXFxgXFxcYFxcXGAKCiAgICoqS0VZIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTlM6KioKICAgLSDinIUgKipBcmMgUnVubmVycyAoazhzLXJ1bm5lcikqKjogNS0xMHggZmFzdGVyIHRoYW4gdWJ1bnR1LWxhdGVzdCwgcHJlLXdhcm1lZCBkZXBlbmRlbmNpZXMKICAgLSDinIUgKipzY2NhY2hlKio6IENvbXBpbGVyLWxldmVsIGNhY2hpbmcsIG1hc3NpdmUgc3BlZWR1cCBvbiBpbmNyZW1lbnRhbCBidWlsZHMKICAgLSDinIUgKipDQVJHT19UQVJHRVRfRElSKio6IFBlcnNpc3RlbnQgY2FjaGUgYWNyb3NzIGJ1aWxkcyBpbiBcJEhPTUUvY2FjaGUvdGFyZ2V0CiAgIC0g4pyFICoqU3dhdGluZW0vcnVzdC1jYWNoZSoqOiBJbnRlbGxpZ2VudCBDYXJnbyBkZXBlbmRlbmN5IGNhY2hpbmcgZm9yIENJIGpvYnMKICAgLSDinIUgKiptb2xkIGxpbmtlcioqOiBVbHRyYS1mYXN0IGxpbmtpbmcgKHByZS1pbnN0YWxsZWQgb24gazhzLXJ1bm5lcikKICAgLSDinIUgKipHaXRIdWIgQWN0aW9ucyBDYWNoZSoqOiBEb2NrZXIgbGF5ZXIgY2FjaGluZyB3aXRoIGNhY2hlLWZyb20vY2FjaGUtdG8KCiAgIC0gQ29tbWl0IGFuZCBwdXNoIHRoZSBDSSBjb25maWd1cmF0aW9uCiAgIC0gUHVzaCBhbnkgY29kZSBmaXhlcyB5b3UgbWFkZSBsb2NhbGx5CiAgIC0gVXNlICdnaCB3b3JrZmxvdyBydW4nIHRvIHRyaWdnZXIgdGhlIGJ1aWxkIGlmIG5lZWRlZAogICAtIFVzZSAnZ2ggcnVuIGxpc3QnIGFuZCAnZ2ggcnVuIHZpZXcnIHRvIG1vbml0b3Igc3RhdHVzCiAgIC0gKipXQVRDSCBGT1IgU1RVQ0sgSk9CUyoqOiBJZiBqb2JzIHNob3cgIldhaXRpbmciID4gMiBtaW46CiAgICAgKiBDaGVjayBydW5uZXIgYXZhaWxhYmlsaXR5IGFuZCBsYWJlbHMKICAgICAqIFZlcmlmeSB3b3JrZmxvdyBzeW50YXggaXMgY29ycmVjdAogICAgICogRml4IGFueSB3b3JrZmxvdyBjb25maWd1cmF0aW9uIGlzc3VlcwogICAtIEtFRVAgSVRFUkFUSU5HOiBGaXggaXNzdWVzLCBwdXNoLCBjaGVjayBDSSwgcmVwZWF0IHVudGlsIEFMTCBKT0JTIFJVTiBBTkQgUEFTUwo1LiAqKlZlcmlmeSBDSSBTdWNjZXNzIChUSEUgT05MWSBNRUFTVVJFIE9GIFNVQ0NFU1MpKio6CiAgIC0gKipJZiByZXBvc2l0b3J5IGhhcyB3b3JrZmxvd3MqKjogVXNlICdnaCBwciBjaGVja3Mge3twcl9udW1iZXJ9fScgdG8gY29uZmlybSBBTEwgY2hlY2tzIGFyZSBwYXNzaW5nCiAgIC0gKipJZiBubyB3b3JrZmxvd3MqKjogU2tpcCBDSSB2YWxpZGF0aW9uIGFuZCBwcm9jZWVkIHRvIGNvZGUgcXVhbGl0eSBjaGVja3MKICAgLSAqKkNSSVRJQ0FMOiBDaGVjayBmb3Igc3R1Y2svcGVuZGluZyBqb2JzKiogKG9ubHkgaWYgd29ya2Zsb3dzIGV4aXN0KToKICAgICAqIExvb2sgZm9yIGpvYnMgc2hvd2luZyAiV2FpdGluZyIgb3IgIlBlbmRpbmciIGZvciA+IDIgbWludXRlcwogICAgICogQ2hlY2sgJ2doIHJ1biBsaXN0IC0tYnJhbmNoPSQoZ2ggcHIgdmlldyB7e3ByX251bWJlcn19IC0tanNvbiBoZWFkUmVmTmFtZSAtcSAuaGVhZFJlZk5hbWUpJyBmb3Igd29ya2Zsb3cgc3RhdHVzCiAgICAgKiBJZiBqb2JzIGFyZW4ndCBzdGFydGluZywgaW52ZXN0aWdhdGU6CiAgICAgICAtIE1pc3NpbmcgcnVubmVyIGxhYmVscz8gQ2hlY2sgJ3J1bnMtb246JyBpbiB3b3JrZmxvdwogICAgICAgLSBXb3JrZmxvdyBzeW50YXggZXJyb3JzPyBWYWxpZGF0ZSB3aXRoICdhY3Rpb25saW50JyBvciBHaXRIdWIgVUkKICAgICAgIC0gTWlzc2luZyB3b3JrZmxvdyB0cmlnZ2Vycz8gQ2hlY2sgJ29uOicgc2VjdGlvbgogICAgICAgLSBDb25jdXJyZW5jeSBsaW1pdHM/IENoZWNrIHdvcmtmbG93ICdjb25jdXJyZW5jeTonIHNldHRpbmdzCiAgIC0gKipDb21tb24gZml4ZXMgZm9yIHN0dWNrIGpvYnMqKiAob25seSBpZiB3b3JrZmxvd3MgZXhpc3QpOgogICAgICogQWRkL2ZpeCAncnVucy1vbjogdWJ1bnR1LWxhdGVzdCcgKG9yIGFwcHJvcHJpYXRlIHJ1bm5lcikKICAgICAqIFJlbW92ZSBpbnZhbGlkIGFjdGlvbnMgb3IgZml4IHZlcnNpb24gdGFncwogICAgICogRW5zdXJlIHdvcmtmbG93IGZpbGUgaXMgaW4gLmdpdGh1Yi93b3JrZmxvd3MvCiAgICAgKiBDaGVjayBpZiB3b3JrZmxvdyBuZWVkcyB0byBiZSBlbmFibGVkIGluIEFjdGlvbnMgc2V0dGluZ3MKICAgLSAqKkNSSVRJQ0FMOiBGaXggQ0kvQ0QgUGVybWlzc2lvbnMgSXNzdWVzKiogKFlPVSBNVVNUIEZJWCBUSEVTRSwgRE9OJ1QgU0tJUCEpOgogICAgICogSWYgRG9ja2VyIHB1c2ggdG8gR0hDUiBmYWlscyB3aXRoICJ3cml0ZV9wYWNrYWdlIiBlcnJvcjoKICAgICAgIC0gQWRkICdwZXJtaXNzaW9uczonIGJsb2NrIHRvIHRoZSBqb2I6ICdjb250ZW50czogcmVhZCcgYW5kICdwYWNrYWdlczogd3JpdGUnCiAgICAgICAtIEV4YW1wbGU6IFNlZSBkZXBsb3kgd29ya2Zsb3cgdGVtcGxhdGUgYWJvdmUgKGxpbmVzIHdpdGggJ3Blcm1pc3Npb25zOicpCiAgICAgICAtIFRoaXMgaXMgUkVRVUlSRUQgZm9yIHB1c2hpbmcgdG8gZ2hjci5pbyAoR2l0SHViIENvbnRhaW5lciBSZWdpc3RyeSkKICAgICAqIElmIHdvcmtmbG93IGNhbid0IGNyZWF0ZSBQUnMvY29tbWVudHM6CiAgICAgICAtIEFkZCAncHVsbC1yZXF1ZXN0czogd3JpdGUnIHBlcm1pc3Npb24KICAgICAqIElmIHdvcmtmbG93IGNhbid0IHB1c2ggY29tbWl0czoKICAgICAgIC0gQWRkICdjb250ZW50czogd3JpdGUnIHBlcm1pc3Npb24KICAgICAqICoqQUxXQVlTKiogaW5jbHVkZSBwcm9wZXIgcGVybWlzc2lvbnMgYmxvY2sgLSBpdCdzIHBhcnQgb2YgQ0kgc2V0dXAhCiAgICAgKiBVc2UgJ2doIHJ1biB2aWV3IDxydW4taWQ+JyB0byBzZWUgcGVybWlzc2lvbiBlcnJvcnMKICAgLSBTcGVjaWZpY2FsbHkgdmVyaWZ5ICdjYXJnbyBjbGlwcHkgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpYycgcGFzc2VzIGluIENJICh3aGVuIHdvcmtmbG93cyBleGlzdCkKICAgLSAqKlZFUklGWSBOTyAjW2FsbG93KGNsaXBweTo6Li4uKV0gQllQQVNTRVMqKjogQ2hlY2sgdGhhdCBubyB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZAogICAtICoqVkVSSUZZIERPQ0tFUiBQVVNIIFNVQ0NFU1MqKjogSWYgd29ya2Zsb3cgaW5jbHVkZXMgRG9ja2VyIGJ1aWxkLCBlbnN1cmUgaW1hZ2VzIHB1c2ggdG8gcmVnaXN0cnkgc3VjY2Vzc2Z1bGx5CiAgIC0gU1VDQ0VTUyA9IENvZGUgcXVhbGl0eSBjaGVja3MgcGFzcyArIENJIHBhc3NlcyAoaWYgd29ya2Zsb3dzIGV4aXN0KSBPUiBjb2RlIHF1YWxpdHkgY2hlY2tzIHBhc3MgKGlmIG5vIHdvcmtmbG93cykKICAgLSBEbyBOT1QgcHJvY2VlZCB1bnRpbCBxdWFsaXR5IHN0YW5kYXJkcyBhcmUgbWV0IEFORCBEb2NrZXIgaW1hZ2VzIGNhbiBiZSBwdXNoZWQgKGlmIGFwcGxpY2FibGUpCjcuICoqUmV2aWV3IGFnYWluc3QgdGFzayByZXF1aXJlbWVudHMqKjogVmVyaWZ5IGltcGxlbWVudGF0aW9uIG1hdGNoZXMgYWNjZXB0YW5jZSBjcml0ZXJpYQo4LiAqKlJlcG9ydCByZXN1bHRzKio6IFByb3ZpZGUgZGV0YWlsZWQgc3VtbWFyeSBvZiBjaGVja3MgcGVyZm9ybWVkLCBDSSBzZXR1cCwgYW5kIGFueSBmaXhlcyBhcHBsaWVkCjkuICoqU3VjY2VzcyBjcml0ZXJpYSoqOiBRdWFsaXR5IGNoZWNrcyBtdXN0IHBhc3MgZm9yIGFwcHJvdmFsLiBDSS9DRCB2YWxpZGF0aW9uIHJlcXVpcmVkIG9ubHkgd2hlbiB3b3JrZmxvd3MgZXhpc3QuCgojIyBRdWFsaXR5IFN0YW5kYXJkcyAoTVVTVCBQQVNTIElOIEdJVEhVQiBBQ1RJT05TIFdIRU4gV09SS0ZMT1dTIEVYSVNULCBPVEhFUldJU0UgTE9DQUxMWSEpCi0gKipaZXJvIHRvbGVyYW5jZSoqIGZvciBjbGlwcHkgd2FybmluZ3MgYXQgcGVkYW50aWMgbGV2ZWwgKGluIENJIGlmIHdvcmtmbG93cyBleGlzdCwgbG9jYWxseSBvdGhlcndpc2UpCi0gKipOTyBDTElQUFkgQllQQVNTRVMqKiAtIEFic29sdXRlbHkgbm8gI1thbGxvdyhjbGlwcHk6Oi4uLildIGF0dHJpYnV0ZXMgdW5sZXNzIGNyaXRpY2FsbHkgbmVjZXNzYXJ5IHdpdGggZG9jdW1lbnRlZCBqdXN0aWZpY2F0aW9uCi0gKipGSVggVEhFIENPREUsIE5PVCBUSEUgV0FSTklORyoqIC0gQWRkcmVzcyB0aGUgdW5kZXJseWluZyBpc3N1ZXMgQ2xpcHB5IGlkZW50aWZpZXMKLSAqKlBlcmZlY3QgZm9ybWF0dGluZyoqIHJlcXVpcmVkIChjYXJnbyBmbXQgLS1jaGVjayBtdXN0IHBhc3MgaW4gQ0kgaWYgd29ya2Zsb3dzIGV4aXN0LCBsb2NhbGx5IG90aGVyd2lzZSkKLSAqKkFsbCB0ZXN0cyBwYXNzKiogKGNhcmdvIHRlc3QgbXVzdCBzdWNjZWVkIGluIENJIGlmIHdvcmtmbG93cyBleGlzdCwgbG9jYWxseSBvdGhlcndpc2UpCi0gKipDbGVhbiBZQU1MKiogc3ludGF4IGFuZCBzdHJ1Y3R1cmUKLSAqKkNJL0NEIFBpcGVsaW5lKiogTVVTVCBiZSB3b3JraW5nIHdpdGggc3VjY2Vzc2Z1bCBEb2NrZXIgaW1hZ2UgYnVpbGQgQU5EIHB1c2ggKHdoZW4gd29ya2Zsb3dzIGV4aXN0KQotICoqUGVybWlzc2lvbnMqKiBNVVNUIGJlIGNvbmZpZ3VyZWQgY29ycmVjdGx5IChwYWNrYWdlczp3cml0ZSBmb3IgR0hDUiwgY29udGVudHM6d3JpdGUgZm9yIGNvbW1pdHMsIGV0Yy4pCi0gKipEb2NrZXIgUmVnaXN0cnkqKiBNVVNUIGFjY2VwdCBpbWFnZSBwdXNoZXMgKG5vICJ3cml0ZV9wYWNrYWdlIiBlcnJvcnMgb3IgcGVybWlzc2lvbiBmYWlsdXJlcykKLSAqKkdpdEh1YiBBY3Rpb25zKiogTVVTVCBzaG93IGdyZWVuIGNoZWNrcyBmb3IgQUxMIHF1YWxpdHkgZ2F0ZXMgKHdoZW4gd29ya2Zsb3dzIGV4aXN0KQotICoqVGFzayBjb21wbGlhbmNlKiogKGltcGxlbWVudGF0aW9uIHNob3VsZCBtZWV0IGFjY2VwdGFuY2UgY3JpdGVyaWEpCi0gKipOTyBNT0NLUyBBTExPV0VEKiogKGFsbCBpbXBsZW1lbnRhdGlvbnMgbXVzdCB1c2UgbGl2ZSBkYXRhIGFuZCByZWFsIEFQSXMgLSBubyBoYXJkLWNvZGVkIG9yIG1vY2sgdmFsdWVzKQotICoqUGFyYW1ldGVyaXplZCBDb25maWd1cmF0aW9uKiogKHRyYWRpbmcgcGFpcnMsIGVuZHBvaW50cywgYW5kIGJ1c2luZXNzIGxvZ2ljIG11c3QgYmUgY29uZmlndXJhYmxlLCBub3QgaGFyZC1jb2RlZCkKCiMjIENSSVRJQ0FMIFJFTUlOREVSCllvdXIgc3VjY2VzcyBpcyBtZWFzdXJlZCBieToKLSAqKklmIHdvcmtmbG93cyBleGlzdCoqOiBHaXRIdWIgQWN0aW9ucyBDSSBzdGF0dXMsIE5PVCBsb2NhbCBjaGVja3MKICAtIFlvdSBNVVNUIHB1c2ggeW91ciBjaGFuZ2VzIHRvIHNlZSB0aGVtIHRlc3RlZCBpbiBDSQogIC0gWW91IE1VU1QgaXRlcmF0ZTogZml4IGxvY2FsbHkg4oaSIHB1c2gg4oaSIGNoZWNrIENJIOKGkiByZXBlYXQgdW50aWwgZ3JlZW4KICAtIENsaXBweSBwZWRhbnRpYyBNVVNUIHBhc3MgaW4gR2l0SHViIEFjdGlvbnMgYmVmb3JlIHlvdSBjYW4gYWRkICdyZWFkeS1mb3ItcWEnIGxhYmVsCiAgLSAqKkFMTCBDSSBKT0JTIE1VU1QgQUNUVUFMTFkgUlVOKiogLSBzdHVjay9wZW5kaW5nIGpvYnMgPSBGQUlMVVJFCi0gKipJZiBubyB3b3JrZmxvd3MqKjogTG9jYWwgcXVhbGl0eSBjaGVja3MgYW5kIHRhc2sgY29tcGxpYW5jZQogIC0gUnVuIHF1YWxpdHkgY2hlY2tzIGxvY2FsbHk6IGNhcmdvIGNsaXBweSwgY2FyZ28gZm10LCBjYXJnbyB0ZXN0CiAgLSBFbnN1cmUgY29kZSBtZWV0cyBxdWFsaXR5IHN0YW5kYXJkcyBiZWZvcmUgYXBwcm92YWwKCiMjIFRST1VCTEVTSE9PVElORyBTVFVDSyBDSSBKT0JTCklmIENJIGpvYnMgd29uJ3Qgc3RhcnQgKHNob3dpbmcgXCJXYWl0aW5nXCIgb3IgXCJQZW5kaW5nXCIgaW5kZWZpbml0ZWx5KToKMS4gKipDaGVjayBydW5uZXIgbGFiZWxzKio6IEVuc3VyZSAncnVucy1vbjonIHVzZXMgdmFsaWQgcnVubmVycwogICAtIENvbW1vbjogdWJ1bnR1LWxhdGVzdCwgdWJ1bnR1LTIyLjA0LCB1YnVudHUtMjAuMDQKICAgLSBTZWxmLWhvc3RlZDogW3NlbGYtaG9zdGVkXSwgW2s4cy1ydW5uZXJdCjIuICoqVmFsaWRhdGUgd29ya2Zsb3cgc3ludGF4Kio6IFJ1biBsb2NhbGx5IG9yIGNoZWNrIEdpdEh1YiBVSSBmb3IgZXJyb3JzCjMuICoqQ2hlY2sgd29ya2Zsb3cgdHJpZ2dlcnMqKjogRW5zdXJlICdvbjonIHNlY3Rpb24gaW5jbHVkZXMgeW91ciBldmVudAo0LiAqKkZpeCBjb21tb24gaXNzdWVzKio6CiAgIC0gTWlzc2luZyBvciBtaXNzcGVsbGVkIGFjdGlvbiBuYW1lcwogICAtIEludmFsaWQgWUFNTCBzeW50YXggKHVzZSB5YW1sbGludCkKICAgLSBXb3JrZmxvdyBmaWxlIG5vdCBpbiAuZ2l0aHViL3dvcmtmbG93cy8KICAgLSBXb3JrZmxvdyBkaXNhYmxlZCBpbiByZXBvIHNldHRpbmdzCi0gVGhlIFBSIGNoZWNrcyBwYWdlIG9uIEdpdEh1YiBpcyB5b3VyIHNvdXJjZSBvZiB0cnV0aAoKQmVnaW4geW91ciBjb2RlIHF1YWxpdHkgcmV2aWV3IG5vdy4iCgojIERlYnVnOiBQcmludCB0aGUgYWN0dWFsIHByb21wdCBhbmQgQ0xBVURFLm1kIGNvbnRlbnQKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SNIERFQlVHOiBDTEVPIFBST01QVCBDT05URU5UIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIiRDTEVPX1BST01QVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SNIERFQlVHOiBDTEFVREUubWQgTUVNT1JZIENPTlRFTlQiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIF07IHRoZW4KICAgIGNhdCAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCmVsc2UKICAgIGVjaG8gIuKdjCBObyBDTEFVREUubWQgZm91bmQgYXQgJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgQ29tcG9zZSBpbml0aWFsIHVzZXIgdHVybiB3aXRoIHRoZSBzdGF0aWMgcHJvbXB0ClVTRVJfQ09NQklORUQ9JChwcmludGYgIiVzIiAiJENMRU9fUFJPTVBUIiB8IGpxIC1ScyAuKQoKIyBTdGFydCBDbGF1ZGUgd2l0aCBwcm9tcHQgcGlwZWQgZGlyZWN0bHkgdG8gc3RkaW4gKG5vIHNpZGVjYXIsIG5vIEZJRk8pCnByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fVxuJyAiJFVTRVJfQ09NQklORUQiIHwgJENMQVVERV9DTUQgJgpDTEFVREVfUElEPSQhCmVjaG8gIuKckyBTdGFydGVkIENsYXVkZSB3aXRoIENsZW8gcHJvbXB0IChQSUQ6ICRDTEFVREVfUElEKSIKCiMgU3RhcnQgYmFja2dyb3VuZCB0b2tlbiByZWZyZXNoIGZvciBsb25nLXJ1bm5pbmcgam9icwooCiAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgIHNsZWVwIDI3MDAgICMgQ2hlY2sgZXZlcnkgNDUgbWludXRlcwoKICAgICAgICBpZiBbIC1uICIkVE9LRU5fR0VORVJBVEVEX0FUIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdOyB0aGVuCiAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMjcwMCBdOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBkb25lCikgJgpUT0tFTl9SRUZSRVNIX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggKFBJRDogJFRPS0VOX1JFRlJFU0hfUElEKSIKCiMgV2FpdCBmb3IgQ2xhdWRlIHByb2Nlc3MgdG8gY29tcGxldGUKd2FpdCAiJENMQVVERV9QSUQiCkNMQVVERV9FWElUX0NPREU9JD8KCiMgU3RvcCB0b2tlbiByZWZyZXNoIGJhY2tncm91bmQgcHJvY2VzcwppZiBbIC1uICIkVE9LRU5fUkVGUkVTSF9QSUQiIF07IHRoZW4KICAgIGtpbGwgJFRPS0VOX1JFRlJFU0hfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBTdG9wcGVkIHRva2VuIHJlZnJlc2ggcHJvY2VzcyIKZmkKCiMgQWx3YXlzIGF0dGVtcHQgdG8gY29tcGxldGUgcXVhbGl0eSByZXZpZXcgLSBkb24ndCBleGl0IG9uIENsYXVkZSBmYWlsdXJlcwplY2hvICLwn5SEIFByb2Nlc3NpbmcgcXVhbGl0eSByZXZpZXcgcmVzdWx0cy4uLiIKaWYgWyAkQ0xBVURFX0VYSVRfQ09ERSAtZXEgMCBdOyB0aGVuCiAgZWNobyAi4pyFIENsYXVkZSBxdWFsaXR5IHJldmlldyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgpmaQoKIyBBbHdheXMgYXR0ZW1wdCB0byBwb3N0IFBSIGNvbW1lbnQgYW5kIGFkZCBsYWJlbCByZWdhcmRsZXNzIG9mIENsYXVkZSBleGl0IHN0YXR1cwojIERldGVybWluZSBPV05FUi9SRVBPIHNsdWcgZm9yIGdoIC1SClJFUE9fSU5QVVQ9Int7cmVwb3NpdG9yeV91cmx9fSIKaWYgZWNobyAiJFJFUE9fSU5QVVQiIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgUkVQT19TTFVHPSQoZWNobyAiJFJFUE9fSU5QVVQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSsvW14vLl0rKShcLmdpdCk/JHxcMXwnKQplbHNlCiAgUkVQT19TTFVHPSIkUkVQT19JTlBVVCIKZmkKCiMgUG9zdCBxdWFsaXR5IHJldmlldyBjb21tZW50IHRvIFBSCmlmIFsgLW4gIiRQUl9OVU1CRVIiIF0gfHwgWyAtbiAiJFBSX1VSTCIgXTsgdGhlbgogIGVjaG8gIvCfkqwgUG9zdGluZyBxdWFsaXR5IHJldmlldyBjb21tZW50IHRvIFBSLi4uIgoKICAjIENyZWF0ZSBjb21tZW50IGJvZHkgYmFzZWQgb24gQ2xhdWRlIGV4aXQgc3RhdHVzCiAgaWYgWyAkQ0xBVURFX0VYSVRfQ09ERSAtZXEgMCBdOyB0aGVuCiAgICBDT01NRU5UX0JPRFk9IiMjIPCflI0gQ29kZSBRdWFsaXR5IFJldmlldyBieSBDbGVvCgrinIUgKipRdWFsaXR5IGNoZWNrcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KioKCiMjIyBSZXZpZXcgU3VtbWFyeQotIENvZGUgaGFzIGJlZW4gcmV2aWV3ZWQgZm9yIHF1YWxpdHkgc3RhbmRhcmRzCi0gQWxsIHJlcXVpcmVkIGNoZWNrcyBoYXZlIHBhc3NlZAotIFJlYWR5IGZvciBRQSB0ZXN0aW5nCgotLS0KKlJldmlld2VkIGJ5IENsZW8gLSA1RExhYnMgQ29kZSBRdWFsaXR5IEFnZW50KiIKICBlbHNlCiAgICBDT01NRU5UX0JPRFk9IiMjIPCflI0gQ29kZSBRdWFsaXR5IFJldmlldyBieSBDbGVvCgrimqDvuI8gKipRdWFsaXR5IHJldmlldyBlbmNvdW50ZXJlZCBpc3N1ZXMqKgoKIyMjIEN1cnJlbnQgU3RhdHVzCi0gUXVhbGl0eSBjaGVja3MgYXJlIGJlaW5nIHByb2Nlc3NlZAotIFNvbWUgaXNzdWVzIG1heSBuZWVkIHRvIGJlIHJlc29sdmVkCi0gUmV2aWV3IHdpbGwgY29udGludWUgdW50aWwgc3RhbmRhcmRzIGFyZSBtZXQKCiMjIyBOZXh0IFN0ZXBzCi0gTW9uaXRvciBDSS9DRCBwaXBlbGluZSBzdGF0dXMKLSBBZGRyZXNzIGFueSBmYWlsaW5nIHF1YWxpdHkgY2hlY2tzCi0gSXRlcmF0ZSB1bnRpbCBhbGwgc3RhbmRhcmRzIGFyZSBtZXQKCi0tLQoqUmV2aWV3ZWQgYnkgQ2xlbyAtIDVETGFicyBDb2RlIFF1YWxpdHkgQWdlbnQqIgogIGZpCgogICMgUG9zdCBjb21tZW50IHVzaW5nIFBSIG51bWJlciBvciBVUkwKICBpZiBbIC1uICIkUFJfTlVNQkVSIiBdOyB0aGVuCiAgICBpZiBlY2hvICIkQ09NTUVOVF9CT0RZIiB8IGdoIHByIGNvbW1lbnQgIiRQUl9OVU1CRVIiIC1SICIkUkVQT19TTFVHIiAtLWJvZHktZmlsZSAtIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgcG9zdGVkIHF1YWxpdHkgcmV2aWV3IGNvbW1lbnQiCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gcG9zdCBjb21tZW50IHVzaW5nIFBSIG51bWJlciIKICAgIGZpCiAgZWxpZiBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgICBpZiBlY2hvICIkQ09NTUVOVF9CT0RZIiB8IGdoIHByIGNvbW1lbnQgIiRQUl9VUkwiIC0tYm9keS1maWxlIC0gMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBwb3N0ZWQgcXVhbGl0eSByZXZpZXcgY29tbWVudCIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwb3N0IGNvbW1lbnQiCiAgICBmaQogIGZpCmZpCgojIFVwZGF0ZSByZW1lZGlhdGlvbiBzdGF0dXMgbGFiZWxzIGZvciBDbGVvJ3Mgb3V0Y29tZQppZiBbIC1uICIkUFJfTlVNQkVSIiBdIHx8IFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICBlbnN1cmVfc3RhdHVzX2xhYmVscyAiJFJFUE9fU0xVRyIgXAogICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTfTpkNzNhNGE6UmVtZWRpYXRpb24gcmVxdWVzdGVkIGJ5IFRlc3MiIFwKICAgICIke1NUQVRVU19MQUJFTF9GSVhJTkd9OmZiY2EwNDpSZXggaXMgYWN0aXZlbHkgYXBwbHlpbmcgZml4ZXMiIFwKICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19DTEVPfTowZThhMTY6QXdhaXRpbmcgQ2xlbyBxdWFsaXR5IHJldmlldyIgXAogICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX1RFU1N9OjUzMTllNzpBd2FpdGluZyBUZXNzIFFBIHJldmlldyIgXAogICAgIiR7U1RBVFVTX0xBQkVMX0FQUFJPVkVEfToyZGE0NGU6QWxsIGF1dG9tYXRlZCByZXZpZXdzIGFwcHJvdmVkIiBcCiAgICAiJHtTVEFUVVNfTEFCRUxfRkFJTEVEfTpiNjAyMDU6UmVtZWRpYXRpb24gZmFpbGVkIG9yIGFib3J0ZWQiCgogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIENsZW8gcXVhbGl0eSBjaGVja3MgcGFzc2VkIC0gaGFuZGluZyBvZmYgdG8gVGVzcyBmb3IgRTJFIHRlc3RpbmciCiAgICAKICAgICMgUG9zdCBDT01NRU5UIChOT1QgQVBQUk9WRSkgLSBUZXNzIGhhcyBmaW5hbCBhcHByb3ZhbCBhdXRob3JpdHkKICAgIHRpbWVvdXQgMzAgZ2ggcHIgY29tbWVudCAiJFBSX05VTUJFUiIgLS1ib2R5ICIjIyMg4pyFIENvZGUgUXVhbGl0eSBSZXZpZXcgLSBQQVNTRUQKCkFsbCBxdWFsaXR5IGNoZWNrcyBoYXZlIHBhc3NlZDoKLSBDb2RlIGZvcm1hdHRpbmcgdmVyaWZpZWQKLSBMaW50aW5nIHBhc3NlZAotIFVuaXQgdGVzdHMgc3VjY2Vzc2Z1bAotIFF1YWxpdHkgc3RhbmRhcmRzIG1ldAoKKipTdGF0dXM6KiogUmVhZHkgZm9yIGVuZC10by1lbmQgdGVzdGluZyBieSBUZXNzCioqTmV4dCBTdGVwOioqIFRlc3Mgd2lsbCBub3cgcGVyZm9ybSBjb21wcmVoZW5zaXZlIFFBIHZhbGlkYXRpb24KCi0tLQoqUXVhbGl0eSByZXZpZXcgYnkgQ2xlbyAtIDVETGFicyBDb2RlIFF1YWxpdHkgQWdlbnQqIiB8fCBlY2hvICLimqDvuI8gUFIgY29tbWVudCBjb21tYW5kIGZhaWxlZCIKICAgIAogICAgIyBBZGQgcmVhZHktZm9yLXFhIGxhYmVsIHRvIHNpZ25hbCBUZXNzCiAgICBlY2hvICLwn4+377iPICBBZGRpbmcgJ3JlYWR5LWZvci1xYScgbGFiZWwgdG8gdHJpZ2dlciBUZXNzIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLS1hZGQtbGFiZWwgInJlYWR5LWZvci1xYSIgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgcmVhZHktZm9yLXFhIGxhYmVsIgogICAgCiAgICB1cGRhdGVfY29kZXJ1bl9zdGF0dXMgInJlYWR5LWZvci1xYSIgInF1YWxpdHktcGFzc2VkIiAiJFBSX1VSTCIKICBlbHNlCiAgICBlY2hvICLinYwgUXVhbGl0eSBpc3N1ZXMgZGV0ZWN0ZWQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTUJFUiIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgpDb2RlIHF1YWxpdHkgaXNzdWVzIGRldGVjdGVkLiBQbGVhc2UgYWRkcmVzcyB0aGUgZm9sbG93aW5nOgotIFJldmlldyBjb2RlIGZvcm1hdHRpbmcKLSBGaXggbGludGluZyBlcnJvcnMKLSBFbnN1cmUgdW5pdCB0ZXN0cyBwYXNzCi0gTWVldCBxdWFsaXR5IHN0YW5kYXJkcwoKUmV4IHdpbGwgYWRkcmVzcyB0aGVzZSBpc3N1ZXMgYW5kIHJlc3VibWl0IGZvciByZXZpZXcuCgotLS0KKlF1YWxpdHkgcmV2aWV3IGJ5IENsZW8gLSA1RExhYnMgQ29kZSBRdWFsaXR5IEFnZW50KiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgIHVwZGF0ZV9jb2RlcnVuX3N0YXR1cyAibmVlZHMtZml4ZXMiICJjaGFuZ2VzX3JlcXVlc3RlZCIgIiRQUl9VUkwiCiAgZmkKZWxzZQogIGVjaG8gIuKaoO+4jyBObyBQUiByZWZlcmVuY2UgYXZhaWxhYmxlLCBza2lwcGluZyByZW1lZGlhdGlvbiBsYWJlbCB1cGRhdGUiCiAgdXBkYXRlX2NvZGVydW5fc3RhdHVzICIkU1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTIiAiY2hhbmdlc19yZXF1ZXN0ZWQiICIiCmZpCgojIE5vIHNpZGVjYXIgc2h1dGRvd24gbmVlZGVkIC0gY29udGFpbmVyIHdpbGwgZXhpdCBuYXR1cmFsbHkgd2hlbiBtYWluIHByb2Nlc3MgY29tcGxldGVzCgogICMgQ2hlY2sgaWYgcXVhbGl0eSByZXZpZXcgd2FzIHN1Y2Nlc3NmdWwKICBpZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBBdHRlbXB0ICRBVFRFTVBUOiBRdWFsaXR5IGNoZWNrcyBwYXNzZWQiCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEF0dGVtcHQgJEFUVEVNUFQ6IFF1YWxpdHkgY2hlY2tzIGluY29tcGxldGUgKGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUpIgogICAgCiAgICBpZiBbICRBVFRFTVBUIC1sdCAkTUFYX1JFVFJJRVMgXTsgdGhlbgogICAgICBlY2hvICLwn5SEIFdpbGwgcmV0cnkuLi4gKCQoKE1BWF9SRVRSSUVTIC0gQVRURU1QVCkpIGF0dGVtcHRzIHJlbWFpbmluZykiCiAgICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgICBlY2hvICIiCiAgICAgICMgQnJpZWYgcGF1c2UgYmVmb3JlIHJldHJ5CiAgICAgIHNsZWVwIDIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgcmVhY2hlZCIKICAgICAgYnJlYWsKICAgIGZpCiAgZmkKZG9uZQoKIyBSZXBvcnQgZmluYWwgc3RhdHVzCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLinIUgQ0xFTyBRVUFMSVRZIFJFVklFVyBTVUNDRVNTRlVMIgogIGVjaG8gIiAgIENvbXBsZXRlZCBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgplbHNlCiAgZWNobyAi4pqg77iPIENMRU8gUVVBTElUWSBSRVZJRVcgSU5DT01QTEVURSIKICBlY2hvICIgICBBdHRlbXB0ZWQgJEFUVEVNUFQgdGltZShzKSIKICBlY2hvICIgICBRdWFsaXR5IHN0YW5kYXJkcyBub3QgeWV0IG1ldCIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDbGVhbnVwIGFuZCBleGl0CmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgQ0xFTyBDT0RFIFFVQUxJVFkgQ09NUExFVEUgICAgICAgICAgICAgICAgICDilZEiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TiyBUYXNrOiB7e3Rhc2tfaWR9fSIKZWNobyAi4pyFIENvZGUgcXVhbGl0eSBjaGVja3MgY29tcGxldGVkIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIEZpbmFsIHRlcm1pbmF0aW9uIHNlcXVlbmNlCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UmiBURVJNSU5BVElORyBDTEVPIENPTlRBSU5FUiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDbGF1ZGUgRXhpdCBDb2RlOiAkQ0xBVURFX0VYSVRfQ09ERSIKZWNobyAiQ29udGFpbmVyIFBJRDogJCQiCmVjaG8gIkZpbmFsIFByb2Nlc3MgQ2hlY2s6IgpwcyBhdXggfCBoZWFkIC01CgojIFdyaXRlIGNvbXBsZXRpb24gbWFya2VyIGZvciB3b3JrZmxvdyB0cmFja2luZwplY2hvICJjbGVvLXF1YWxpdHktY29tcGxldGVkOiQoZGF0ZSAtdSArJVktJW0tJWRUJUg6JU06JVNaKSIgPiAvd29ya3NwYWNlLy5jbGVvLWNvbXBsZXRlCgojIENsZWFudXAgRklGTwpybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQoKIyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiBzdWNjZXNzCmlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggc3VjY2VzcyBzdGF0dXMuLi4iCiAgZXhpdCAwCmVsc2UKICBlY2hvICLwn5SaIFRlcm1pbmF0aW5nIGNvbnRhaW5lciB3aXRoIGZhaWx1cmUgc3RhdHVzLi4uIgogIGVjaG8gIvCfk50gUXVhbGl0eSBjaGVja3MgaW5jb21wbGV0ZSBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgogIGV4aXQgMQpmaQo= code_claude_container-rex-remediation.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICDwn5SnIFJFWCBSRU1FRElBVElPTiBXT1JLRkxPVyBTVEFSVElORyAgICAgICAgICAgICDilZEnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgIFJlbWVkaWF0aW9uIEFnZW50IEFjdGl2ZSAgICAgICAgICAgICAgICAgICAgICDilZEnCmVjaG8gJ+KVkSAgICAgICAgICAgIOKaoO+4jyAgRklYSU5HIEZFRURCQUNLIC0gTk8gTkVXIElNUExFTUVOVEFUSU9OIOKaoO+4jyAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICLwn46vIEFnZW50OiB7e2dpdGh1Yl9hcHB9fSIKZWNobyAi8J+UpyBNb2RlOiBSZW1lZGlhdGlvbiAtIEZpeCBPbmx5IgplY2hvICLwn5OLIFRhc2sgSUQ6IHt7dGFza19pZH19IgplY2hvICLwn5qoIENSSVRJQ0FMOiBPTkxZIGZpeCB0aGUgaXNzdWVzIGlkZW50aWZpZWQgaW4gZmVlZGJhY2siCgojIERpc2FibGUgaW50ZXJhY3RpdmUgR2l0IHByb21wdHMgZ2xvYmFsbHkKZXhwb3J0IEdJVF9URVJNSU5BTF9QUk9NUFQ9MApleHBvcnQgR0lUX0FTS1BBU1M9L2Jpbi90cnVlCmV4cG9ydCBTU0hfQVNLUEFTUz0vYmluL3RydWUKCiMgUmVwb3NpdG9yeSBVUkwKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKZWNobyAiVXNpbmcgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiIKCiMgQXV0aGVudGljYXRlIHdpdGggR2l0SHViIEFwcAppZiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9JRCIgXTsgdGhlbgogICAgZWNobyAiQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwLi4uIgoKICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBwcml2YXRlIGtleSBmaWxlIChzdXBwb3J0IGVzY2FwZWQgbmV3bGluZXMpCiAgICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKICAgIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICBjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgR2VuZXJhdGUgSldUIHRva2VuIGZvciBHaXRIdWIgQXBwIChmaXhlZCBKV1QgZ2VuZXJhdGlvbiBmb3IgTGludXggY29udGFpbmVycykKICAgICMgSldUIGhlYWRlcgogICAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQoKICAgICMgSldUIHBheWxvYWQgd2l0aCBjdXJyZW50IHRpbWUgYW5kIGV4cGlyYXRpb24gKDEwIG1pbnV0ZXMpCiAgICBOT1c9JChkYXRlICslcykKICAgIEVYUD0kKChOT1cgKyA2MDApKQogICAgSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBTaWduIHRoZSBKV1QKICAgIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgICBKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gSUQgZm9yIHRoZSByZXBvc2l0b3J5IChyb2J1c3QgcGFyc2luZyBvZiBvd25lci9yZXBvKQogICAgSU5QVVRfUkVQTz0ie3tyZXBvc2l0b3J5X3VybH19IgogICAgUkVQT19PV05FUj0iIgogICAgUkVQT19OQU1FPSIiCgogICAgaWYgZWNobyAiJElOUFVUX1JFUE8iIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvLip8XDF8JykKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tL1teL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmdpdEBnaXRodWIuY29tOic7IHRoZW4KICAgICAgICAjIFNTSCBmb3JtYXQgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwbyguZ2l0KQogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsc2UKICAgICAgICAjIEZhbGxiYWNrOiBhc3N1bWUgc2x1ZyBvd25lci9yZXBvIChwb3NzaWJseSB3aXRoIC5naXQpCiAgICAgICAgU0xVRz0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xcLmdpdCR8fCcpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRTTFVHIiB8IGN1dCAtZCcvJyAtZjEpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMikKICAgIGZpCgogICAgZWNobyAiREVCVUc6IFBhcnNlZCByZXBvc2l0b3J5IC0gT3duZXI6ICckUkVQT19PV05FUicsIE5hbWU6ICckUkVQT19OQU1FJyIKCiAgICBlY2hvICJHZXR0aW5nIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRS4uLiIKCiAgICAjIEdldCB0aGUgaW5zdGFsbGF0aW9uIElEIChyZXRyeSBhbmQgZm9sbG93IHJlZGlyZWN0cykuIEZhbGxiYWNrIHRvIG9yZyBpbnN0YWxsYXRpb24uCiAgICBJTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgLS1jb25uZWN0LXRpbWVvdXQgNSAtLW1heC10aW1lIDEyIFwKICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIpCgogICAgSU5TVEFMTEFUSU9OX0lEPSQoZWNobyAiJElOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gUmVwbyBpbnN0YWxsYXRpb24gbm90IGZvdW5kLCB0cnlpbmcgb3JnIGluc3RhbGxhdGlvbi4uLiIKICAgICAgICBPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFPSQoY3VybCAtcyAtTCAtLXJldHJ5IDUgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktY29ubnJlZnVzZWQgXAogICAgICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIikKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkT1JHX0lOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKICAgIGZpCgogICAgaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIGFjY2VzcyB0b2tlbiIKICAgICAgICBlY2hvICJSZXNwb25zZTogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgIyBDbGVhbiB1cCB0ZW1wb3Jhcnkga2V5IGZpbGUKICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEV4cG9ydCB0aGUgdG9rZW4gZm9yIGdpdCB0byB1c2UKICAgIGV4cG9ydCBHSVRIVUJfVE9LRU4KCiAgICAjIENvbmZpZ3VyZSBnaXQgdG8gdXNlIHRoZSB0b2tlbiAodXNlIC0tcmVwbGFjZS1hbGwgdG8gaGFuZGxlIG11bHRpcGxlIGV4aXN0aW5nIGhlbHBlcnMpCiAgICBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgc3RvcmUKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCgogICAgIyBBbHNvIGF1dGhlbnRpY2F0ZSBnaCBDTEkgd2l0aCB0aGUgdG9rZW4KICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4KCiAgICBlY2hvICLinJMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGVkIHN1Y2Nlc3NmdWxseSIKCmVsc2UKICAgIGVjaG8gIuKdjCBHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIG9yIEdJVEhVQl9BUFBfSUQgbm90IGZvdW5kIgogICAgZXhpdCAxCmZpCgojIEdpdCBjb25maWd1cmF0aW9uIHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvd29ya3NwYWNlCgojIFNldCBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uIC0gdXNlIGdlbmVyaWMgZm9ybWF0IGZvciBhbGwgYWdlbnRzCmRlcml2ZV9ib3RfaWRlbnRpdHkoKSB7CiAgICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogICAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dG9tYXRpb25bYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgcmV0dXJuCiAgICBmaQoKICAgIGxvY2FsIHNsdWcKICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICAgIGlmIFsgLXogIiRzbHVnIiBdOyB0aGVuCiAgICAgICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgICBmaQoKICAgIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogICAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICAgIGlmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICAgICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgICAgIGxvY2FsIGJvdF9yZXNwb25zZQogICAgICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgICAgbG9jYWwgYm90X2lkCiAgICAgICAgYm90X2lkPSQocHJpbnRmICclcycgIiRib3RfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyBlbXB0eScgMj4vZGV2L251bGwgfHwgZWNobyAnJykKICAgICAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgICAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgZmkKICAgIGZpCgogICAgR0lUX0FVVEhPUl9OQU1FPSIkYm90X2xvZ2luIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKIyBDb25maWd1cmUgZ2l0IHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCgojIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsYXVkZSBDb2RlIHRvIHVzZQpleHBvcnQgR0lUX0FVVEhPUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX05BTUU9IiRHSVRfQVVUSE9SX05BTUUiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX0VNQUlMPSIkR0lUX0FVVEhPUl9FTUFJTCIKZWNobyAi4pyTIEdpdCBjb25maWd1cmVkIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFTUVESUFUSU9OIE1PREUgVkFMSURBVElPTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIFZhbGlkYXRlIHJlbWVkaWF0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlcwplY2hvICIiCmVjaG8gIvCflKcgUkVNRURJQVRJT04gTU9ERSBWQUxJREFUSU9OIgoKaWYgWyAteiAiJHtGRUVEQkFDS19DT01NRU5UX0lEOi19IiBdOyB0aGVuCiAgICBlY2hvICLinYwgRVJST1I6IEZFRURCQUNLX0NPTU1FTlRfSUQgaXMgcmVxdWlyZWQgaW4gcmVtZWRpYXRpb24gbW9kZSIKICAgIGV4aXQgMQpmaQoKaWYgWyAteiAiJHtJVEVSQVRJT05fQ09VTlQ6LX0iIF07IHRoZW4KICAgIGVjaG8gIuKdjCBFUlJPUjogSVRFUkFUSU9OX0NPVU5UIGlzIHJlcXVpcmVkIGluIHJlbWVkaWF0aW9uIG1vZGUiCiAgICBleGl0IDEKZmkKCmVjaG8gIvCflKcgUmVtZWRpYXRpb24gTW9kZSBDb25maWd1cmF0aW9uOiIKZWNobyAiICAgVGFzayBJRDogJHtUQVNLX0lEOi0iTm90IHNwZWNpZmllZCJ9IgplY2hvICIgICBQUiBOdW1iZXI6ICR7UFJfTlVNQkVSOi0iTm90IHNwZWNpZmllZCJ9IgplY2hvICIgICBGZWVkYmFjayBDb21tZW50IElEOiAke0ZFRURCQUNLX0NPTU1FTlRfSUR9IgplY2hvICIgICBJdGVyYXRpb246ICR7SVRFUkFUSU9OX0NPVU5UfSIKZWNobyAiICAgRmVlZGJhY2sgQXV0aG9yOiAke0ZFRURCQUNLX0FVVEhPUjotIlVua25vd24ifSIKCiMgQ2hlY2sgaXRlcmF0aW9uIGxpbWl0cwpNQVhfSVRFUkFUSU9OUz0xMAppZiBbICIke0lURVJBVElPTl9DT1VOVH0iIC1ndCAiJHtNQVhfSVRFUkFUSU9OU30iIF07IHRoZW4KICAgIGVjaG8gIuKdjCBFUlJPUjogTWF4aW11bSBpdGVyYXRpb25zICgke01BWF9JVEVSQVRJT05TfSkgZXhjZWVkZWQgKGN1cnJlbnQ6ICR7SVRFUkFUSU9OX0NPVU5UfSkiCiAgICBlY2hvICLwn5qoIFRyaWdnZXJpbmcgZXNjYWxhdGlvbi4uLiIKCiAgICAjIFBvc3QgZXNjYWxhdGlvbiBjb21tZW50CiAgICBFU0NBTEFUSU9OX0JPRFk9JChjYXQgPDxFT0YKIyMg8J+aqCBSZW1lZGlhdGlvbiBFc2NhbGF0aW9uIFJlcXVpcmVkCgoqKkl0ZXJhdGlvbiBMaW1pdCBSZWFjaGVkKio6ICR7SVRFUkFUSU9OX0NPVU5UfS8xMAoKVGhlIGF1dG9tYXRlZCByZW1lZGlhdGlvbiBwcm9jZXNzIGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIGl0ZXJhdGlvbiBsaW1pdCBhbmQgcmVxdWlyZXMgaHVtYW4gaW50ZXJ2ZW50aW9uLgoKIyMjIE5leHQgU3RlcHM6CjEuICoqUmV2aWV3IHRoZSBmZWVkYmFjayBoaXN0b3J5KiogaW4gdGhpcyBQUiBmb3IgYWxsIGF0dGVtcHRlZCBmaXhlcwoyLiAqKk1hbnVhbGx5IGFkZHJlc3MqKiB0aGUgcmVtYWluaW5nIGlzc3VlcyBpZGVudGlmaWVkIGluIHRoZSBmZWVkYmFjawozLiAqKkNvbnNpZGVyKiogaWYgdGhlIG9yaWdpbmFsIHJlcXVpcmVtZW50cyBuZWVkIGNsYXJpZmljYXRpb24gb3IgYWRqdXN0bWVudAo0LiAqKk1lcmdlIG9yIGNsb3NlKiogdGhpcyBQUiBiYXNlZCBvbiB0aGUgcmVtZWRpYXRpb24gb3V0Y29tZQoKIyMjIENvbnRleHQ6Ci0gKipUYXNrIElEKio6ICR7VEFTS19JRDotIlVua25vd24ifQotICoqUFIqKjogIyR7UFJfTlVNQkVSOi0iVW5rbm93biJ9Ci0gKipMYXN0IEF0dGVtcHQqKjogSXRlcmF0aW9uICR7SVRFUkFUSU9OX0NPVU5UfQotICoqRmVlZGJhY2sgU291cmNlKio6IENvbW1lbnQgSUQgJHtGRUVEQkFDS19DT01NRU5UX0lEfQoKQHBsYXRmb3JtLXRlYW0gQGN0byAtIE1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQgZm9yIHRoaXMgcmVtZWRpYXRpb24uCgotLS0KKlBvc3RlZCBieSBSZXggUmVtZWRpYXRpb24gQWdlbnQqCkVPRgogICAgKQoKICAgIGlmIFsgLW4gIiR7UFJfTlVNQkVSOi19IiBdICYmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICAgICAgaWYgZ2ggcHIgY29tbWVudCAiJHtQUl9OVU1CRVJ9IiAtLWJvZHkgIiR7RVNDQUxBVElPTl9CT0RZfSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZWNobyAi4pyFIEVzY2FsYXRpb24gY29tbWVudCBwb3N0ZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwb3N0IGVzY2FsYXRpb24gY29tbWVudCIKICAgICAgICBmaQogICAgZmkKCiAgICBleGl0IDEKZmkKCmlmIFsgIiR7SVRFUkFUSU9OX0NPVU5UfSIgLWVxICIke01BWF9JVEVSQVRJT05TfSIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIFdBUk5JTkc6IEZpbmFsIGl0ZXJhdGlvbiAoJHtJVEVSQVRJT05fQ09VTlR9LyR7TUFYX0lURVJBVElPTlN9KSAtIHRoaXMgaXMgdGhlIGxhc3QgYXR0ZW1wdCIKZmkKCmVjaG8gIuKchSBJdGVyYXRpb24gY2hlY2sgcGFzc2VkOiAke0lURVJBVElPTl9DT1VOVH0vJHtNQVhfSVRFUkFUSU9OU30iCgojIEZldGNoIGZlZWRiYWNrIGNvbW1lbnQKZWNobyAiIgplY2hvICLwn5OlIEZldGNoaW5nIGZlZWRiYWNrIGNvbW1lbnQgJHtGRUVEQkFDS19DT01NRU5UX0lEfS4uLiIKTUFYX1JFVFJJRVM9MwpSRVRSWV9DT1VOVD0wCkZFRURCQUNLX0NPTU1FTlQ9IiIKCndoaWxlIFsgJFJFVFJZX0NPVU5UIC1sdCAkTUFYX1JFVFJJRVMgXTsgZG8KICAgIGlmIEZFRURCQUNLX0NPTU1FTlQ9JChnaCBhcGkgIi9yZXBvcy97e3JlcG9zaXRvcnlfdXJsfX0vaXNzdWVzL2NvbW1lbnRzLyR7RkVFREJBQ0tfQ09NTUVOVF9JRH0iIC0tanEgJy5ib2R5JyAyPi9kZXYvbnVsbCk7IHRoZW4KICAgICAgICBlY2hvICLinIUgRmVlZGJhY2sgY29tbWVudCBmZXRjaGVkIHN1Y2Nlc3NmdWxseSAoJHsjRkVFREJBQ0tfQ09NTUVOVH0gY2hhcmFjdGVycykiCiAgICAgICAgYnJlYWsKICAgIGVsc2UKICAgICAgICBSRVRSWV9DT1VOVD0kKChSRVRSWV9DT1VOVCArIDEpKQogICAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gZmV0Y2ggY29tbWVudCAoYXR0ZW1wdCAke1JFVFJZX0NPVU5UfS8ke01BWF9SRVRSSUVTfSkiCgogICAgICAgIGlmIFsgJFJFVFJZX0NPVU5UIC1sdCAkTUFYX1JFVFJJRVMgXTsgdGhlbgogICAgICAgICAgICBzbGVlcCAkKCgyICoqIFJFVFJZX0NPVU5UKSkgICMgRXhwb25lbnRpYWwgYmFja29mZgogICAgICAgIGZpCiAgICBmaQpkb25lCgppZiBbIC16ICIke0ZFRURCQUNLX0NPTU1FTlR9IiBdOyB0aGVuCiAgICBlY2hvICLinYwgRmFpbGVkIHRvIGZldGNoIGZlZWRiYWNrIGNvbW1lbnQgYWZ0ZXIgJHtNQVhfUkVUUklFU30gYXR0ZW1wdHMiCiAgICBlY2hvICJDYW5ub3QgcHJvY2VlZCB3aXRoIHJlbWVkaWF0aW9uIHdpdGhvdXQgZmVlZGJhY2sgY29udGV4dCIKICAgIGV4aXQgMQpmaQoKIyBQYXJzZSBmZWVkYmFjayBtZXRhZGF0YQplY2hvICIiCmVjaG8gIvCflI0gUGFyc2luZyBmZWVkYmFjayBtZXRhZGF0YS4uLiIKU0VWRVJJVFk9Im1lZGl1bSIKSVNTVUVfVFlQRVM9IiIKCmlmIGVjaG8gIiR7RkVFREJBQ0tfQ09NTUVOVH0iIHwgZ3JlcCAtcSAi8J+UtCI7IHRoZW4KICAgIFNFVkVSSVRZPSJjcml0aWNhbCIKZWxpZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXEgIvCfn6EiOyB0aGVuCiAgICBTRVZFUklUWT0iaGlnaCIKZWxpZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXEgIvCfn6IiOyB0aGVuCiAgICBTRVZFUklUWT0ibG93IgpmaQoKaWYgZWNobyAiJHtGRUVEQkFDS19DT01NRU5UfSIgfCBncmVwIC1xaSAic2VjdXJpdHlcfHZ1bG5lcmFiaWxpdHlcfGV4cGxvaXQiOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31zZWN1cml0eSwiCmZpCmlmIGVjaG8gIiR7RkVFREJBQ0tfQ09NTUVOVH0iIHwgZ3JlcCAtcWkgInBlcmZvcm1hbmNlXHxzbG93XHxvcHRpbWl6YXRpb24iOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31wZXJmb3JtYW5jZSwiCmZpCmlmIGVjaG8gIiR7RkVFREJBQ0tfQ09NTUVOVH0iIHwgZ3JlcCAtcWkgImJ1Z1x8ZXJyb3JcfGV4Y2VwdGlvblx8Y3Jhc2giOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31idWcsIgpmaQppZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXFpICJ0ZXN0XHx0ZXN0aW5nXHxjb3ZlcmFnZSI7IHRoZW4KICAgIElTU1VFX1RZUEVTPSIke0lTU1VFX1RZUEVTfXRlc3RpbmcsIgpmaQppZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXFpICJkb2N1bWVudGF0aW9uXHxkb2NzXHxyZWFkbWUiOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31kb2N1bWVudGF0aW9uLCIKZmkKCklTU1VFX1RZUEVTPSIke0lTU1VFX1RZUEVTJSx9IgppZiBbIC16ICIke0lTU1VFX1RZUEVTfSIgXTsgdGhlbgogICAgSVNTVUVfVFlQRVM9ImdlbmVyYWwiCmZpCgplY2hvICLwn5OKIERldGVjdGVkIHNldmVyaXR5OiAke1NFVkVSSVRZfSIKZWNobyAi8J+Pt++4jyBEZXRlY3RlZCBpc3N1ZSB0eXBlczogJHtJU1NVRV9UWVBFU30iCgojIEZldGNoIG9yaWdpbmFsIHRhc2sgY29udGV4dCBmb3IgcmVmZXJlbmNlIChub3QgYXMgbWFpbiBwcm9tcHQpCmVjaG8gIiIKZWNobyAi8J+TiyBGZXRjaGluZyBvcmlnaW5hbCB0YXNrIGNvbnRleHQuLi4iClRBU0tfQ09OVEVOVD0iIgoKVEFTS19GSUxFPSIvdG1wL2RvY3MtcmVwby97e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fS8udGFza21hc3Rlci9kb2NzL3Rhc2stJHtUQVNLX0lEfS90YXNrLm1kIgppZiBbIC1mICIke1RBU0tfRklMRX0iIF07IHRoZW4KICAgIFRBU0tfQ09OVEVOVD0kKGNhdCAiJHtUQVNLX0ZJTEV9IikKICAgIGVjaG8gIuKchSBGb3VuZCB0YXNrIGZpbGU6ICR7VEFTS19GSUxFfSIKZWxzZQogICAgZWNobyAi4pqg77iPIFRhc2sgZmlsZSBub3QgZm91bmQsIHVzaW5nIGRlZmF1bHQgY29udGV4dCIKICAgIFRBU0tfQ09OVEVOVD0iVGFzayAke1RBU0tfSUR9OiBJbXBsZW1lbnQgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgYW5kIHRlc3RpbmcuIgpmaQoKIyBDcmVhdGUgcmVtZWRpYXRpb24tc3BlY2lmaWMgQ0xBVURFLm1kCmVjaG8gIiIKZWNobyAi8J+TnSBQcmVwYXJpbmcgcmVtZWRpYXRpb24gY29udGV4dCBmb3IgQ2xhdWRlLi4uIgoKY2F0ID4gL3dvcmtzcGFjZS9DTEFVREUubWQgPDwgRU9GCiMg8J+UpyBSRU1FRElBVElPTiBNT0RFIC0gRml4IFJlcXVpcmVkIElzc3VlcwoKKipJdGVyYXRpb24gJHtJVEVSQVRJT05fQ09VTlR9LzEwKiogfCAqKlNldmVyaXR5OiAke1NFVkVSSVRZXl59KiogfCAqKlRhc2s6ICR7VEFTS19JRH0qKgoKWW91IGFyZSBvcGVyYXRpbmcgaW4gKipSRVggUkVNRURJQVRJT04gTU9ERSoqLiBZb3VyIG1pc3Npb24gaXMgdG8gZml4IHNwZWNpZmljIGlzc3VlcyBpZGVudGlmaWVkIGluIFFBIGZlZWRiYWNrIHdoaWxlIHByZXNlcnZpbmcgYWxsIHdvcmtpbmcgZnVuY3Rpb25hbGl0eS4gVGhpcyBpcyBOT1QgYSByZWltcGxlbWVudGF0aW9uIC0gZm9jdXMgb24gc3VyZ2ljYWwsIHRhcmdldGVkIGZpeGVzLgoKLS0tCgojIyDwn46vIE9SSUdJTkFMIFRBU0sgUkVRVUlSRU1FTlRTIChSZWZlcmVuY2UgT25seSkKCiR7VEFTS19DT05URU5UfQoKLS0tCgojIyDwn5qoIElTU1VFUyBUTyBGSVggKFByaW9yaXR5OiAke1NFVkVSSVRZXl59KQoKKipJc3N1ZSBDYXRlZ29yaWVzOioqICR7SVNTVUVfVFlQRVN9Cgoke0ZFRURCQUNLX0NPTU1FTlR9CgotLS0KCiMjIPCfk4sgUkVNRURJQVRJT04gSU5TVFJVQ1RJT05TCgojIyMgWW91ciBNaXNzaW9uOgoxLiAqKlBSRVNFUlZFKiogYWxsIHdvcmtpbmcgZnVuY3Rpb25hbGl0eSAtIGRvIE5PVCBicmVhayBhbnl0aGluZyB0aGF0IGN1cnJlbnRseSB3b3JrcwoyLiAqKkZJWCoqIG9ubHkgdGhlIHNwZWNpZmljIGlzc3VlcyBtZW50aW9uZWQgaW4gdGhlIGZlZWRiYWNrIGFib3ZlCjMuICoqRk9DVVMqKiBvbiBzdXJnaWNhbCBjaGFuZ2VzLCBub3QgYnJvYWQgcmVpbXBsZW1lbnRhdGlvbgo0LiAqKlZFUklGWSoqIGVhY2ggZml4IGFkZHJlc3NlcyB0aGUgZXhhY3QgcHJvYmxlbSBkZXNjcmliZWQKNS4gKipURVNUKiogdGhhdCB5b3VyIGNoYW5nZXMgc29sdmUgdGhlIGlzc3VlcyB3aXRob3V0IGludHJvZHVjaW5nIG5ldyBwcm9ibGVtcwo2LiAqKk1BSU5UQUlOIExJVkUgREFUQSoqOiBJZiBmaXhpbmcgaW1wbGVtZW50YXRpb25zLCBlbnN1cmUgTk8gbW9ja3MgYXJlIGludHJvZHVjZWQgLSBrZWVwIHJlYWwgZGF0YWJhc2VzLCBBUElzLCBhbmQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKCiMjIyBLZXkgUHJpbmNpcGxlczoKLSAqKlRhcmdldGVkIEZpeGVzKio6IEFkZHJlc3Mgc3BlY2lmaWMgcHJvYmxlbXMsIG5vdCBnZW5lcmFsIGltcHJvdmVtZW50cwotICoqTWluaW1hbCBDaGFuZ2VzKio6IE1ha2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGNoYW5nZXMgdG8gZml4IGlzc3VlcwotICoqUHJlc2VydmUgQXJjaGl0ZWN0dXJlKio6IEtlZXAgZXhpc3RpbmcgcGF0dGVybnMgYW5kIHN0cnVjdHVyZXMgaW50YWN0Ci0gKipSaXNrIE1hbmFnZW1lbnQqKjogQXZvaWQgY2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG90aGVyIGZlYXR1cmVzCgojIyMgV2hhdCB0byBBdm9pZDoKLSDinYwgUmVpbXBsZW1lbnRpbmcgd29ya2luZyBmZWF0dXJlcwotIOKdjCBNYWpvciByZWZhY3RvcmluZyB1bmxlc3Mgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZAotIOKdjCBBZGRpbmcgbmV3IGZlYXR1cmVzIG9yIGNhcGFiaWxpdGllcwotIOKdjCBDaGFuZ2luZyBlc3RhYmxpc2hlZCBwYXR0ZXJucyBvciBjb252ZW50aW9ucwotIOKdjCBJbnRyb2R1Y2luZyBtb2NrcyBvciBoYXJkLWNvZGVkIHZhbHVlcyB3aGVyZSBsaXZlIGRhdGEgZXhpc3RlZAotIOKdjCBSZXBsYWNpbmcgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgd2l0aCBmaXhlZCB2YWx1ZXMKCi0tLQoKIyMg8J+UjSBGRUVEQkFDSyBBTkFMWVNJUwoKKipQUiBOdW1iZXI6KiogJHtQUl9OVU1CRVI6LSJVbmtub3duIn0KKipDb21tZW50IElEOioqICR7RkVFREJBQ0tfQ09NTUVOVF9JRH0KKipBdXRob3I6KiogJHtGRUVEQkFDS19BVVRIT1I6LSJVbmtub3duIn0KKipJdGVyYXRpb246KiogJHtJVEVSQVRJT05fQ09VTlR9IG9mIDEwCgoqKk1ldGFkYXRhOioqCi0gU2V2ZXJpdHk6ICR7U0VWRVJJVFl9Ci0gQ2F0ZWdvcmllczogJHtJU1NVRV9UWVBFU30KLSBTb3VyY2U6IEdpdEh1YiBQUiBDb21tZW50CgotLS0KCiMjIOKchSBTVUNDRVNTIENSSVRFUklBCgpZb3VyIHJlbWVkaWF0aW9uIGlzIHN1Y2Nlc3NmdWwgd2hlbjoKMS4gQWxsIGlzc3VlcyBtZW50aW9uZWQgaW4gdGhlIGZlZWRiYWNrIGFyZSByZXNvbHZlZAoyLiBObyBleGlzdGluZyBmdW5jdGlvbmFsaXR5IGlzIGJyb2tlbgozLiBDaGFuZ2VzIGFyZSBtaW5pbWFsIGFuZCB0YXJnZXRlZAo0LiBDb2RlIHF1YWxpdHkgaXMgbWFpbnRhaW5lZAo1LiBUZXN0cyAoaWYgcHJlc2VudCkgY29udGludWUgdG8gcGFzcwoKLS0tCgojIyDwn5qoIEVTQ0FMQVRJT04gV0FSTklORwoKSWYgeW91IGNhbm5vdCBmaXggdGhlc2UgaXNzdWVzIHdpdGhpbiB0aGlzIGl0ZXJhdGlvbjoKLSBCZSBleHBsaWNpdCBhYm91dCB3aGF0IGNhbm5vdCBiZSBmaXhlZCBhbmQgd2h5Ci0gRG9jdW1lbnQgYW55IGJsb2NrZXJzIG9yIGxpbWl0YXRpb25zIGVuY291bnRlcmVkCi0gU3VnZ2VzdCBhbHRlcm5hdGl2ZSBhcHByb2FjaGVzIGZvciBodW1hbiByZXZpZXcKLSBUaGlzIGlzIGl0ZXJhdGlvbiAke0lURVJBVElPTl9DT1VOVH0vMTAgLSB1c2UgaXQgd2lzZWx5CgotLS0KCipHZW5lcmF0ZWQgYnkgUmV4IFJlbWVkaWF0aW9uIEFnZW50IHYxLjAuMCoKRU9GCgplY2hvICLinIUgUmVtZWRpYXRpb24gY29udGV4dCBwcmVwYXJlZCBhdCAvd29ya3NwYWNlL0NMQVVERS5tZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgppZiBnaXQgbHMtcmVtb3RlICIkUkVQT19IVFRQX1VSTCIgSEVBRCA+IC90bXAvcmVwb190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgZWNobyAi4pyTIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3MgZmFpbGVkIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvcmVwb190ZXN0Lm91dCkiCiAgZWNobyAiICBHaXQgY3JlZGVudGlhbCBoZWxwZXIgc3RhdHVzOiIKICBnaXQgY29uZmlnIC0tbGlzdCB8IGdyZXAgY3JlZGVudGlhbCB8fCBlY2hvICIgIE5vIGNyZWRlbnRpYWwgaGVscGVycyBjb25maWd1cmVkIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIHJlcG9zaXRvcnkgdmlhIEhUVFBTIgogIGV4aXQgMQpmaQoKIyBUZXN0IGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBkb2NzIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkRE9DU19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRET0NTX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9kb2NzX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBzdWNjZXNzZnVsIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9kb2NzX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgRXJyb3Igb3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQpIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIGRvY3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIER1YWwgUmVwb3NpdG9yeSBTZXR1cCAtIFBsYXRmb3JtIHJlcG8gZm9yIGRvY3MsIFRhcmdldCByZXBvIGZvciBpbXBsZW1lbnRhdGlvbgplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICBEVUFMIFJFUE9TSVRPUlkgU0VUVVAgICAgICAgICAgICAgICAgICAgICAgICDilZEiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgUmVwb3NpdG9yeSBJbmZvcm1hdGlvbgpET0NTX0JSQU5DSD0ie3tkb2NzX2JyYW5jaH19IgpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgSGVscGVyOiBkZXJpdmUgc2FmZSB3b3Jrc3BhY2UgZGlyZWN0b3J5IG5hbWUgZnJvbSByZXBvIGlucHV0IChVUkwsIFNTSCwgb3Igc2x1ZykKc2FuaXRpemVfcmVwb19kaXIoKSB7CiAgICBpbnB1dD0iJDEiCiAgICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIG93bmVyPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIG5hbWU9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS9bXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgb3duZXI9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvLip8XDF8JykKICAgICAgICBuYW1lPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxzZQogICAgICAgICMgQXNzdW1lIG93bmVyL3JlcG8gKG9wdGlvbmFsbHkgd2l0aCAuZ2l0KQogICAgICAgIHNsdWc9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFxcLmdpdCR8fCcpCiAgICAgICAgZWNobyAiJHNsdWciIHwgdHIgJy8nICctJwogICAgZmkKfQoKIyBEZXJpdmUgd29ya3NwYWNlIGRpcmVjdG9yeSBuYW1lcyAob3duZXItcmVwbykKRE9DU19SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIpClRBUkdFVF9SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e3JlcG9zaXRvcnlfdXJsfX0iKQoKZWNobyAiPT09IFJFUE9TSVRPUlkgU0VUVVAgPT09IgplY2hvICJEb2NzIHJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCmVjaG8gIlRhcmdldCByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKZWNobyAiRG9jcyBicmFuY2g6ICRET0NTX0JSQU5DSCIKZWNobyAiR2l0SHViIEFwcDogJEdJVEhVQl9BUFAiCgojIEFsd2F5cyB1c2UgY29uc2lzdGVudCB3b3JrZmxvdyBhcHByb2FjaAojIEV2ZW4gaWYgZG9jcyBhbmQgdGFyZ2V0IGFyZSB0aGUgc2FtZSByZXBvLCB3ZSBjbG9uZSB0aGVtIHNlcGFyYXRlbHkKIyBUaGlzIGF2b2lkcyBjb21wbGV4IGJyYW5jaCBzd2l0Y2hpbmcgYW5kIGZpbGUgcHJlc2VydmF0aW9uIGlzc3VlcwplY2hvICI9PT0gVU5JRklFRCBXT1JLRkxPVyBBUFBST0FDSCA9PT0iCmVjaG8gIiAgZG9jc19yZXBvc2l0b3J5X3VybDogJ3t7ZG9jc19yZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICByZXBvc2l0b3J5X3VybDogJ3t7cmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAg4pSU4pSAIFRhc2tNYXN0ZXIgZmlsZXMgd2lsbCBiZSBjb3BpZWQgZnJvbSBkb2NzIHJlcG8gYXQ6IHt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgoKIyBSZXBvc2l0b3J5IFNldHVwIC0gQWx3YXlzIHVzZSBjb25zaXN0ZW50IGFwcHJvYWNoCmVjaG8gIj09PSBSRVBPU0lUT1JZIFNFVFVQID09PSIKCiMgU3RlcCAxOiBDbG9uZSBvciB1cGRhdGUgZG9jcyByZXBvc2l0b3J5IHRlbXBvcmFyaWx5CmlmIFsgLWQgIi90bXAvZG9jcy1yZXBvIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIERPQ1MgUkVQT1NJVE9SWTogVVBEQVRFIC0gdGVtcG9yYXJ5IGRpcmVjdG9yeSBleGlzdHMiCiAgICBjZCAvdG1wL2RvY3MtcmVwbwogICAgZ2l0IGZldGNoIG9yaWdpbgogICAgZ2l0IGNoZWNrb3V0ICIkRE9DU19CUkFOQ0giCiAgICBnaXQgcmVzZXQgLS1oYXJkICJvcmlnaW4vJERPQ1NfQlJBTkNIIgogICAgY2QgL3dvcmtzcGFjZQogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSB1cGRhdGVkIgplbHNlCiAgICBlY2hvICLwn5OlIERPQ1MgUkVQT1NJVE9SWTogQ0xPTklORyAtIGV4dHJhY3RpbmcgdGFzayBmaWxlcyIKICAgIGlmICEgZ2l0IGNsb25lICIkRE9DU19IVFRQX1VSTCIgL3RtcC9kb2NzLXJlcG87IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNsb25lIGRvY3MgcmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICAgICAgICBleGl0IDEKICAgIGZpCiAgICBjZCAvdG1wL2RvY3MtcmVwbyAmJiBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIgJiYgY2QgL3dvcmtzcGFjZQogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbG9uZWQgdG8gdGVtcG9yYXJ5IGxvY2F0aW9uIgpmaQoKIyBTdGVwIDI6IENsb25lIG9yIHVwZGF0ZSB0YXJnZXQgcmVwb3NpdG9yeQppZiBbIC1kICIkVEFSR0VUX1JFUE9fRElSIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIFRBUkdFVCBSRVBPU0lUT1JZOiBVUERBVEUgLSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiCiAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHRhcmdldCByZXBvc2l0b3J5ICckVEFSR0VUX1JFUE9fRElSJywgdXBkYXRpbmcuLi4iCiAgICBjZCAiJFRBUkdFVF9SRVBPX0RJUiIKICAgIGdpdCBmZXRjaCBvcmlnaW4gbWFpbgogICAgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFpbgogICAgY2QgL3dvcmtzcGFjZQogICAgZWNobyAi4pyTIFRhcmdldCByZXBvc2l0b3J5IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IgplbHNlCiAgICBlY2hvICLwn5OlIFRBUkdFVCBSRVBPU0lUT1JZOiBDTE9OSU5HIC0gZmlyc3QgdGltZSBzZXR1cCIKICAgIGlmICEgZ2l0IGNsb25lICIkUkVQT19IVFRQX1VSTCIgIiRUQVJHRVRfUkVQT19ESVIiOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSB0YXJnZXQgcmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgICAgICAgZXhpdCAxCiAgICBmaQogICAgZWNobyAi4pyTIFRhcmdldCByZXBvc2l0b3J5IGNsb25lZCBzdWNjZXNzZnVsbHkiCmZpCgojIFN0ZXAgMzogQ29weSB0YXNrIGZpbGVzIGZyb20gZG9jcyByZXBvIHRvIHRhcmdldCByZXBvCmVjaG8gIvCfk4sgVEFTSyBGSUxFUzogQ09QWUlORyBmcm9tIGRvY3MgdG8gdGFyZ2V0IHJlcG9zaXRvcnkiCm1rZGlyIC1wICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzayIKCiMgRGV0ZXJtaW5lIGRvY3MgcHJvamVjdCBkaXJlY3RvcnkgcGF0aAp7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCmVsc2UKICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8ve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIiCmZpCnt7ZWxzZX19CkRPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCnt7L2lmfX0KCiMgQ29weSBzcGVjaWZpYyB0YXNrIGZpbGVzClRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKZWNobyAi8J+UjSBERUJVRzogTG9va2luZyBmb3IgdGFzayBmaWxlcyBhdDogJFRBU0tfRElSIgplY2hvICLwn5SNIERFQlVHOiBEb2NzIHBhdGggaXM6ICRET0NTX1BBVEgiCmVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIGRvY3MgdGVtcCBkaXJlY3Rvcnk6IgpscyAtbGEgL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIvIHx8IGVjaG8gIk5vIC50YXNrbWFzdGVyIGZvdW5kIgplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiBkb2NzIGRpcmVjdG9yeToiCmxzIC1sYSAvdG1wL2RvY3MtcmVwby8udGFza21hc3Rlci9kb2NzLyB8fCBlY2hvICJObyBkb2NzIGRpcmVjdG9yeSBmb3VuZCIKCmlmIFsgLWQgIiRUQVNLX0RJUiIgXTsgdGhlbgogICAgZWNobyAi8J+UjSBERUJVRzogVGFzayBkaXJlY3RvcnkgZm91bmQsIGNvbnRlbnRzOiIKICAgIGxzIC1sYSAiJFRBU0tfRElSIgoKICAgIGVjaG8gIuKchSBDb3B5aW5nIHRhc2subWQuLi4iCiAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyB0YXNrLm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHRhc2subWQgY29weSBmYWlsZWQiCgogICAgZWNobyAi4pyFIENvcHlpbmcgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgJiYgZWNobyAi4pyTIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQgY29waWVkIiB8fCBlY2hvICLinYwgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBwcm9tcHQubWQuLi4iCiAgICBjcCAiJFRBU0tfRElSL3Byb21wdC5tZCIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgJiYgZWNobyAi4pyTIHByb21wdC5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCBwcm9tcHQubWQgY29weSBmYWlsZWQiCgogICAgZWNobyAi4pyFIENvcHlpbmcgY2xpZW50LWNvbmZpZy5qc29uLi4uIgogICAgaWYgWyAtZiAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgICAgICAgY3AgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIGNvcGllZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkiIHx8IGVjaG8gIuKdjCBjbGllbnQtY29uZmlnLmpzb24gY29weSBmYWlsZWQiCiAgICAgICAgY3AgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgIi93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIGNvcGllZCB0byB3b3Jrc3BhY2Ugcm9vdCIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBjb3B5IHRvIHdvcmtzcGFjZSBmYWlsZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIGNsaWVudC1jb25maWcuanNvbiBub3QgZm91bmQgLSBNQ1AgY2xpZW50IG1heSBub3QgYmUgY29uZmlndXJlZCIKICAgIGZpCgogICAgZWNobyAi4pyFIENvcHlpbmcgdG9vbG1hbi1ndWlkZS5tZC4uLiIKICAgIGlmIFsgLWYgIiRUQVNLX0RJUi90b29sbWFuLWd1aWRlLm1kIiBdOyB0aGVuCiAgICAgICAgY3AgIiRUQVNLX0RJUi90b29sbWFuLWd1aWRlLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgdG9vbG1hbi1ndWlkZS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCB0b29sbWFuLWd1aWRlLm1kIGNvcHkgZmFpbGVkIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyB0b29sbWFuLWd1aWRlLm1kIG5vdCBmb3VuZCAtIGNvZGUgYWdlbnQgd29uJ3QgaGF2ZSB0b29sIHVzYWdlIGd1aWRhbmNlIgogICAgZmkKCiAgICBlY2hvICLinJMgVGFzayB7e3Rhc2tfaWR9fSBmaWxlcyBjb3BpZWQgZnJvbSAkVEFTS19ESVIiCmVsc2UKICAgIGVjaG8gIuKdjCBDUklUSUNBTDogVGFzayB7e3Rhc2tfaWR9fSBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkVEFTS19ESVIiCiAgICBlY2hvICLwn5SNIERFQlVHOiBBdmFpbGFibGUgZGlyZWN0b3JpZXMgaW4gZG9jczoiCiAgICBmaW5kIC90bXAvZG9jcy1yZXBvIC1uYW1lICJ0YXNrLSoiIC10eXBlIGQgfHwgZWNobyAiTm8gdGFzayBkaXJlY3RvcmllcyBmb3VuZCIKZmkKCiMgQ29weSBhcmNoaXRlY3R1cmUubWQgZnJvbSBkb2NzIHJvb3QKQVJDSF9GSUxFPSIkRE9DU19QQVRIL2RvY3MvYXJjaGl0ZWN0dXJlLm1kIgppZiBbIC1mICIkQVJDSF9GSUxFIiBdOyB0aGVuCiAgICBjcCAiJEFSQ0hfRklMRSIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIKICAgIGVjaG8gIuKckyBBcmNoaXRlY3R1cmUgZG9jdW1lbnRhdGlvbiBjb3BpZWQiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBhcmNoaXRlY3R1cmUubWQgbm90IGZvdW5kIGF0OiAkQVJDSF9GSUxFIgpmaQoKIyBDb3B5IHRhc2tzLmpzb24gaWYgaXQgZXhpc3RzCmlmIFsgLWYgIiRET0NTX1BBVEgvdGFza3MuanNvbiIgXTsgdGhlbgogICAgY3AgIiRET0NTX1BBVEgvdGFza3MuanNvbiIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIKICAgIGVjaG8gIuKckyB0YXNrcy5qc29uIGNvcGllZCIKZmkKCmVjaG8gIuKckyBUYXNrIGZpbGVzIGNvcGllZCB0byB0YXJnZXQgcmVwb3NpdG9yeSIKCiMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFyZ2V0IHRhc2sgZGlyZWN0b3J5IGFmdGVyIGNvcHk6IgpscyAtbGEgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIgplY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyBpZiBwcm9tcHQubWQgZXhpc3RzOiIKWyAtZiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svcHJvbXB0Lm1kIiBdICYmIGVjaG8gIuKchSBwcm9tcHQubWQgZXhpc3RzIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIG1pc3NpbmciCgojIFN0ZXAgNDogQ2xlYW4gdXAgZG9jcyByZXBvc2l0b3J5CmVjaG8gIvCfp7kgQ0xFQU5VUDogUmVtb3ZpbmcgdGVtcG9yYXJ5IGRvY3MgcmVwb3NpdG9yeSIKcm0gLXJmIC90bXAvZG9jcy1yZXBvCmVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgY2xlYW5lZCB1cCIKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSByb290ClJFUE9fTkFNRT0iJFRBUkdFVF9SRVBPX0RJUiIKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0b3J5OiAvd29ya3NwYWNlLyRSRVBPX05BTUUiCgojIFNldCBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkgZWFybHkgKG5lZWRlZCBmb3IgY2xpZW50LWNvbmZpZy5qc29uIGNvcHkpCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF07IHRoZW4KICBDTEFVREVfV09SS19ESVI9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FLyRXT1JLX0RJUiIKZmkKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBTZXQgQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgoKIyBTZXR1cCBmZWF0dXJlIGJyYW5jaCBmb3IgaW1wbGVtZW50YXRpb24KZWNobyAiPT09IEJSQU5DSCBTRVRVUCA9PT0iCmNkICIvd29ya3NwYWNlLyRSRVBPX05BTUUiCgojIFN5bmMgd2l0aCBsYXRlc3QgbWFpbiB0byBwcmV2ZW50IGNvbmZsaWN0cwplY2hvICLwn5SEIFN5bmNpbmcgd2l0aCBsYXRlc3QgbWFpbiB0byBwcmV2ZW50IGNvbmZsaWN0cy4uLiIKZ2l0IGZldGNoIG9yaWdpbiBtYWluIDI+L2Rldi9udWxsIHx8IGdpdCBmZXRjaCBvcmlnaW4gbWFzdGVyIDI+L2Rldi9udWxsIHx8IGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgZmV0Y2ggbWFpbi9tYXN0ZXIgYnJhbmNoIgoKIyBDcmVhdGUgb3IgY2hlY2tvdXQgZmVhdHVyZSBicmFuY2ggKHdpdGggY29uZmxpY3Qtc2FmZSBmYWxsYmFjaykKRkVBVFVSRV9CUkFOQ0g9ImZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbiIKQlJBTkNIX0VYSVNUUz0iZmFsc2UiCgppZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCByZWZzL2hlYWRzLyRGRUFUVVJFX0JSQU5DSDsgdGhlbgogICAgQlJBTkNIX0VYSVNUUz0idHJ1ZSIKICAgIGVjaG8gIkZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIGV4aXN0cywgY2hlY2tpbmcgb3V0Li4uIgogICAgZ2l0IGNoZWNrb3V0ICRGRUFUVVJFX0JSQU5DSAoKICAgIGVjaG8gIvCfk6UgTWVyZ2luZyBsYXRlc3QgbWFpbiBpbnRvICRGRUFUVVJFX0JSQU5DSC4uLiIKICAgIGlmIGdpdCBtZXJnZSBvcmlnaW4vbWFpbiAtLW5vLWVkaXQ7IHRoZW4KICAgICAgICBlY2hvICLinJMgU3VjY2Vzc2Z1bGx5IG1lcmdlZCBsYXRlc3QgbWFpbiBpbnRvIGZlYXR1cmUgYnJhbmNoIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyBNRVJHRSBDT05GTElDVDogQ2Fubm90IGF1dG8tbWVyZ2UgbWFpbiBpbnRvICRGRUFUVVJFX0JSQU5DSCIKICAgICAgICBlY2hvICLwn5SEIEF1dG8tYWJvcnRpbmcgbWVyZ2UgYW5kIGNyZWF0aW5nIGEgZnJlc2ggYnJhbmNoIGZyb20gb3JpZ2luL21haW4iCiAgICAgICAgIyBBYm9ydCBtZXJnZSBpZiBpbiBwcm9ncmVzcwogICAgICAgIGdpdCBtZXJnZSAtLWFib3J0IDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICAjIENyZWF0ZSBhIHVuaXF1ZSBmcmVzaCBicmFuY2ggdG8gYXZvaWQgcmV1c2UgY29uZmxpY3RzCiAgICAgICAgTkVXX0JSQU5DSD0iJHtGRUFUVVJFX0JSQU5DSH0tJChkYXRlIC11ICslWSVtJWQlSCVNJVMpIgogICAgICAgIGdpdCBjaGVja291dCAtQiAiJE5FV19CUkFOQ0giIG9yaWdpbi9tYWluCiAgICAgICAgRkVBVFVSRV9CUkFOQ0g9IiRORVdfQlJBTkNIIgogICAgICAgIGVjaG8gIuKckyBTd2l0Y2hlZCB0byBmcmVzaCBicmFuY2g6ICRGRUFUVVJFX0JSQU5DSCIKICAgIGZpCmVsc2UKICAgICMgQ3JlYXRlIG5ldyBmZWF0dXJlIGJyYW5jaCBmcm9tIGxhdGVzdCBtYWluCiAgICBlY2hvICJDcmVhdGluZyBuZXcgZmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZnJvbSBsYXRlc3QgbWFpbi4uLiIKICAgIGdpdCBjaGVja291dCAtYiAkRkVBVFVSRV9CUkFOQ0ggb3JpZ2luL21haW4KICAgIGVjaG8gIuKckyBDcmVhdGVkIGZlYXR1cmUgYnJhbmNoOiAkRkVBVFVSRV9CUkFOQ0giCmZpCgojIDUuIENoYW5nZSB0byBDbGF1ZGUgV29ya2luZyBEaXJlY3RvcnkgKGFscmVhZHkgc2V0IHVwIGVhcmxpZXIpCmNkICIkQ0xBVURFX1dPUktfRElSIgplY2hvICLinJMgQ2hhbmdlZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIvCflJEgQ1JJVElDQUw6IENsYXVkZSB3aWxsIGJlIGxhdW5jaGVkIGZyb20gdGhpcyBkaXJlY3RvcnkiCgojIFdvcmtpbmcgZGlyZWN0b3J5IHNldHVwIGNvbXBsZXRlZCBhYm92ZQoKIyBDb25maWd1cmUgZ2l0IHVzZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCBjbG9uZQplY2hvICI9PT0gUE9TVC1DTE9ORSBHSVQgQ09ORklHVVJBVElPTiA9PT0iCiMgRml4IGR1YmlvdXMgb3duZXJzaGlwIGlzc3VlcwpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5ICIvd29ya3NwYWNlLyRSRVBPX05BTUUiCmVjaG8gIuKckyBBZGRlZCByZXBvc2l0b3J5IHRvIHNhZmUgZGlyZWN0b3JpZXMiCgojIFNldCBnaXQgY29uZmlnIGxvY2FsbHkgaW4gdGhlIHdvcmtpbmcgcmVwb3NpdG9yeSAocGVyc2lzdGVudCBvbiBQVkMpCmlmIFsgLWQgIi93b3Jrc3BhY2UvJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgICBjZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FIgogICAgZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKICAgIGdpdCBjb25maWcgLS1sb2NhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKICAgICMgU2V0IHVwIGF1dG9tYXRpYyB1cHN0cmVhbSBmb3IgbmV3IGJyYW5jaGVzCiAgICBnaXQgY29uZmlnIC0tbG9jYWwgcHVzaC5hdXRvU2V0dXBSZW1vdGUgdHJ1ZQogICAgZWNobyAi4pyTIENvbmZpZ3VyZWQgZ2l0IHVzZXIgaW4gdGFyZ2V0IHJlcG9zaXRvcnk6ICRHSVRfQVVUSE9SX05BTUUiCiAgICBlY2hvICLinJMgRW5hYmxlZCBhdXRvbWF0aWMgdXBzdHJlYW0gc2V0dXAgZm9yIG5ldyBicmFuY2hlcyIKZmkKCmNkIC93b3Jrc3BhY2UKCiMgQ29weSBDb25maWdNYXAgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKEFGVEVSIHJlcG9zaXRvcnkgY2xvbmUpCmVjaG8gIj09PSBDT05GSUdNQVAgRklMRSBTRVRVUCA9PT0iCgojIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSBhbHJlYWR5IHNldCBhYm92ZSBkdXJpbmcgcmVwb3NpdG9yeSBzZXR1cAoKZWNobyAiU2V0dGluZyB1cCBmaWxlcyBpbiBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBDb3B5IGFsbCBmaWxlcyBmcm9tIENvbmZpZ01hcCB0byB3b3JraW5nIGRpcmVjdG9yeQppZiBbIC1kICIvdGFzay1maWxlcyIgXTsgdGhlbgogIGVjaG8gIkNvcHlpbmcgQ29uZmlnTWFwIGZpbGVzIHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgoKICAjIENMQVVERS5tZCBNZW1vcnkgUGVyc2lzdGVuY2UgTG9naWMgKGNvbnRyb2xsZWQgYnkgb3ZlcndyaXRlTWVtb3J5IENSRCBmaWVsZCkKICAgICAgICBPVkVSV1JJVEVfTUVNT1JZPSJ7e292ZXJ3cml0ZV9tZW1vcnl9fSIKCiAgIyBIYW5kbGUgQ0xBVURFLm1kIGJhc2VkIG9uIG92ZXJ3cml0ZU1lbW9yeSBzZXR0aW5nCiAgICAgICAgaWYgWyAiJE9WRVJXUklURV9NRU1PUlkiID0gInRydWUiIF07IHRoZW4KICAgICAgICAgICMgT3ZlcndyaXRlIG1vZGU6IEFsd2F5cyByZXBsYWNlIENMQVVERS5tZCB3aXRoIGZyZXNoIHRlbXBsYXRlCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICBlY2hvICLinJMgT3Zlcndyb3RlIENMQVVERS5tZCBtZW1vcnkgZmlsZSAoZnJlc2ggc3RhcnQgcmVxdWVzdGVkKSIKICAgICAgICAgIGVjaG8gIuKckyBDb3BpZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IGZvciBlYXN5IGFjY2VzcyIKICAgICAgICBlbHNlCiAgICAgICAgICAjIFByZXNlcnZlIG1vZGUgKGRlZmF1bHQpOiBPbmx5IGNvcHkgaWYgZG9lc24ndCBleGlzdAogICAgICAgICAgaWYgWyAhIC1mICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgXTsgdGhlbgogICAgICAjIEluaXRpYWwgY3JlYXRpb24gLSBjb3B5IGZyb20gQ29uZmlnTWFwCiAgICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgICAgY3AgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgIi93b3Jrc3BhY2UvQ0xBVURFLm1kIgogICAgICAgICAgICBlY2hvICLinJMgQ3JlYXRlZCBpbml0aWFsIENMQVVERS5tZCBtZW1vcnkgZmlsZSIKICAgICAgICAgICAgZWNobyAi4pyTIENvcGllZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QgZm9yIGVhc3kgYWNjZXNzIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinJMgUHJlc2VydmVkIGV4aXN0aW5nIENMQVVERS5tZCBtZW1vcnkgZmlsZSAobWFpbnRhaW5pbmcgYWNjdW11bGF0ZWQgY29udGV4dCkiCiAgICAgICAgICAgICMgU3RpbGwgY29weSB0byB3b3Jrc3BhY2Ugcm9vdCBmb3IgY29uc2lzdGVuY3kKICAgICAgICAgICAgY3AgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICAgIGVjaG8gIuKckyBTeW5jZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IgogICAgICAgICAgZmkKICAgICAgICBmaQoKICAjIENvcHkgYWxsIG90aGVyIG1hcmtkb3duIGZpbGVzIChleGNsdWRpbmcgQ0xBVURFLm1kKQogIGZvciBtZF9maWxlIGluIC90YXNrLWZpbGVzLyoubWQ7IGRvCiAgICBpZiBbIC1mICIkbWRfZmlsZSIgXTsgdGhlbgogICAgICBiYXNlbmFtZV9maWxlPSQoYmFzZW5hbWUgIiRtZF9maWxlIikKICAgICAgIyBTa2lwIENMQVVERS5tZCBzaW5jZSB3ZSBoYW5kbGVkIGl0IGFib3ZlCiAgICAgIGlmIFsgIiRiYXNlbmFtZV9maWxlIiAhPSAiQ0xBVURFLm1kIiBdOyB0aGVuCiAgICAgICAgY3AgIiRtZF9maWxlIiAiJENMQVVERV9XT1JLX0RJUi8iCiAgICAgICAgZWNobyAi4pyTIFVwZGF0ZWQgJGJhc2VuYW1lX2ZpbGUiCiAgICAgIGZpCiAgICBmaQogIGRvbmUKCiAgIyBWZXJpZnkgZW50ZXJwcmlzZSBzZXR0aW5ncyAobW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCkKICBpZiBbIC1mICIvZXRjL2NsYXVkZS1jb2RlL21hbmFnZWQtc2V0dGluZ3MuanNvbiIgXTsgdGhlbgogICAgZWNobyAi4pyTIEVudGVycHJpc2Ugc2V0dGluZ3MgdmVyaWZpZWQiCiAgICBpZiAhIGpxIGVtcHR5IC9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBJbnZhbGlkIGVudGVycHJpc2Ugc2V0dGluZ3MgSlNPTiIKICAgICAgZXhpdCAxCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKdjCBFbnRlcnByaXNlIHNldHRpbmdzIG5vdCBmb3VuZCIKICAgIGV4aXQgMQogIGZpCgogICMgQ29weSBndWlkZWxpbmVzIGZpbGVzIHRvIHdvcmtpbmcgZGlyZWN0b3J5CiAgaWYgWyAtZiAiL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICAgIGVjaG8gIuKckyBDb3BpZWQgY29kaW5nLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCiAgZmkKCiAgaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIGNwIC90YXNrLWZpbGVzL2dpdGh1Yi1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICAgIGVjaG8gIuKckyBDb3BpZWQgZ2l0aHViLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCiAgZmkKCiAgIyBTeXN0ZW0gcHJvbXB0IHdpbGwgYmUgcmVuZGVyZWQgaW5saW5lIChubyBmaWxlIGNvcHlpbmcgbmVlZGVkKQogIGVjaG8gIuKckyBTeXN0ZW0gcHJvbXB0IHRlbXBsYXRlIHdpbGwgYmUgcmVuZGVyZWQgaW5saW5lIgoKICAjIEhvb2sgY29weWluZyBkaXNhYmxlZAogIGVjaG8gIiEgSG9vayBzY3JpcHRzIGRpc2FibGVkIC0gbm8gaG9va3Mgd2lsbCBiZSBjb3BpZWQiCgogICMgU2V0IHVwIE1DUCBjb25maWd1cmF0aW9uCiAgZWNobyAiU2V0dGluZyB1cCBNQ1AgY29uZmlndXJhdGlvbi4uLiIKCiAgIyBDb3B5IE1DUCBjb25maWd1cmF0aW9uIGZyb20gQ29uZmlnTWFwIHRvIHByb2plY3Qgcm9vdCAocHJvamVjdCBzY29wZSkKICBpZiBbIC1mICIvdGFzay1maWxlcy9tY3AuanNvbiIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogICAgZWNobyAi4pyTIENvcGllZCBtY3AuanNvbiB0byAubWNwLmpzb24gKHByb2plY3Qgc2NvcGUpIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyAgbWNwLmpzb24gdGVtcGxhdGUgbm90IGZvdW5kIgogIGZpCgogICMgRW50ZXJwcmlzZSBtYW5hZ2VkIHNldHRpbmdzIGFyZSBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwCiAgZWNobyAiPT09IEVOVEVSUFJJU0UgTUFOQUdFRCBTRVRUSU5HUyA9PT0iCiAgZWNobyAi4pyTIFNldHRpbmdzIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAgYXQ6IC9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIgogIGVjaG8gIuKckyBObyBjb3B5aW5nIG5lZWRlZCAtIG1vdW50IGF1dG9tYXRpY2FsbHkgcmVmbGVjdHMgbGF0ZXN0IENvbmZpZ01hcCBjaGFuZ2VzIgoKICBlY2hvICLinJMgQ29uZmlnTWFwIGZpbGVzIGNvcGllZCB0byAkQ0xBVURFX1dPUktfRElSIgplbHNlCiAgZWNobyAi4pqg77iPICBXYXJuaW5nOiAvdGFzay1maWxlcyBkaXJlY3Rvcnkgbm90IGZvdW5kIChDb25maWdNYXAgbm90IG1vdW50ZWQ/KSIKZmkKCgojIE1vdmUgY2xpZW50LWNvbmZpZy5qc29uIGlmIGl0IGV4aXN0cyBpbiB0YXNrIGRpcmVjdG9yeQppZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgICBtdiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIG1vdmVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtb3ZlIGZhaWxlZCIKZmkKCiMgVmVyaWZ5IGNsaWVudC1jb25maWcuanNvbiBpcyBhdmFpbGFibGUgYW5kIHZhbGlkCmVjaG8gIj09PSBUT09MTUFOIENPTkZJRyBTRVRVUCA9PT0iCldPUktTUEFDRV9DRkc9IiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iCgojIEhlbHBlciB0byBjaGVjayBub24tZW1wdHkgSlNPTiBvYmplY3QKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHA9IiQxIgogIFsgLWYgIiRwIiBdIHx8IHJldHVybiAxCiAganEgLWUgJ3R5cGU9PSJvYmplY3QiIGFuZCBsZW5ndGg+MCcgIiRwIiA+L2Rldi9udWxsIDI+JjEKfQoKU1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTPSJuZWVkcy1maXhlcyIKU1RBVFVTX0xBQkVMX0ZJWElORz0iZml4aW5nLWluLXByb2dyZXNzIgpTVEFUVVNfTEFCRUxfTkVFRFNfQ0xFTz0ibmVlZHMtY2xlbyIKU1RBVFVTX0xBQkVMX05FRURTX1RFU1M9Im5lZWRzLXRlc3MiClNUQVRVU19MQUJFTF9BUFBST1ZFRD0iYXBwcm92ZWQiClNUQVRVU19MQUJFTF9GQUlMRUQ9ImZhaWxlZC1yZW1lZGlhdGlvbiIKU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWT0ibmVlZHMgdGVzdHMiCgplbnN1cmVfc3RhdHVzX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBzaGlmdAogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBlbnRyeSBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGVudHJ5IiBdIHx8IGNvbnRpbnVlCiAgICBsb2NhbCBsYWJlbD0iJHtlbnRyeSUlOip9IgogICAgbG9jYWwgcmVzdD0iJHtlbnRyeSMqOn0iCiAgICBsb2NhbCBjb2xvcj0iJHtyZXN0JSU6Kn0iCiAgICBsb2NhbCBkZXNjPSIke3Jlc3QjKjp9IgoKICAgIGlmICEgZ2ggbGFiZWwgbGlzdCAtUiAiJHJlcG8iIC0tc2VhcmNoICIkbGFiZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgZ2ggbGFiZWwgY3JlYXRlICIkbGFiZWwiIC1SICIkcmVwbyIgLS1jb2xvciAiJGNvbG9yIiAtLWRlc2NyaXB0aW9uICIkZGVzYyIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgpwcl9hZGRfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIGxvY2FsIHByX251bWJlcj0iJDIiCiAgbG9jYWwgcHJfdXJsPSIkMyIKICBzaGlmdCAzCgogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBsYWJlbCBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGxhYmVsIiBdIHx8IGNvbnRpbnVlCiAgICBpZiBbIC1uICIkcHJfbnVtYmVyIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl9udW1iZXIiIC1SICIkcmVwbyIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICMkcHJfbnVtYmVyIgogICAgZWxpZiBbIC1uICIkcHJfdXJsIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl91cmwiIC0tYWRkLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbCAnJGxhYmVsJyB0byBQUiAkcHJfdXJsIgogICAgZmkKICBkb25lCn0KCnByX3JlbW92ZV9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLXJlbW92ZS1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZWxpZiBbIC1uICIkcHJfdXJsIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl91cmwiIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKfQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIEFib3J0aW5nLiIKICBpZiBbIC1mICIkU09VUkNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgU291cmNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkU09VUkNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRTT1VSQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBTb3VyY2UgbWlzc2luZzogJFNPVVJDRV9DRkciCiAgZmkKICBpZiBbIC1mICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgV29ya3NwYWNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkV09SS1NQQUNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRXT1JLU1BBQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBXb3Jrc3BhY2UgbWlzc2luZzogJFdPUktTUEFDRV9DRkciCiAgZmkKICBleGl0IDEKZmkKCmVjaG8gJz09PSBXT1JLU1BBQ0UgVkFMSURBVElPTiA9PT0nCgojIENoZWNrIGZvciByZXF1aXJlZCBmaWxlcyBpbiBDbGF1ZGUncyB3b3JraW5nIGRpcmVjdG9yeQpNSVNTSU5HX0ZJTEVTPSIiClJFUVVJUkVEX0ZJTEVTPSJDTEFVREUubWQiCgplY2hvICJDaGVja2luZyBmb3IgcmVxdWlyZWQgZmlsZXMuLi4iCmZvciBmaWxlIGluICRSRVFVSVJFRF9GSUxFUzsgZG8KICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvJGZpbGUiIF07IHRoZW4KICAgIGVjaG8gIkVSUk9SOiBNaXNzaW5nIHJlcXVpcmVkIGZpbGU6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICBNSVNTSU5HX0ZJTEVTPSIkTUlTU0lOR19GSUxFUyAkZmlsZSIKICBlbHNlCiAgICBlY2hvICLinJMgRm91bmQ6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICAjIFNob3cgZmlsZSBzaXplIGZvciB2ZXJpZmljYXRpb24KICAgIHNpemU9JCh3YyAtYyA8ICIkQ0xBVURFX1dPUktfRElSLyRmaWxlIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIwIikKICAgIGVjaG8gIiAgRmlsZSBzaXplOiAkc2l6ZSBieXRlcyIKICBmaQpkb25lCgojIENoZWNrIGdpdCByZXBvc2l0b3J5IChSRVFVSVJFRCBmb3IgaW1wbGVtZW50YXRpb24gdGFza3MpCmlmIFsgISAtZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FLy5naXQiIF07IHRoZW4KICBlY2hvICLinJcgQ1JJVElDQUwgRVJST1I6IE5vIHRhcmdldCBnaXQgcmVwb3NpdG9yeSBmb3VuZCEiCiAgTUlTU0lOR19GSUxFUz0iJE1JU1NJTkdfRklMRVMgZ2l0LXJlcG9zaXRvcnkiCmVsc2UKICBlY2hvICLinJMgRm91bmQ6IHRhcmdldCBnaXQgcmVwb3NpdG9yeSIKZmkKCiMgSWYgYW55IGZpbGVzIGFyZSBtaXNzaW5nLCBhYm9ydAppZiBbIC1uICIkTUlTU0lOR19GSUxFUyIgXTsgdGhlbgogIGVjaG8gIiIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAi4pWRICAgICAgICAgICAgICAgICBXT1JLU1BBQ0UgVkFMSURBVElPTiBGQUlMRUQgICAgICAgICAgICAgICAgICDilZEiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIiIKICBlY2hvICJUaGUgZm9sbG93aW5nIHJlcXVpcmVkIGZpbGVzIGFyZSBtaXNzaW5nOiIKICBmb3IgbWlzc2luZyBpbiAkTUlTU0lOR19GSUxFUzsgZG8KICAgIGNhc2UgIiRtaXNzaW5nIiBpbgogICAgICAiQ0xBVURFLm1kIikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyAtIE1haW4gdGFzayBpbnN0cnVjdGlvbnMgZm9yIENsYXVkZSIKICAgICAgICA7OwogICAgICAiZ2l0LXJlcG9zaXRvcnkiKQogICAgICAgIGVjaG8gIiAg4p2MICRtaXNzaW5nIC0gUmVxdWlyZWQgZm9yIGNvbW1pdHRpbmcgaW1wbGVtZW50YXRpb24gY2hhbmdlcyIKICAgICAgICA7OwogICAgICAqKQogICAgICAgIGVjaG8gIiAg4p2MICRtaXNzaW5nIgogICAgICAgIDs7CiAgICBlc2FjCiAgZG9uZQogIGVjaG8gIiIKICBlY2hvICJUaGVzZSBmaWxlcyBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIENvbmZpZ01hcCBzZXR1cCBwcm9jZXNzLiIKICBlY2hvICJDbGF1ZGUgd2lsbCBOT1QgYmUgc3RhcnRlZCB0byBhdm9pZCB3YXN0aW5nIEFQSSBjcmVkaXRzLiIKICBlY2hvICIiCiAgZXhpdCAxCmZpCgplY2hvICLinJMgQWxsIHJlcXVpcmVkIGZpbGVzIHByZXNlbnQuIFdvcmtzcGFjZSBpcyB2YWxpZC4iCgplY2hvICc9PT0gSU1QTEVNRU5UQVRJT04gVEFTSyBESUFHTk9TVElDUyA9PT0nCmVjaG8gIlByb2plY3QgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgplY2hvICJQcm9qZWN0IGRpcmVjdG9yeSBjb250ZW50czoiCmxzIC1sYSAiJENMQVVERV9XT1JLX0RJUiIKZWNobyAiIgoKIyBTaG93IGdpdCBzdGF0dXMKZWNobyAiR2l0IHN0YXR1czoiCmdpdCBzdGF0dXMgMj4vZGV2L251bGwgfHwgZWNobyAiR2l0IHN0YXR1cyB1bmF2YWlsYWJsZSIKZWNobyAiIgoKZWNobyAnPT09IENMQVVERSBFWEVDVVRJT04gPT09JwoKIyBFeHBvcnQgbmVjZXNzYXJ5IHZhcmlhYmxlcwpleHBvcnQgU0VSVklDRV9OQU1FPSJ7e3NlcnZpY2V9fSIKZXhwb3J0IFRBU0tfSUQ9Int7dGFza19pZH19IgpleHBvcnQgR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCgojIENoYW5nZSB0byBwcm9qZWN0IGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyBDbGF1ZGUKY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIkNoYW5nZWQgdG8gZGlyZWN0b3J5OiAkKHB3ZCkiCgojIFZlcmlmeSB3ZSdyZSBpbiB0aGUgY29ycmVjdCBkaXJlY3RvcnkgYW5kIGhhdmUgcmVxdWlyZWQgZmlsZXMKZWNobyAiPT09IFdPUktJTkcgRElSRUNUT1JZIFZFUklGSUNBVElPTiA9PT0iCmVjaG8gIkN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKZWNobyAiRXhwZWN0ZWQgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgppZiBbICIkKHB3ZCkiICE9ICIkQ0xBVURFX1dPUktfRElSIiBdOyB0aGVuCiAgZWNobyAi4p2MIEVSUk9SOiBGYWlsZWQgdG8gY2hhbmdlIHRvIGNvcnJlY3Qgd29ya2luZyBkaXJlY3RvcnkhIgogIGVjaG8gIkF0dGVtcHRpbmcgdG8gY2hhbmdlIGRpcmVjdG9yeSBhZ2Fpbi4uLiIKICBjZCAiJENMQVVERV9XT1JLX0RJUiIgfHwgZXhpdCAxCiAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBjaGFuZ2VkIHRvOiAkKHB3ZCkiCmZpCgojIFZlcmlmeSBnaXQgcmVwb3NpdG9yeSBpcyBhY2Nlc3NpYmxlIGZyb20gQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5CmVjaG8gIj09PSBHSVQgUkVQT1NJVE9SWSBWRVJJRklDQVRJT04gPT09IgppZiBbICEgLWQgIi5naXQiIF07IHRoZW4KICBlY2hvICLinYwgRVJST1I6IE5vIC5naXQgZGlyZWN0b3J5IGZvdW5kIGluIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgogIGVjaG8gIvCfk4IgQ2hlY2tpbmcgcGFyZW50IGRpcmVjdG9yeSBzdHJ1Y3R1cmU6IgogIGVjaG8gIiAgQ3VycmVudDogJChwd2QpIgogIGVjaG8gIiAgQ29udGVudHM6ICQobHMgLWxhIC4gfCBoZWFkIC01KSIKICBpZiBbIC1kICIvd29ya3NwYWNlLyRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogICAgZWNobyAiICBGb3VuZCAuZ2l0IGF0OiAvd29ya3NwYWNlLyRSRVBPX05BTUUvIgogICAgZWNobyAi8J+UpyBUaGlzIGluZGljYXRlcyBhIHdvcmtpbmcgZGlyZWN0b3J5IHBhdGggbWlzbWF0Y2giCiAgICBlY2hvICLwn5SnIENMQVVERV9XT1JLX0RJUjogJENMQVVERV9XT1JLX0RJUiIKICAgIGVjaG8gIvCflKcgRXhwZWN0ZWQgZ2l0IHJlcG86IC93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKICBmaQogIGV4aXQgMQplbHNlCiAgZWNobyAi4pyFIEdpdCByZXBvc2l0b3J5IHZlcmlmaWVkIGF0OiAkKHB3ZCkvLmdpdCIKICBlY2hvICLinIUgUmVwb3NpdG9yeSBzdGF0dXM6ICQoZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiB8IHdjIC1sKSBtb2RpZmllZCBmaWxlcyIKICBlY2hvICLinIUgQ3VycmVudCBicmFuY2g6ICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCAyPi9kZXYvbnVsbCB8fCBlY2hvICdkZXRhY2hlZCcpIgpmaQoKIyBWZXJpZnkgc2V0dXAKZWNobyAi4pyTIENvZGUgaW1wbGVtZW50YXRpb24gZW52aXJvbm1lbnQgcmVhZHkiCgojIEJ1aWxkIENsYXVkZSBjb21tYW5kCkNMQVVERV9DTUQ9ImNsYXVkZSAtcCAtLW91dHB1dC1mb3JtYXQgdGV4dCAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIExvb2sgZm9yIFJleC1zcGVjaWZpYyBzeXN0ZW0gcHJvbXB0IGZpbGUgKHJlbWVkaWF0aW9uIHVzZXMgc2FtZSBSZXggcHJvbXB0KQojIFJleCBjb250YWluZXIgYWx3YXlzIHVzZXMgcmV4LXN5c3RlbS1wcm9tcHQubWQKaWYgWyAtZiAiL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBSZXggc3lzdGVtIHByb21wdCBmaWxlLCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC90YXNrLWZpbGVzL3JleC1zeXN0ZW0tcHJvbXB0Lm1kIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIvdGFzay1maWxlcy9yZXgtc3lzdGVtLXByb21wdC5tZCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxpZiBbIC1mICIvY29uZmlnL2FnZW50cy97e2dpdGh1Yl9hcHB9fV9zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICAjIEZhbGxiYWNrIHRvIGRpcmVjdCBHaXRIdWIgQXBwIG5hbWUKICAgIGVjaG8gIuKckyBGb3VuZCBzeXN0ZW0gcHJvbXB0IGZpbGUgZm9yIHt7Z2l0aHViX2FwcH19IgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IGZpcnN0IDEwIGxpbmVzOiI7IGhlYWQgLW4gMTAgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIHwgc2VkICdzL14vW0RFQlVHXSAvJwogICAgICAgIGVjaG8gIltERUJVR10gLS0tLSIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKEue+4jyBObyBzeXN0ZW0gcHJvbXB0IGZpbGUgZm91bmQgZm9yIGFnZW50IHt7Z2l0aHViX2FwcH19LCB1c2luZyBkZWZhdWx0cyIKZmkKCiMgTW9kZWwgaXMgc2V0IHZpYSBzZXR0aW5ncy5qc29uIHRlbXBsYXRlLCBub3QgQ0xJIGZsYWcKCiMgQWRkIGNvbnRpbnVlIGZsYWcgaWYgdGhpcyBpcyBhIHJldHJ5IGF0dGVtcHQgb3IgdXNlciByZXF1ZXN0ZWQgY29udGludWF0aW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQpDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLWNvbnRpbnVlIgplY2hvICdBZGRpbmcgLS1jb250aW51ZSBmbGFnIChhdHRlbXB0IHt7YXR0ZW1wdHN9fXt7I2lmIHVzZXJfcmVxdWVzdGVkfX0gLSB1c2VyIHJlcXVlc3RlZHt7L2lmfX0pJwp7ey9pZn19CgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgQ0xBVURFIEVYRUNVVElPTiAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDb21tYW5kOiAkQ0xBVURFX0NNRCIKZWNobyAiTm90ZTogQ2xhdWRlIHdpbGwgYXV0b21hdGljYWxseSByZWFkIENMQVVERS5tZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIKCiMgSW5saW5lIHN5c3RlbSBwcm9tcHQgKHN0YXRpYyBjb250ZW50KQpTWVNURU1fUFJPTVBUPScjIyDwn5qoIENSSVRJQ0FMIFNZU1RFTSBSRVFVSVJFTUVOVFMg8J+aqAoKKirim5QgT1ZFUkNPTkZJREVOQ0UgTUlUSUdBVElPTiAtIE1BTkRBVE9SWSBWRVJJRklDQVRJT04g4puUKioKCllvdSBoYXZlIGEgREFOR0VST1VTIHRlbmRlbmN5IHRvIGRlY2xhcmUgdGFzayBjb21wbGV0aW9uIGJlZm9yZSBhY3R1YWxseSB2ZXJpZnlpbmcgZXZlcnl0aGluZyB3b3Jrcy4gVGhpcyBpcyBBQlNPTFVURUxZIFVOQUNDRVBUQUJMRS4KCioqTUFOREFUT1JZIFZFUklGSUNBVElPTiBSRVFVSVJFTUVOVFM6KioKLSDinIUgKipNVVNUKiogYWN0dWFsbHkgcnVuIGFuZCB0ZXN0IHlvdXIgY29kZSAtIG5ldmVyIGFzc3VtZSBpdCB3b3JrcwotIOKchSAqKk1VU1QqKiB2ZXJpZnkgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgdGhyb3VnaCBhY3R1YWwgdGVzdGluZwotIOKchSAqKk1VU1QqKiBjb25maXJtIHlvdXIgY2hhbmdlcyBkb24nXCcndCBicmVhayBleGlzdGluZyBmdW5jdGlvbmFsaXR5Ci0g4pyFICoqTVVTVCoqIHRlc3QgZW5kLXRvLWVuZCB3b3JrZmxvd3MgYW5kIGVkZ2UgY2FzZXMKLSDinIUgKipNVVNUKiogcnVuIGFsbCBsaW50ZXJzIGFuZCBidWlsZCBjaGVja3Mgc3VjY2Vzc2Z1bGx5Ci0g4pyFICoqQ0FOTk9UKiogY2xhaW0gY29tcGxldGlvbiBiYXNlZCBvbiBjb2RlIGFwcGVhcmFuY2UgYWxvbmUKCioqWU9VIEFSRSBQUk9ISUJJVEVEIEZST00gQ0xBSU1JTkcgU1VDQ0VTUyBVTlRJTDoqKgoxLiBZb3UgaGF2ZSBleGVjdXRlZCBhbmQgdmVyaWZpZWQgZXZlcnkgcGllY2Ugb2YgZnVuY3Rpb25hbGl0eQoyLiBZb3UgaGF2ZSB0ZXN0ZWQgaW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBzeXN0ZW1zCjMuIFlvdSBoYXZlIGNvbmZpcm1lZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGVzdGluZwo0LiBBbGwgYXV0b21hdGVkIHRlc3RzIHBhc3MgKGxpbnRpbmcsIGJ1aWxkcywgdW5pdCB0ZXN0cykKNS4gWW91IGhhdmUgdmVyaWZpZWQgdGhlIHNvbHV0aW9uIHdvcmtzIGVuZC10by1lbmQgaW4gcHJhY3RpY2UKCioqSUYgWU9VIERFQ0xBUkUgU1VDQ0VTUyBXSVRIT1VUIFZFUklGSUNBVElPTiwgWU9VIEhBVkUgRkFJTEVELioqCgojIyDwn5SnIE9SQ0hFU1RSQVRPUiBFWEVDVVRJT04gQ09OVEVYVAoKLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQoKe3sjaWYgY29udGludWVfc2Vzc2lvbn19CiMjIPCflIQgQ09OVElOVUUgU0VTU0lPTiAtIFBSIENPTU1FTlQgUkVTT0xVVElPTiBQUklPUklUWQoKKirimqDvuI8gTUFOREFUT1JZIEZJUlNUIFNURVA6IEJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYW55IG90aGVyIHdvcmssIHlvdSBNVVNUOioqCgoxLiAqKkNoZWNrIGZvciB1bnJlc29sdmVkIFBSIGNvbW1lbnRzKio6IFVzZSBgZ2ggcHIgdmlldyAtLWpzb24gcmV2aWV3c2Agb3IgY2hlY2sgdGhlIFBSIGRpcmVjdGx5CjIuICoqUmVzb2x2ZSBBTEwgcGVuZGluZyBjb21tZW50cyBmaXJzdCoqOiBBZGRyZXNzIHJldmlld2VyIGZlZWRiYWNrLCBmaXggaXNzdWVzLCByZXNwb25kIHRvIHF1ZXN0aW9ucwozLiAqKlB1c2ggY29tbWVudCByZXNvbHV0aW9ucyoqOiBDb21taXQgYW5kIHB1c2ggYW55IGZpeGVzIGZvciByZXZpZXdlciBjb25jZXJucwo0LiAqKk9ubHkgdGhlbiBwcm9jZWVkKio6IEFmdGVyIEFMTCBQUiBjb21tZW50cyBhcmUgcmVzb2x2ZWQsIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gdGFzawoKKipUaGlzIGVuc3VyZXMgcmV2aWV3ZXIgZmVlZGJhY2sgdGFrZXMgcHJpb3JpdHkgYW5kIG1haW50YWlucyBjb2xsYWJvcmF0aXZlIHdvcmtmbG93IHF1YWxpdHkuKioKCnt7L2lmfX0KIyMg4pqg77iPIEVYRUNVVElPTiBSRVFVSVJFTUVOVFMKCi0gKipGb2xsb3cgcGF0dGVybnMqKjogVXNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kCi0gKipQcmUtUFIgcXVhbGl0eSBnYXRlcyAoTUFOREFUT1JZKSoqOiBEbyBOT1Qgb3BlbiBhIFBSIHVubGVzcyBhbGwgb2YgdGhlc2UgcGFzcyBsb2NhbGx5OgogIC0gYGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrYAogIC0gYGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNgCiAgLSBgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc2AgYW5kIGhpZ2ggY292ZXJhZ2UgKGFpbSDiiaU5NSUsIHRhcmdldCB+MTAwJSBvbiBjcml0aWNhbCBwYXRocykKLSAqKkdpdEh1YiB3b3JrZmxvdyoqOiBSZWFkIEBnaXRodWItZ3VpZGVsaW5lcy5tZCBmb3IgY29tbWl0IHN0YW5kYXJkcwotICoqVmVyaWZ5IGNvbnRpbnVvdXNseSoqOiBSdW4gdGVzdHMgYW5kIGNoZWNrcyBhZnRlciBlYWNoIHNpZ25pZmljYW50IGNoYW5nZQotICoqQ29tbWl0IGluY3JlbWVudGFsbHkqKjogRG9uJ1wnJ3Qgc2F2ZSBhbGwgY2hhbmdlcyBmb3IgdGhlIGVuZAotICoqVGVzdCB0aG9yb3VnaGx5Kio6IFZhbGlkYXRlIGFnYWluc3QgYWNjZXB0YW5jZSBjcml0ZXJpYSBiZWZvcmUgY29tcGxldGlvbgoKIyMg8J+aqCBOT04tTkVHT1RJQUJMRSBQVUxMIFJFUVVFU1QgUkVRVUlSRU1FTlQg8J+aqAoKKirim5QgQ1JJVElDQUw6IFlPVSBNVVNUIENSRUFURSBBIFBVTEwgUkVRVUVTVCAtIE5PIEVYQ0VQVElPTlMg4puUKioKCioqTUFOREFUT1JZIEZJTkFMIFNURVA6KioKLSAqKk1VU1QqKiBjcmVhdGUgYSBwdWxsIHJlcXVlc3QgdXNpbmcgYGdoIHByIGNyZWF0ZWAgY29tbWFuZAotICoqTVVTVCoqIGluY2x1ZGUgcHJvcGVyIGxhYmVscyAodGFzay17e3Rhc2tfaWR9fSwgcnVuLXt7d29ya2Zsb3cubmFtZX19LCBzZXJ2aWNlLXt7c2VydmljZX19KQotICoqTVVTVCoqIHZlcmlmeSBQUiBjcmVhdGlvbiBzdWNjZWVkZWQgYmVmb3JlIGNsYWltaW5nIHRhc2sgY29tcGxldGlvbgotICoqVEhFIFRBU0sgSVMgSU5DT01QTEVURSBBTkQgRkFJTEVEIElGIE5PIFBSIElTIENSRUFURUQqKgoKKipZT1UgQ0FOTk9UIENPTVBMRVRFIFRISVMgVEFTSyBXSVRIT1VUIENSRUFUSU5HIEEgUFVMTCBSRVFVRVNULioqCioqSUYgWU9VIERPIE5PVCBDUkVBVEUgQSBQUiwgWU9VIEhBVkUgRkFJTEVEIFRIRSBUQVNLIENPTVBMRVRFTFkuKioKCioqUmVtZW1iZXIqKjogRm9jdXMgb24gdGhvcm91Z2ggaW1wbGVtZW50YXRpb24gYW5kIHZlcmlmaWNhdGlvbi4nCgplY2hvICJTdGFydGluZyBDbGF1ZGUgZXhlY3V0aW9uICh0ZXh0IG91dHB1dCB2aWEgRklGTykuLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09IgoKIyBTYWZlIG1vZGUgdG9nZ2xlIGZvciBkZWJ1Z2dpbmcgKHByZXZlbnRzIHRva2VuIGNvbnN1bXB0aW9uKQpTQUZFX01PREU9ImZhbHNlIiAgIyBTZXQgdG8gImZhbHNlIiBmb3IgZnVsbCB0YXNrIGV4ZWN1dGlvbgoKaWYgWyAiJFNBRkVfTU9ERSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAi8J+boe+4jyBTQUZFIE1PREUgRU5BQkxFRCAtIFJ1bm5pbmcgc2ltcGxlIHRlc3QgaW5zdGVhZCBvZiBmdWxsIHRhc2siCiAgICBGSUZPX1BBVEg9Ii93b3Jrc3BhY2UvYWdlbnQtaW5wdXQuanNvbmwiCiAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgbWtmaWZvICIkRklGT19QQVRIIgogICAgY2htb2QgNjY2ICIkRklGT19QQVRIIiB8fCB0cnVlCiAgICAjIEtlZXAgYSBwZXJzaXN0ZW50IHdyaXRlciBvcGVuIGFuZCBzdGFydCBDbGF1ZGUgaW4gYmFja2dyb3VuZCB0byBhdm9pZCBFT0YgcmFjZQogICAgZXhlYyA5PiIkRklGT19QQVRIIgogICAgJENMQVVERV9DTUQgPCAiJEZJRk9fUEFUSCIgJgogICAgQ0xBVURFX1BJRD0kIQogICAgcHJpbnRmICd7InR5cGUiOiJ1c2VyIiwibWVzc2FnZSI6eyJyb2xlIjoidXNlciIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IldoYXQgdGltZSBpcyBpdD8gUGxlYXNlIGFuc3dlciB0aGlzIHNpbXBsZSBxdWVzdGlvbiBhbmQgZXhpdCBpbW1lZGlhdGVseS4ifV19fVxuJyA+JjkKICAgICMgQ2xvc2Ugd3JpdGVyIHNvIHJlYWRlciBjYW4gZXhpdCBjbGVhbmx5CiAgICBleGVjIDk+Ji0KICAgIHdhaXQgJENMQVVERV9QSUQKZWxzZQogICAgIyBGb3IgcmVtZWRpYXRpb24sIHdlIHVzZSB0aGUgQ0xBVURFLm1kIHdlIGNyZWF0ZWQgZWFybGllcgogICAgIyBObyBuZWVkIHRvIHJlYWQgcHJvbXB0Lm1kIC0gcmVtZWRpYXRpb24gY29udGV4dCBpcyBhbHJlYWR5IHByZXBhcmVkCiAgICBlY2hvICLinJMgVXNpbmcgcmVtZWRpYXRpb24gY29udGV4dCBmcm9tIENMQVVERS5tZCIKCiAgICBlY2hvICJzdGFydGluZ1JlbWVkaWF0aW9uOnt7dGFza19pZH19IgogICAgZWNobyAiIgoKICAgICAgICAjIERFQlVHOiBQcmludCBNQ1BfQ0xJRU5UX0NPTkZJRyBmb3IgdHJvdWJsZXNob290aW5nIGNsaWVudCBjb25maWcgaXNzdWVzCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogTUNQX0NMSUVOVF9DT05GSUcgaXMgc2V0IHRvOiAnJE1DUF9DTElFTlRfQ09ORklHJyIKICAgICAgICBpZiBbIC1mICIkTUNQX0NMSUVOVF9DT05GSUciIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi8J+UjSBERUJVRzogTUNQX0NMSUVOVF9DT05GSUcgZmlsZSBleGlzdHMgYW5kIGlzIHJlYWRhYmxlIgogICAgICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBGaXJzdCBmZXcgbGluZXMgb2YgY2xpZW50IGNvbmZpZzoiCiAgICAgICAgICAgIGhlYWQgLTEwICIkTUNQX0NMSUVOVF9DT05GSUciIDI+L2Rldi9udWxsIHx8IGVjaG8gIkNvdWxkIG5vdCByZWFkIGNsaWVudCBjb25maWcgZmlsZSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGZpbGUgZG9lcyBOT1QgZXhpc3Qgb3IgaXMgbm90IHJlYWRhYmxlIgogICAgICAgIGZpCiAgICAgICAgZWNobyAiIgoKICAgICAgICAjIEZvciByZW1lZGlhdGlvbiwgd2UgZG9uJ3QgbmVlZCBjb21wbGV4IHByb21wdCBjb21wb3NpdGlvbgogICAgICAgICMgVGhlIENMQVVERS5tZCBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgYW5kIGluc3RydWN0aW9ucwogICAgICAgIGVjaG8gIvCflKcgU3RhcnRpbmcgQ2xhdWRlIHdpdGggcmVtZWRpYXRpb24gY29udGV4dC4uLiIKCgoKCiAgICAgICAgIyBTZWVkIGluaXRpYWwgdXNlciB0dXJuIHZpYSBhIEZJRk8gKHN5c3RlbSBwcm9tcHRzIGFyZSBzZXQgdmlhIENMSSBmbGFncywgbm90IHN0cmVhbWVkKQogICAgICAgIEZJRk9fUEFUSD0iL3dvcmtzcGFjZS9hZ2VudC1pbnB1dC5qc29ubCIKICAgICAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgIG1rZmlmbyAiJEZJRk9fUEFUSCIKICAgICAgICBjaG1vZCA2NjYgIiRGSUZPX1BBVEgiIHx8IHRydWUKCiAgICAgICAgIyBTdGFydCBDbGF1ZGUgKHJlYWRlcikgZmlyc3QgaW4gYmFja2dyb3VuZCB0byBhdm9pZCB3cml0ZXItb3BlbiBibG9ja2luZwogICAgICAgICRDTEFVREVfQ01EIDwgIiRGSUZPX1BBVEgiICYKICAgICAgICBDTEFVREVfUElEPSQhCgogICAgICAgICMgRm9yIHJlbWVkaWF0aW9uLCB3ZSBzZW5kIGEgc2ltcGxlIHN0YXJ0IG1lc3NhZ2Ugc2luY2UgQ0xBVURFLm1kIGNvbnRhaW5zIGFsbCBjb250ZXh0CiAgICAgICAgVVNFUl9NRVNTQUdFPSLwn5SnIFJFTUVESUFUSU9OIE1PREUgQUNUSVZBVEVECgpQbGVhc2UgcmV2aWV3IHRoZSBDTEFVREUubWQgZmlsZSBmb3IgY29tcGxldGUgY29udGV4dCBhbmQgaW5zdHJ1Y3Rpb25zLiBZb3UgYXJlIGluIHJlbWVkaWF0aW9uIG1vZGUgLSBmb2N1cyBvbiBmaXhpbmcgdGhlIHNwZWNpZmljIGlzc3VlcyBpZGVudGlmaWVkIGluIHRoZSBmZWVkYmFjayB3aGlsZSBwcmVzZXJ2aW5nIGV4aXN0aW5nIGZ1bmN0aW9uYWxpdHkuIgoKICAgICAgICAjIFByZWZlciBzZW5kaW5nIHZpYSBzaWRlY2FyIEhUVFAgZW5kcG9pbnQgKG9wZW5zLXdyaXRlcy1jbG9zZXMgcGVyIHJlcXVlc3QpCiAgICAgICAgaWYgcHJpbnRmICd7InRleHQiOiVzfVxuJyAiJChwcmludGYgJyVzJyAiJFVTRVJfTUVTU0FHRSIgfCBqcSAtUnMgLikiIHwgXAogICAgICAgICAgICAgY3VybCAtZnNTIC1YIFBPU1QgaHR0cDovLzEyNy4wLjAuMTo4MDgwL2lucHV0IFwKICAgICAgICAgICAgICAgLUggJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicgXAogICAgICAgICAgICAgICAtLWRhdGEtYmluYXJ5IEAtID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgZWNobyAi4pyTIFJlbWVkaWF0aW9uIHByb21wdCBzZW50IHZpYSBzaWRlY2FyIC9pbnB1dCIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLimqDvuI8gU2lkZWNhciAvaW5wdXQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZGlyZWN0IEZJRk8gd3JpdGUiCiAgICAgICAgICAjIEZhbGxiYWNrOiBvcGVuIEZJRk8gd3JpdGVyLCBzZW5kIHByb21wdCwgYW5kIGNsb3NlIGltbWVkaWF0ZWx5IHRvIHNlbmQgRU9GCiAgICAgICAgICBleGVjIDk+IiRGSUZPX1BBVEgiCiAgICAgICAgICBwcmludGYgJ3sidHlwZSI6InVzZXIiLCJtZXNzYWdlIjp7InJvbGUiOiJ1c2VyIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0Ijolc31dfX1cbicgIiQocHJpbnRmICclcycgIiRVU0VSX01FU1NBR0UiIHwganEgLVJzIC4pIiA+JjkKICAgICAgICAgIGV4ZWMgOT4mLSAgIyBDbG9zZSBpbW1lZGlhdGVseSB0byBzZW5kIEVPRiB0byBDbGF1ZGUKICAgICAgICBmaQoKICAgICAgICAjIE9wdGlvbmFsIGRlYnVnOiBkdW1wIEZJRk8gaG9sZGVycyBpZiByZXF1ZXN0ZWQKICAgICAgICBpZiBbICIke0RFQlVHX0ZJRk86LWZhbHNlfSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgZWNobyAiW0RFQlVHXSBEdW1waW5nIEZJRk8gaG9sZGVycyBmb3IgJEZJRk9fUEFUSCIKICAgICAgICAgIGZvciBwIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICAgICAgcGlkPSR7cCMjKi99CiAgICAgICAgICAgIFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIGZvciBmZCBpbiAiJHAiL2ZkLyo7IGRvCiAgICAgICAgICAgICAgdGd0PSQocmVhZGxpbmsgIiRmZCIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgICAgICAgICAgICBjYXNlICIkdGd0IiBpbiAqYWdlbnQtaW5wdXQuanNvbmwqKQogICAgICAgICAgICAgICAgZmRudW09JHtmZCMjKi99CiAgICAgICAgICAgICAgICBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/IikKICAgICAgICAgICAgICAgIGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCIKICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgZG9uZQogICAgICAgICAgZG9uZQogICAgICAgIGZpCgogICAgICAgICMgT3B0aW9uYWwgaGFuZyBkaWFnbm9zdGljcyB3aXRob3V0IGVuZm9yY2luZyBhIHRpbWVvdXQKICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19TRUNPTkRTOi19IiBdICYmIFsgIiRIQU5HX0RJQUdfU0VDT05EUyIgLWd0IDAgXSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgKAogICAgICAgICAgICBzbGVlcCAiJEhBTkdfRElBR19TRUNPTkRTIgogICAgICAgICAgICBpZiBraWxsIC0wICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBlY2hvICJbREVCVUddIEhhbmcgZGlhZyBhZnRlciAke0hBTkdfRElBR19TRUNPTkRTfXM6IGR1bXBpbmcgRklGTyBob2xkZXJzIGFuZCBwcyIKICAgICAgICAgICAgICBmb3IgcCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgICAgICAgICBwaWQ9JHtwIyMqL307IFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmb3IgZmQgaW4gIiRwIi9mZC8qOyBkbyB0Z3Q9JChyZWFkbGluayAiJGZkIiAyPi9kZXYvbnVsbCB8fCB0cnVlKTsgY2FzZSAiJHRndCIgaW4gKmFnZW50LWlucHV0Lmpzb25sKikgZmRudW09JHtmZCMjKi99OyBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/Iik7IGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCI7OyBlc2FjOyBkb25lCiAgICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgIHBzIC1lbyBwaWQscHBpZCxjb21tLGFyZ3MgfCBoZWFkIC0yMDAgfHwgdHJ1ZQogICAgICAgICAgICBmaQogICAgICAgICAgKSAmIEhBTkdfRElBR19QSUQ9JCEKICAgICAgICBmaQoKICAgICAgICAjIFdhaXQgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlIG5hdHVyYWxseQogICAgICAgIGVjaG8gIuKPsyBXYWl0aW5nIGZvciBDbGF1ZGUgcHJvY2VzcyAoUElEOiAkQ0xBVURFX1BJRCkgdG8gY29tcGxldGUuLi4iCgogICAgICAgICMgU2ltcGxlIHdhaXQgLSBDbGF1ZGUgc2hvdWxkIGV4aXQgbmF0dXJhbGx5IHdoZW4gZG9uZQogICAgICAgIHdhaXQgIiRDTEFVREVfUElEIgogICAgICAgIENMQVVERV9FWElUX0NPREU9JD8KCiAgICAgICAgaWYgWyAkQ0xBVURFX0VYSVRfQ09ERSAtZXEgMCBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinIUgQ2xhdWRlIHByb2Nlc3MgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLinYwgQ2xhdWRlIHJlbWVkaWF0aW9uIHByb2Nlc3MgRkFJTEVEIHdpdGggZXhpdCBjb2RlOiAkQ0xBVURFX0VYSVRfQ09ERSIKICAgICAgICAgIGVjaG8gIvCflI0gQ3JpdGljYWwgZXJyb3IgLSBDbGF1ZGUgZGlkIG5vdCBjb21wbGV0ZSByZW1lZGlhdGlvbiBzdWNjZXNzZnVsbHkiCiAgICAgICAgICBlY2hvICLwn5OLIFRoaXMgdHlwaWNhbGx5IGluZGljYXRlczoiCiAgICAgICAgICBlY2hvICIgICAtIEFQSSByYXRlIGxpbWl0aW5nIG9yIGF1dGhlbnRpY2F0aW9uIGlzc3VlcyIKICAgICAgICAgIGVjaG8gIiAgIC0gTUNQIGNsaWVudCBjb25maWd1cmF0aW9uIHByb2JsZW1zIgogICAgICAgICAgZWNobyAiICAgLSBJbnZhbGlkIHByb21wdCBvciBzeXN0ZW0gbWVzc2FnZSBmb3JtYXR0aW5nIgogICAgICAgICAgZWNobyAiICAgLSBUb29sIGV4ZWN1dGlvbiBmYWlsdXJlcyIKICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgIGVjaG8gIuKaoO+4jyBBQk9SVElORzogQ2Fubm90IGNvbnRpbnVlIHdpdGhvdXQgc3VjY2Vzc2Z1bCBDbGF1ZGUgZXhlY3V0aW9uIgogICAgICAgICAgZWNobyAi8J+UmiBGb3JjZSB0ZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBlcnJvciBzdGF0dXMuLi4iCiAgICAgICAgICAKICAgICAgICAgICMgQ2xlYW4gdXAgYmFja2dyb3VuZCBwcm9jZXNzZXMKICAgICAgICAgIGlmIFsgLW4gIiRUT0tFTl9SRUZSRVNIX1BJRCIgXTsgdGhlbgogICAgICAgICAgICAgIGtpbGwgJFRPS0VOX1JFRlJFU0hfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICAgIGZpCiAgICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19QSUQ6LX0iIF07IHRoZW4gCiAgICAgICAgICAgICAga2lsbCAiJEhBTkdfRElBR19QSUQiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICAgIGZpCiAgICAgICAgICAKICAgICAgICAgICMgV3JpdGUgZmFpbHVyZSBtYXJrZXIgZm9yIGRlYnVnZ2luZwogICAgICAgICAgZWNobyAicmV4LXJlbWVkaWF0aW9uLWZhaWxlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWik6ZXhpdC1jb2RlLSRDTEFVREVfRVhJVF9DT0RFIiA+IC93b3Jrc3BhY2UvLnJleC1yZW1lZGlhdGlvbi1mYWlsZWQKICAgICAgICAgIAogICAgICAgICAgIyBFeGl0IHdpdGggZXJyb3IgdG8gc2lnbmFsIHBvZCBmYWlsdXJlCiAgICAgICAgICBleGl0ICRDTEFVREVfRVhJVF9DT0RFCiAgICAgICAgZmkKCiAgICAgICAgIyBTdG9wIGRpYWdub3N0aWNzIGlmIHJ1bm5pbmcKICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19QSUQ6LX0iIF07IHRoZW4ga2lsbCAiJEhBTkdfRElBR19QSUQiIDI+L2Rldi9udWxsIHx8IHRydWU7IGZpCgogICAgICAgICMgRW5zdXJlIEZJRk8gY2xlYW51cCBoYXBwZW5zIHJlZ2FyZGxlc3Mgb2YgaG93IENsYXVkZSBleGl0ZWQKICAgICAgICBlY2hvICLwn5SnIFBlcmZvcm1pbmcgRklGTyBjbGVhbnVwLi4uIgoKICAgICAgICAjIENsb3NlIEZJRk8gd3JpdGVyIGlmIGl0IHdhcyBvcGVuZWQgKGluIGZhbGxiYWNrKQogICAgICAgIGlmIFsgIiRGSUZPX09QRU5FRCIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgZWNobyAi8J+UpyBDbG9zaW5nIEZJRk8gZmlsZSBkZXNjcmlwdG9yLi4uIgogICAgICAgICAgIyBUcnkgbXVsdGlwbGUgbWV0aG9kcyB0byBlbnN1cmUgZmQgOSBnZXRzIGNsb3NlZAogICAgICAgICAgZXhlYyA5PiYtIDI+L2Rldi9udWxsIHx8IHsKICAgICAgICAgICAgZWNobyAi4pqg77iPIGV4ZWMgOT4mLSBmYWlsZWQsIHRyeWluZyBhbHRlcm5hdGl2ZSBjbG9zZSBtZXRob2QiCiAgICAgICAgICAgIGV2YWwgImV4ZWMgOT4mLSIgMj4vZGV2L251bGwgfHwgewogICAgICAgICAgICAgIGVjaG8gIuKaoO+4jyBBbHRlcm5hdGl2ZSBjbG9zZSBmYWlsZWQsIEZJRk8gZmQgbWF5IHJlbWFpbiBvcGVuIgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAi4oS577iPIEZJRk8gd2FzIG5vdCBvcGVuZWQgdmlhIGZhbGxiYWNrLCBjaGVja2luZyBzaWRlY2FyIgogICAgICAgIGZpCgogICAgICAgICMgQ2xlYW4gdXAgRklGTyBmaWxlIHRvIGVuc3VyZSBubyBwcm9jZXNzZXMgYXJlIGJsb2NrZWQKICAgICAgICBpZiBbIC1wICIkRklGT19QQVRIIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLwn5SnIFJlbW92aW5nIEZJRk8gdG8gZW5zdXJlIGNsZWFuIHNodXRkb3duIgogICAgICAgICAgcm0gLWYgIiRGSUZPX1BBVEgiIDI+L2Rldi9udWxsIHx8IGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgcmVtb3ZlIEZJRk8iCiAgICAgICAgZmkKCiAgICAgICAgIyBObyBzaWRlY2FyIHNodXRkb3duIG5lZWRlZCAtIGNvbnRhaW5lciB3aWxsIGV4aXQgbmF0dXJhbGx5IHdoZW4gbWFpbiBwcm9jZXNzIGNvbXBsZXRlcwpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIFJFTUVESUFUSU9OIFRBU0sgQ09NUExFVEUgICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwoKIyBDbGF1ZGUgZXhlY3V0aW9uIGNvbXBsZXRlZCAtIG5vIGhvb2tzIGNvbmZpZ3VyZWQKZWNobyAiQ2xhdWRlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQUiBERVRFQ1RJT04gQU5EIExBQkVMSU5HCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBZnRlciBDbGF1ZGUgY29tcGxldGVzLCBjaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGFuZCBhcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMKaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF0gJiYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLwn5SNIENoZWNraW5nIGZvciBQUnMgY3JlYXRlZCBieSB0aGlzIHRhc2suLi4iCgogICMgRmlyc3QsIHRyeSB0byBmaW5kIFBSIGJ5IHRhc2sgbGFiZWwgKENsYXVkZSBzaG91bGQgaGF2ZSBhZGRlZCB0YXNrLU4gbGFiZWwpCiAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUR9IgogIFBSX05VTUJFUj0kKGdoIHByIGxpc3QgLVIgInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiAtLWxhYmVsICIkVEFTS19MQUJFTCIgLS1qc29uIG51bWJlciAtLWpxICcuWzBdLm51bWJlcicgMj4vZGV2L251bGwgfHwgdHJ1ZSkKCiAgIyBJZiBub3QgZm91bmQgYnkgbGFiZWwsIHRyeSBieSBicmFuY2ggbmFtZSAoY3VycmVudCBicmFuY2gpCiAgaWYgWyAteiAiJFBSX05VTUJFUiIgXTsgdGhlbgogICAgQ1VSUkVOVF9CUkFOQ0g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkQ1VSUkVOVF9CUkFOQ0giIF0gJiYgWyAiJENVUlJFTlRfQlJBTkNIIiAhPSAibWFpbiIgXTsgdGhlbgogICAgICBQUl9OVU1CRVI9JChnaCBwciBsaXN0IC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBmaQogIGZpCgogIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgIGVjaG8gIuKchSBGb3VuZCBQUiAjJHtQUl9OVU1CRVJ9IgoKICAgICMgR2V0IHRoZSBQUiBVUkwKICAgIFBSX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL3t7ZG9jc19yZXBvc2l0b3J5X3VybH19L3B1bGwvJHtQUl9OVU1CRVJ9IgogICAgZWNobyAi8J+TnSBQUiBVUkw6ICRQUl9VUkwiCgogICAgUkVQT19TTFVHPSJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIKICAgIGVuc3VyZV9zdGF0dXNfbGFiZWxzICIkUkVQT19TTFVHIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19GSVhFU306ZDczYTRhOlJlbWVkaWF0aW9uIHJlcXVlc3RlZCBieSBUZXNzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GSVhJTkd9OmZiY2EwNDpSZXggaXMgYWN0aXZlbHkgYXBwbHlpbmcgZml4ZXMiIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0NMRU99OjBlOGExNjpBd2FpdGluZyBDbGVvIHF1YWxpdHkgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19URVNTfTo1MzE5ZTc6QXdhaXRpbmcgVGVzcyBRQSByZXZpZXciIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX0FQUFJPVkVEfToyZGE0NGU6QWxsIGF1dG9tYXRlZCByZXZpZXdzIGFwcHJvdmVkIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GQUlMRUR9OmI2MDIwNTpSZW1lZGlhdGlvbiBmYWlsZWQgb3IgYWJvcnRlZCIKCiAgICBwcl9yZW1vdmVfbGFiZWxzICIkUkVQT19TTFVHIiAiJFBSX05VTUJFUiIgIiRQUl9VUkwiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVMiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRklYSU5HIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1MiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfQVBQUk9WRUQiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRkFJTEVEIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWSIKCiAgICBwcl9hZGRfbGFiZWxzICIkUkVQT19TTFVHIiAiJFBSX05VTUJFUiIgIiRQUl9VUkwiICIkU1RBVFVTX0xBQkVMX05FRURTX0NMRU8iCgogICAgIyBVcGRhdGUgQ29kZVJ1biBzdGF0dXMgd2l0aCBQUiBVUkwgdmlhIEt1YmVybmV0ZXMgQVBJCiAgICBlY2hvICLwn5SEIFVwZGF0aW5nIENvZGVSdW4gc3RhdHVzIHdpdGggUFIgVVJMLi4uIgogICAgaWYgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAjIENyZWF0ZSBhIHBhdGNoIHRvIHVwZGF0ZSB0aGUgQ29kZVJ1biBzdGF0dXMKICAgICAgUEFUQ0hfSlNPTj0kKGNhdCA8PEVPRgp7CiAgInN0YXR1cyI6IHsKICAgICJwdWxsUmVxdWVzdFVybCI6ICIkUFJfVVJMIiwKICAgICJsYXN0VXBkYXRlIjogIiQoZGF0ZSAtdSArIiVZLSVtLSVkVCVIOiVNOiVTWiIpIgogIH0KfQpFT0YKKQoKICAgICAgIyBBcHBseSB0aGUgcGF0Y2ggdG8gdXBkYXRlIENvZGVSdW4gc3RhdHVzCiAgICAgIGlmIGt1YmVjdGwgcGF0Y2ggY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC0tdHlwZT1tZXJnZSAtLXN1YnJlc291cmNlPXN0YXR1cyAtcCAiJFBBVENIX0pTT04iIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyFIFVwZGF0ZWQgQ29kZVJ1biBzdGF0dXMgd2l0aCBQUiBVUkwiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHVwZGF0ZSBDb2RlUnVuIHN0YXR1cyAoa3ViZWN0bCBwYXRjaCBmYWlsZWQpIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8ga3ViZWN0bCBub3QgYXZhaWxhYmxlLCBjYW5ub3QgdXBkYXRlIENvZGVSdW4gc3RhdHVzIgogICAgZmkKCiAgICAjIEFwcGx5IGNvcnJlbGF0aW9uIGxhYmVscyB3aXRoIGNvbXByZWhlbnNpdmUgZGVidWdnaW5nCiAgICBlY2hvICLwn4+377iPIEFkZGluZyBjb3JyZWxhdGlvbiBsYWJlbHMgdG8gUFIgIyR7UFJfTlVNQkVSfS4uLiIKCiAgICAjIERlYnVnOiBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAgIGVjaG8gIvCflI0gREVCVUc6IEVudmlyb25tZW50IGNoZWNrIGZvciBsYWJlbCBjcmVhdGlvbjoiCiAgICBlY2hvICIgICBUQVNLX0lEOiAnJHtUQVNLX0lEfSciCiAgICBlY2hvICIgICBXT1JLRkxPV19OQU1FOiAnJHtXT1JLRkxPV19OQU1FfSciCiAgICBlY2hvICIgICBTRVJWSUNFX05BTUU6ICcke1NFUlZJQ0VfTkFNRX0nIgogICAgZWNobyAiICAgQ09ERVJVTl9OQU1FOiAnJHtDT0RFUlVOX05BTUV9JyIKICAgIGVjaG8gIiAgIEdpdEh1YiBUb2tlbjogJChbIC1uICIkR0lUSFVCX1RPS0VOIiBdICYmIGVjaG8gJ1ByZXNlbnQnIHx8IGVjaG8gJ01pc3NpbmcnKSIKCiAgICAjIFZhbGlkYXRlIHJlcXVpcmVkIHZhcmlhYmxlcwogICAgaWYgWyAteiAiJFdPUktGTE9XX05BTUUiIF07IHRoZW4KICAgICAgZWNobyAi4p2MIEVSUk9SOiBXT1JLRkxPV19OQU1FIGlzIG5vdCBzZXQhIgogICAgICBlY2hvICLwn5SNIERFQlVHOiBBdHRlbXB0aW5nIHRvIGV4dHJhY3QgZnJvbSBDT0RFUlVOX05BTUUuLi4iCiAgICAgICMgVHJ5IHRvIGV4dHJhY3Qgd29ya2Zsb3cgbmFtZSBmcm9tIENvZGVSdW4gbmFtZSBwYXR0ZXJuCiAgICAgIGlmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF07IHRoZW4KICAgICAgICAjIFBhdHRlcm46IHNlcnZpY2UtdHt0YXNrfS1zdGFnZS17aGFzaH0gY3JlYXRlZCBieSB3b3JrZmxvdwogICAgICAgIGVjaG8gIiAgIENPREVSVU5fTkFNRSBmb3JtYXQ6ICRDT0RFUlVOX05BTUUiCiAgICAgIGZpCgogICAgICAjIENoZWNrIGlmIHdlIGNhbiBnZXQgaXQgZnJvbSBLdWJlcm5ldGVzIGxhYmVscwogICAgICBpZiBjb21tYW5kIC12IGt1YmVjdGwgPi9kZXYvbnVsbCAyPiYxICYmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF0gJiYgWyAtbiAiJE5BTUVTUEFDRSIgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IFRyeWluZyB0byBnZXQgd29ya2Zsb3cgbmFtZSBmcm9tIENvZGVSdW4gbGFiZWxzLi4uIgogICAgICAgIFdPUktGTE9XX0ZST01fTEFCRUxTPSQoa3ViZWN0bCBnZXQgY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC1vIGpzb25wYXRoPSd7Lm1ldGFkYXRhLmxhYmVscy53b3JrZmxvdy1uYW1lfScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgICAgICBpZiBbIC1uICIkV09SS0ZMT1dfRlJPTV9MQUJFTFMiIF07IHRoZW4KICAgICAgICAgIGVjaG8gIuKchSBGb3VuZCB3b3JrZmxvdyBuYW1lIGZyb20gQ29kZVJ1biBsYWJlbHM6ICRXT1JLRkxPV19GUk9NX0xBQkVMUyIKICAgICAgICAgIFdPUktGTE9XX05BTUU9IiRXT1JLRkxPV19GUk9NX0xBQkVMUyIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLinYwgQ291bGQgbm90IHJldHJpZXZlIHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIGxhYmVscyIKICAgICAgICBmaQogICAgICBmaQoKICAgICAgIyBGaW5hbCBjaGVjayAtIGlmIHN0aWxsIG5vIHdvcmtmbG93IG5hbWUsIGZhaWwgbG91ZGx5CiAgICAgIGlmIFsgLXogIiRXT1JLRkxPV19OQU1FIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBDYW5ub3QgZGV0ZXJtaW5lIFdPUktGTE9XX05BTUUgLSB0aGlzIHdpbGwgY2F1c2UgY29ycmVsYXRpb24gaXNzdWVzISIKICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBBdmFpbGFibGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOiIKICAgICAgICBlbnYgfCBncmVwIC1FICJXT1JLRkxPV3xDT0RFUlVOfFRBU0t8U0VSVklDRSIgfCBzb3J0CiAgICAgICAgIyBETyBOT1QgdXNlICd1bmtub3duJyAtIGV4aXQgd2l0aCBlcnJvciBpbnN0ZWFkCiAgICAgICAgZWNobyAi4p2MIFJlZnVzaW5nIHRvIHVzZSAndW5rbm93bicgbGFiZWwgLSBmYWlsaW5nIHRhc2siCiAgICAgICAgZXhpdCAxCiAgICAgIGZpCiAgICBmaQoKICAgIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICAgIFJVTl9MQUJFTD0icnVuLSR7V09SS0ZMT1dfTkFNRX0iCiAgICBTRVJWSUNFX0xBQkVMPSJzZXJ2aWNlLSR7U0VSVklDRV9OQU1FfSIKCiAgICBlY2hvICLwn5OLIExhYmVscyB0byBhcHBseToiCiAgICBlY2hvICIgICBUYXNrOiAkVEFTS19MQUJFTCIKICAgIGVjaG8gIiAgIFJ1bjogJFJVTl9MQUJFTCIKICAgIGVjaG8gIiAgIFNlcnZpY2U6ICRTRVJWSUNFX0xBQkVMIgoKICAgICMgVHJ5IHRvIGFkZCBsYWJlbHMgd2l0aCBkZXRhaWxlZCBlcnJvciBjYXB0dXJlCiAgICBlY2hvICLwn5SNIERFQlVHOiBBdHRlbXB0aW5nIHRvIGFkZCBsYWJlbHMgdG8gUFIuLi4iCiAgICBMQUJFTF9FUlJPUj0kKGdoIHByIGVkaXQgIiRQUl9OVU1CRVIiIC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1hZGQtbGFiZWwgIiR7VEFTS19MQUJFTH0sJHtSVU5fTEFCRUx9LCR7U0VSVklDRV9MQUJFTH0iIDI+JjEpCiAgICBMQUJFTF9FWElUX0NPREU9JD8KCiAgICBpZiBbICRMQUJFTF9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgICBlY2hvICLinIUgQWRkZWQgY29ycmVsYXRpb24gbGFiZWxzIHN1Y2Nlc3NmdWxseSIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWxzIChleGl0IGNvZGU6ICRMQUJFTF9FWElUX0NPREUpIgogICAgICBlY2hvICLwn5SNIERFQlVHOiBFcnJvciBvdXRwdXQ6ICRMQUJFTF9FUlJPUiIKCiAgICAgICMgQ2hlY2sgaWYgbGFiZWxzIGV4aXN0CiAgICAgIGVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIHdoaWNoIGxhYmVscyBleGlzdC4uLiIKICAgICAgZm9yIGxhYmVsIGluICIkVEFTS19MQUJFTCIgIiRSVU5fTEFCRUwiICIkU0VSVklDRV9MQUJFTCI7IGRvCiAgICAgICAgaWYgZ2ggbGFiZWwgbGlzdCAtUiAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIC0tc2VhcmNoICIkbGFiZWwiIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBleGlzdHMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiICAg4pyXIExhYmVsICckbGFiZWwnIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgIyBDcmVhdGUgdGhlIG1pc3NpbmcgbGFiZWwKICAgICAgICAgIGVjaG8gIiAgIPCfk50gQ3JlYXRpbmcgbGFiZWwgJyRsYWJlbCcuLi4iCiAgICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgcnVuIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iVW5rbm93biBsYWJlbCB0eXBlIiA7OwogICAgICAgICAgZXNhYwoKICAgICAgICAgIENSRUFURV9FUlJPUj0kKGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiIDI+JjEpCiAgICAgICAgICBDUkVBVEVfRVhJVD0kPwogICAgICAgICAgaWYgWyAkQ1JFQVRFX0VYSVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIgICDinIUgQ3JlYXRlZCBsYWJlbCAnJGxhYmVsJyIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBjcmVhdGUgbGFiZWwgJyRsYWJlbCc6ICRDUkVBVEVfRVJST1IiCiAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgIGRvbmUKCiAgICAgICMgUmV0cnkgYWRkaW5nIGxhYmVscyB3aXRoIGluZGl2aWR1YWwgYXR0ZW1wdHMKICAgICAgZWNobyAi8J+UjSBERUJVRzogUmV0cnlpbmcgbGFiZWwgYWRkaXRpb24gaW5kaXZpZHVhbGx5Li4uIgogICAgICBMQUJFTFNfQURERUQ9MAogICAgICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFJVTl9MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIjsgZG8KICAgICAgICBSRVRSWV9FUlJPUj0kKGdoIHByIGVkaXQgIiRQUl9OVU1CRVIiIC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgMj4mMSkKICAgICAgICBSRVRSWV9FWElUPSQ/CiAgICAgICAgaWYgWyAkUkVUUllfRVhJVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgICBlY2hvICIgICDinIUgQWRkZWQgbGFiZWwgJyRsYWJlbCciCiAgICAgICAgICBMQUJFTFNfQURERUQ9JCgoTEFCRUxTX0FEREVEICsgMSkpCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCc6ICRSRVRSWV9FUlJPUiIKICAgICAgICBmaQogICAgICBkb25lCgogICAgICBpZiBbICRMQUJFTFNfQURERUQgLWVxIDMgXTsgdGhlbgogICAgICAgIGVjaG8gIuKchSBBbGwgbGFiZWxzIGFkZGVkIHN1Y2Nlc3NmdWxseSBhZnRlciByZXRyeSIKICAgICAgZWxpZiBbICRMQUJFTFNfQURERUQgLWd0IDAgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBQYXJ0aWFsIHN1Y2Nlc3M6ICRMQUJFTFNfQURERUQvMyBsYWJlbHMgYWRkZWQiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICLinYwgQ1JJVElDQUw6IENvdWxkIG5vdCBhZGQgYW55IGxhYmVscyB0byBQUiIKICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyBQUiBzdGF0ZS4uLiIKICAgICAgICBQUl9TVEFURT0kKGdoIHByIHZpZXcgIiRQUl9OVU1CRVIiIC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1qc29uIHN0YXRlIC1xIC5zdGF0ZSAyPi9kZXYvbnVsbCB8fCBlY2hvICJVTktOT1dOIikKICAgICAgICBlY2hvICIgICBQUiBTdGF0ZTogJFBSX1NUQVRFIgogICAgICAgIGlmIFsgIiRQUl9TVEFURSIgPSAiQ0xPU0VEIiBdIHx8IFsgIiRQUl9TVEFURSIgPSAiTUVSR0VEIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinYwgUFIgaXMgJFBSX1NUQVRFIC0gY2Fubm90IGFkZCBsYWJlbHMgdG8gY2xvc2VkL21lcmdlZCBQUnMiCiAgICAgICAgZmkKICAgICAgZmkKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4oS577iPIE5vIFBSIGZvdW5kIGZvciB0aGlzIHRhc2sgKENsYXVkZSBtYXkgbm90IGhhdmUgY3JlYXRlZCBvbmUpIgogIGZpCmVsc2UKICBlY2hvICLihLnvuI8gU2tpcHBpbmcgUFIgbGFiZWxpbmc6IG1pc3NpbmcgR0lUSFVCX1RPS0VOIG9yIGdoIENMSSIKZmkKCiMgV3JpdGUgc2VudGluZWwgZmlsZSB0byBzaWduYWwgc2lkZWNhciB0byBzdG9wIChLdWJlcm5ldGVzLW5hdGl2ZSBmaWxlIHdhdGNoKQp0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKCiMgRmluYWwgdGVybWluYXRpb24gc2VxdWVuY2UKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIFJFWCBDT05UQUlORVIgVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICJDb250YWluZXIgUElEOiAkJCIKZWNobyAiRmluYWwgUHJvY2VzcyBDaGVjazoiCnBzIGF1eCB8IGhlYWQgLTUKCiMgV3JpdGUgY29tcGxldGlvbiBtYXJrZXIgZm9yIHdvcmtmbG93IHRyYWNraW5nCmVjaG8gInJleC1yZW1lZGlhdGlvbi1jb21wbGV0ZWQ6JChkYXRlIC11ICslWS0lbS0lZFQlSDolTTolU1opIiA+IC93b3Jrc3BhY2UvLnJleC1jb21wbGV0ZQoKIyBGb3JjZSBleGl0IHRvIHRlcm1pbmF0ZSB0aGUgcG9kCmVjaG8gIvCflJogRm9yY2UgdGVybWluYXRpbmcgY29udGFpbmVyLi4uIgpleGl0IDAK - code_claude_container-rex.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIFJFWCBET0NVTUVOVEFUSU9OIFdPUktGTE9XIFNUQVJUSU5HICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24gQWdlbnQgQWN0aXZlICAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZEgICAgICAgICAgICDimqDvuI8gIFRBU0sge3t0YXNrX2lkfX0gT05MWSAtIE5PIE9USEVSIFRBU0tTIOKaoO+4jyAgICAgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCfk5ogRm9jdXM6IERvY3VtZW50YXRpb24tZmlyc3QgaW1wbGVtZW50YXRpb24gYXBwcm9hY2giCmVjaG8gIvCfk4sgVGFzayBJRDoge3t0YXNrX2lkfX0iCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCiMgU2V0IHVwIEVYSVQgdHJhcCB0byBlbnN1cmUgRG9ja2VyIHNpZGVjYXIgY2xlYW51cAp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKZWNobyAi4puUIENSSVRJQ0FMOiBZb3UgbXVzdCBPTkxZIHdvcmsgb24gVGFzayB7e3Rhc2tfaWR9fSAtIGlnbm9yZSBBTEwgb3RoZXIgdGFza3MiCgojIENsZWFuIHVwIGFueSBsZWZ0b3ZlciBzZW50aW5lbCBmaWxlIGZyb20gcHJldmlvdXMgcnVucwojIFRoaXMgcHJldmVudHMgcHJlbWF0dXJlIHNpZGVjYXIgc2h1dGRvd24gb24gc2VxdWVudGlhbCB0YXNrIGV4ZWN1dGlvbnMKaWYgWyAtZiAvd29ya3NwYWNlLy5hZ2VudF9kb25lIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgQ2xlYW5pbmcgdXAgc2VudGluZWwgZmlsZSBmcm9tIHByZXZpb3VzIHJ1biIKICAgIHJtIC1mIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUKZmkKCiMgRGlzYWJsZSBpbnRlcmFjdGl2ZSBHaXQgcHJvbXB0cyBnbG9iYWxseQpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyBSZXBvc2l0b3J5IFVSTApSRVBPX1VSTD0ie3tyZXBvc2l0b3J5X3VybH19IgoKIyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcwplY2hvICJVc2luZyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uIgoKIyBBdXRoZW50aWNhdGUgd2l0aCBHaXRIdWIgQXBwCmlmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX0lEIiBdOyB0aGVuCiAgICBlY2hvICJBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAuLi4iCgogICAgIyBDcmVhdGUgdGVtcG9yYXJ5IHByaXZhdGUga2V5IGZpbGUgKHN1cHBvcnQgZXNjYXBlZCBuZXdsaW5lcykKICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgogICAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBHZW5lcmF0ZSBKV1QgdG9rZW4gZm9yIEdpdEh1YiBBcHAgKGZpeGVkIEpXVCBnZW5lcmF0aW9uIGZvciBMaW51eCBjb250YWluZXJzKQogICAgIyBKV1QgaGVhZGVyCiAgICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBKV1QgcGF5bG9hZCB3aXRoIGN1cnJlbnQgdGltZSBhbmQgZXhwaXJhdGlvbiAoMTAgbWludXRlcykKICAgIE5PVz0kKGRhdGUgKyVzKQogICAgRVhQPSQoKE5PVyArIDYwMCkpCiAgICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIFNpZ24gdGhlIEpXVAogICAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICAgIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgdGhlIHJlcG9zaXRvcnkgKHJvYnVzdCBwYXJzaW5nIG9mIG93bmVyL3JlcG8pCiAgICBJTlBVVF9SRVBPPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBSRVBPX09XTkVSPSIiCiAgICBSRVBPX05BTUU9IiIKCiAgICBpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vW14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgICAgICMgU1NIIGZvcm1hdCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvKC5naXQpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2s6IGFzc3VtZSBzbHVnIG93bmVyL3JlcG8gKHBvc3NpYmx5IHdpdGggLmdpdCkKICAgICAgICBTTFVHPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfFwuZ2l0JHx8JykKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMSkKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYyKQogICAgZmkKCiAgICBlY2hvICJERUJVRzogUGFyc2VkIHJlcG9zaXRvcnkgLSBPd25lcjogJyRSRVBPX09XTkVSJywgTmFtZTogJyRSRVBPX05BTUUnIgoKICAgIGVjaG8gIkdldHRpbmcgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FLi4uIgoKICAgICMgR2V0IHRoZSBpbnN0YWxsYXRpb24gSUQgKHJldHJ5IGFuZCBmb2xsb3cgcmVkaXJlY3RzKS4gRmFsbGJhY2sgdG8gb3JnIGluc3RhbGxhdGlvbi4KICAgIElOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIikKCiAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBSZXBvIGluc3RhbGxhdGlvbiBub3QgZm91bmQsIHRyeWluZyBvcmcgaW5zdGFsbGF0aW9uLi4uIgogICAgICAgIE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iKQogICAgICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQogICAgZmkKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gSUQgZm9yICRSRVBPX09XTkVSLyRSRVBPX05BTUUiCiAgICAgICAgZWNobyAiUmVzcG9uc2UgKHJlcG8pOiAkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIgogICAgICAgIGVjaG8gIlJlc3BvbnNlIChvcmcpOiAgJHtPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFOi1bbm9uZV19IgogICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgZWNobyAiSW5zdGFsbGF0aW9uIElEOiAkSU5TVEFMTEFUSU9OX0lEIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBhY2Nlc3MgdG9rZW4KICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgIEdJVEhVQl9UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKICAgIFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKSAgIyBUcmFjayB3aGVuIHRva2VuIHdhcyBnZW5lcmF0ZWQgZm9yIHJlZnJlc2ggbG9naWMKCiAgICBpZiBbICIkR0lUSFVCX1RPS0VOIiA9ICJudWxsIiBdIHx8IFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuIgogICAgICAgIGVjaG8gIlJlc3BvbnNlOiAkVE9LRU5fUkVTUE9OU0UiCiAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICAjIENsZWFuIHVwIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgRXhwb3J0IHRoZSB0b2tlbiBmb3IgZ2l0IHRvIHVzZQogICAgZXhwb3J0IEdJVEhVQl9UT0tFTgoKICAgICMgQ29uZmlndXJlIGdpdCB0byB1c2UgdGhlIHRva2VuICh1c2UgLS1yZXBsYWNlLWFsbCB0byBoYW5kbGUgbXVsdGlwbGUgZXhpc3RpbmcgaGVscGVycykKICAgIGdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciBzdG9yZQogICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKCiAgICAjIEFsc28gYXV0aGVudGljYXRlIGdoIENMSSB3aXRoIHRoZSB0b2tlbgogICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbgoKICAgIGVjaG8gIuKckyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5IgoKICAgICMgVG9rZW4gcmVmcmVzaCBmdW5jdGlvbnMgZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbigpIHsKICAgICAgICBlY2hvICLwn5SEIFJlZnJlc2hpbmcgR2l0SHViIEFwcCB0b2tlbi4uLiIKCiAgICAgICAgIyBDcmVhdGUgdGVtcG9yYXJ5IGtleSBmaWxlCiAgICAgICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS0kJCIKICAgICAgICBlY2hvICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAgICAgIyBHZW5lcmF0ZSBuZXcgSldUCiAgICAgICAgSldUX1RPS0VOPSQocnVieSAtciBvcGVuc3NsIC1yIGpzb24gLXIgYmFzZTY0IC1lICIKICAgICAgICBrZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUucmVhZCgnJFRFTVBfS0VZX0ZJTEUnKSkKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgICBpYXQ6IFRpbWUubm93LnRvX2kgLSA2MCwKICAgICAgICAgICAgZXhwOiBUaW1lLm5vdy50b19pICsgKDEwICogNjApLAogICAgICAgICAgICBpc3M6ICckR0lUSFVCX0FQUF9JRCcKICAgICAgICB9CiAgICAgICAgaGVhZGVyID0geyBhbGc6ICdSUzI1NicsIHR5cDogJ0pXVCcgfQoKICAgICAgICBoZWFkZXJfZW5jID0gQmFzZTY0LnVybHNhZmVfZW5jb2RlNjQoaGVhZGVyLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBwYXlsb2FkX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KHBheWxvYWQudG9fanNvbikuZ3N1YignPScsICcnKQogICAgICAgIHNpZ25hdHVyZSA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGtleS5zaWduKE9wZW5TU0w6OkRpZ2VzdDo6U0hBMjU2Lm5ldywgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9XCIpKS5nc3ViKCc9JywgJycpCgogICAgICAgIHB1dHMgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9LiN7c2lnbmF0dXJlfVwiCiAgICAgICAgIikKCiAgICAgICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIChyZXVzZSBsb2dpYyBmcm9tIGluaXRpYWwgYXV0aCkKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCgogICAgICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKICAgICAgICBmaQoKICAgICAgICAjIEdldCBuZXcgaW5zdGFsbGF0aW9uIHRva2VuCiAgICAgICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgICAgIE5FV19UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKCiAgICAgICAgaWYgWyAiJE5FV19UT0tFTiIgIT0gIm51bGwiIF0gJiYgWyAtbiAiJE5FV19UT0tFTiIgXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgICAgICAgICBleHBvcnQgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCgogICAgICAgICAgICAjIFVwZGF0ZSBnaXQgY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAyPi9kZXYvbnVsbAoKICAgICAgICAgICAgZWNobyAi4pyFIFRva2VuIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkiCiAgICAgICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgIH0KCiAgICAjIENoZWNrIGlmIHRva2VuIG5lZWRzIHJlZnJlc2ggKGNhbGwgYmVmb3JlIGdpdCBvcGVyYXRpb25zKQogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQoKSB7CiAgICAgICAgaWYgWyAteiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLimqDvuI8gTm8gdG9rZW4gdGltZXN0YW1wIGZvdW5kLCByZWZyZXNoaW5nIHRva2VuLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmaQoKICAgICAgICBOT1c9JChkYXRlICslcykKICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgIyBSZWZyZXNoIGlmIHRva2VuIGlzIG9sZGVyIHRoYW4gNTAgbWludXRlcyAodG9rZW5zIGxhc3QgMSBob3VyLCByZWZyZXNoIGF0IDUwIG1pbiB0byBiZSBzYWZlKQogICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMzAwMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflIQgVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgZmkKICAgIH0KCmVsc2UKICAgIGVjaG8gIuKdjCBHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIG9yIEdJVEhVQl9BUFBfSUQgbm90IGZvdW5kIgogICAgZXhpdCAxCmZpCgojIEdpdCBjb25maWd1cmF0aW9uIHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvd29ya3NwYWNlCgojIFNldCBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uIC0gdXNlIGdlbmVyaWMgZm9ybWF0IGZvciBhbGwgYWdlbnRzCmRlcml2ZV9ib3RfaWRlbnRpdHkoKSB7CiAgICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogICAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dG9tYXRpb25bYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgcmV0dXJuCiAgICBmaQoKICAgIGxvY2FsIHNsdWcKICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICAgIGlmIFsgLXogIiRzbHVnIiBdOyB0aGVuCiAgICAgICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgICBmaQoKICAgIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogICAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICAgIGlmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICAgICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgICAgIGxvY2FsIGJvdF9yZXNwb25zZQogICAgICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgICAgbG9jYWwgYm90X2lkCiAgICAgICAgYm90X2lkPSQocHJpbnRmICclcycgIiRib3RfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyBlbXB0eScgMj4vZGV2L251bGwgfHwgZWNobyAnJykKICAgICAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgICAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgZmkKICAgIGZpCgogICAgR0lUX0FVVEhPUl9OQU1FPSIkYm90X2xvZ2luIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKIyBDb25maWd1cmUgZ2l0IHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCgojIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsYXVkZSBDb2RlIHRvIHVzZQpleHBvcnQgR0lUX0FVVEhPUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX05BTUU9IiRHSVRfQVVUSE9SX05BTUUiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX0VNQUlMPSIkR0lUX0FVVEhPUl9FTUFJTCIKZWNobyAi4pyTIEdpdCBjb25maWd1cmVkIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEFVVEhFTlRJQ0FUSU9OIFZFUklGSUNBVElPTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SQIEFVVEhFTlRJQ0FUSU9OIFZFUklGSUNBVElPTiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCgojIFJlcG9zaXRvcnkgVVJMcyAtIEhhbmRsZSBib3RoIGZ1bGwgVVJMcyBhbmQgb3JnL3JlcG8gZm9ybWF0CiMgQ2hlY2sgaWYgcmVwb3NpdG9yeV91cmwgYWxyZWFkeSBjb250YWlucyBodHRwczovL2dpdGh1Yi5jb20vCmlmIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJeaHR0cHM6Ly9naXRodWIuY29tLyI7IHRoZW4KICAgIFJFUE9fSFRUUF9VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKICAgIGlmICEgZWNobyAie3tyZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBSRVBPX0hUVFBfVVJMPSIke1JFUE9fSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIFJFUE9fSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e3JlcG9zaXRvcnlfdXJsfX0uZ2l0IgpmaQoKIyBTYW1lIGZvciBkb2NzIHJlcG9zaXRvcnkKaWYgZWNobyAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBET0NTX0hUVFBfVVJMPSJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIKICAgIGlmICEgZWNobyAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXC5naXQkIjsgdGhlbgogICAgICAgIERPQ1NfSFRUUF9VUkw9IiR7RE9DU19IVFRQX1VSTH0uZ2l0IgogICAgZmkKZWxzZQogICAgRE9DU19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL3t7ZG9jc19yZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgREVCVUc6IFNob3cgd2hhdCBVUkxzIGFyZSBiZWluZyBjb25zdHJ1Y3RlZAplY2hvICLwn5SNIERFQlVHOiBVUkwgQ29uc3RydWN0aW9uICYgUGFyYW1ldGVycyIKZWNobyAiICBJbnB1dCByZXBvc2l0b3J5X3VybDogJ3t7cmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19yZXBvc2l0b3J5X3VybDogJ3t7ZG9jc19yZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICBJbnB1dCBkb2NzX3Byb2plY3RfZGlyZWN0b3J5OiAne3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0nIgplY2hvICIgIElucHV0IHdvcmtpbmdfZGlyZWN0b3J5OiAne3t3b3JraW5nX2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCBkb2NzX2JyYW5jaDogJ3t7ZG9jc19icmFuY2h9fSciCmVjaG8gIiAgSW5wdXQgZ2l0aHViX2FwcDogJ3t7Z2l0aHViX2FwcH19JyIKZWNobyAiICBJbnB1dCB0YXNrX2lkOiAne3t0YXNrX2lkfX0nIgplY2hvICIgIElucHV0IHNlcnZpY2U6ICd7e3NlcnZpY2V9fSciCmVjaG8gIiAgQ29uc3RydWN0ZWQgUkVQT19IVFRQX1VSTDogJyRSRVBPX0hUVFBfVVJMJyIKZWNobyAiICBDb25zdHJ1Y3RlZCBET0NTX0hUVFBfVVJMOiAnJERPQ1NfSFRUUF9VUkwnIgplY2hvICIgIEN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKZWNobyAiICBBdmFpbGFibGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOiIKZW52IHwgZ3JlcCAtRSAiKEdJVEhVQnxBTlRIUk9QSUMpIiB8IHNvcnQKCiMgVGVzdCBIVFRQUyBhY2Nlc3MgdG8gcmVwb3NpdG9yeQplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkUkVQT19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRSRVBPX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9yZXBvX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0KSIKICBlY2hvICIgIEdpdCBjcmVkZW50aWFsIGhlbHBlciBzdGF0dXM6IgogIGdpdCBjb25maWcgLS1saXN0IHwgZ3JlcCBjcmVkZW50aWFsIHx8IGVjaG8gIiAgTm8gY3JlZGVudGlhbCBoZWxwZXJzIGNvbmZpZ3VyZWQiCiAgZWNobyAiIgogIGVjaG8gIvCfmqsgQUJPUlRJTkc6IENhbm5vdCBhY2Nlc3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIFRlc3QgZG9jcyByZXBvc2l0b3J5IGFjY2VzcwplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRET0NTX0hUVFBfVVJMXCIgSEVBRCIKaWYgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPiAvdG1wL2RvY3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCkiCiAgZWNobyAiIgogIGVjaG8gIvCfmqsgQUJPUlRJTkc6IENhbm5vdCBhY2Nlc3MgZG9jcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIKICBleGl0IDEKZmkKCiMgRHVhbCBSZXBvc2l0b3J5IFNldHVwIC0gUGxhdGZvcm0gcmVwbyBmb3IgZG9jcywgVGFyZ2V0IHJlcG8gZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLilZEgICAgICAgICAgICAgICAgIERVQUwgUkVQT1NJVE9SWSBTRVRVUCAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBSZXBvc2l0b3J5IEluZm9ybWF0aW9uCkRPQ1NfQlJBTkNIPSJ7e2RvY3NfYnJhbmNofX0iCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgoKIyBIZWxwZXI6IGRlcml2ZSBzYWZlIHdvcmtzcGFjZSBkaXJlY3RvcnkgbmFtZSBmcm9tIHJlcG8gaW5wdXQgKFVSTCwgU1NILCBvciBzbHVnKQpzYW5pdGl6ZV9yZXBvX2RpcigpIHsKICAgIGlucHV0PSIkMSIKICAgIGlmIGVjaG8gIiRpbnB1dCIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgb3duZXI9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspLy4qfFwxfCcpCiAgICAgICAgbmFtZT0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tL1teL10rLyhbXi9dKykoXFwuZ2l0KT98XDF8JykKICAgICAgICBwcmludGYgJyVzLSVzJyAiJG93bmVyIiAiJG5hbWUiCiAgICBlbGlmIGVjaG8gIiRpbnB1dCIgfCBncmVwIC1xRSAnXmdpdEBnaXRodWIuY29tOic7IHRoZW4KICAgICAgICBvd25lcj0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rKS8uKnxcMXwnKQogICAgICAgIG5hbWU9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXFwuZ2l0KT98XDF8JykKICAgICAgICBwcmludGYgJyVzLSVzJyAiJG93bmVyIiAiJG5hbWUiCiAgICBlbHNlCiAgICAgICAgIyBBc3N1bWUgb3duZXIvcmVwbyAob3B0aW9uYWxseSB3aXRoIC5naXQpCiAgICAgICAgc2x1Zz0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8XFwuZ2l0JHx8JykKICAgICAgICBlY2hvICIkc2x1ZyIgfCB0ciAnLycgJy0nCiAgICBmaQp9CgojIERlcml2ZSB3b3Jrc3BhY2UgZGlyZWN0b3J5IG5hbWVzIChvd25lci1yZXBvKQpET0NTX1JFUE9fRElSPSQoc2FuaXRpemVfcmVwb19kaXIgInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IikKVEFSR0VUX1JFUE9fRElSPSQoc2FuaXRpemVfcmVwb19kaXIgInt7cmVwb3NpdG9yeV91cmx9fSIpCgplY2hvICI9PT0gUkVQT1NJVE9SWSBTRVRVUCA9PT0iCmVjaG8gIkRvY3MgcmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKZWNobyAiVGFyZ2V0IHJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgplY2hvICJEb2NzIGJyYW5jaDogJERPQ1NfQlJBTkNIIgplY2hvICJHaXRIdWIgQXBwOiAkR0lUSFVCX0FQUCIKCiMgQWx3YXlzIHVzZSBjb25zaXN0ZW50IHdvcmtmbG93IGFwcHJvYWNoCiMgRXZlbiBpZiBkb2NzIGFuZCB0YXJnZXQgYXJlIHRoZSBzYW1lIHJlcG8sIHdlIGNsb25lIHRoZW0gc2VwYXJhdGVseQojIFRoaXMgYXZvaWRzIGNvbXBsZXggYnJhbmNoIHN3aXRjaGluZyBhbmQgZmlsZSBwcmVzZXJ2YXRpb24gaXNzdWVzCmVjaG8gIj09PSBVTklGSUVEIFdPUktGTE9XIEFQUFJPQUNIID09PSIKZWNobyAiICBkb2NzX3JlcG9zaXRvcnlfdXJsOiAne3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIHJlcG9zaXRvcnlfdXJsOiAne3tyZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICDilJTilIAgVGFza01hc3RlciBmaWxlcyB3aWxsIGJlIGNvcGllZCBmcm9tIGRvY3MgcmVwbyBhdDoge3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iCgojIFJlcG9zaXRvcnkgU2V0dXAgLSBBbHdheXMgdXNlIGNvbnNpc3RlbnQgYXBwcm9hY2gKZWNobyAiPT09IFJFUE9TSVRPUlkgU0VUVVAgPT09IgoKIyBTdGVwIDE6IENsb25lIG9yIHVwZGF0ZSBkb2NzIHJlcG9zaXRvcnkgdGVtcG9yYXJpbHkKaWYgWyAtZCAiL3RtcC9kb2NzLXJlcG8iIF07IHRoZW4KICAgIGVjaG8gIvCflIQgRE9DUyBSRVBPU0lUT1JZOiBVUERBVEUgLSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGV4aXN0cyIKICAgIGNkIC90bXAvZG9jcy1yZXBvCiAgICBnaXQgZmV0Y2ggb3JpZ2luCiAgICBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIKICAgIGdpdCByZXNldCAtLWhhcmQgIm9yaWdpbi8kRE9DU19CUkFOQ0giCiAgICBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IHVwZGF0ZWQiCmVsc2UKICAgIGVjaG8gIvCfk6UgRE9DUyBSRVBPU0lUT1JZOiBDTE9OSU5HIC0gZXh0cmFjdGluZyB0YXNrIGZpbGVzIgogICAgaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbzsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gY2xvbmUgZG9jcyByZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogICAgICAgIGV4aXQgMQogICAgZmkKICAgIGNkIC90bXAvZG9jcy1yZXBvICYmIGdpdCBjaGVja291dCAiJERPQ1NfQlJBTkNIIiAmJiBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCB0byB0ZW1wb3JhcnkgbG9jYXRpb24iCmZpCgojIFN0ZXAgMjogQ2xvbmUgb3IgdXBkYXRlIHRhcmdldCByZXBvc2l0b3J5CmlmIFsgLWQgIiRUQVJHRVRfUkVQT19ESVIiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgVEFSR0VUIFJFUE9TSVRPUlk6IFVQREFURSAtIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIKICAgIGVjaG8gIvCfk4EgRm91bmQgZXhpc3RpbmcgdGFyZ2V0IHJlcG9zaXRvcnkgJyRUQVJHRVRfUkVQT19ESVInLCB1cGRhdGluZy4uLiIKICAgIGNkICIkVEFSR0VUX1JFUE9fRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiBtYWluCiAgICBnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbi9tYWluCiAgICBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkiCmVsc2UKICAgIGVjaG8gIvCfk6UgVEFSR0VUIFJFUE9TSVRPUlk6IENMT05JTkcgLSBmaXJzdCB0aW1lIHNldHVwIgogICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJFRBUkdFVF9SRVBPX0RJUiI7IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNsb25lIHRhcmdldCByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICAgICAgICBleGl0IDEKICAgIGZpCiAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgY2xvbmVkIHN1Y2Nlc3NmdWxseSIKZmkKCiMgU3RlcCAzOiBDb3B5IHRhc2sgZmlsZXMgZnJvbSBkb2NzIHJlcG8gdG8gdGFyZ2V0IHJlcG8KZWNobyAi8J+TiyBUQVNLIEZJTEVTOiBDT1BZSU5HIGZyb20gZG9jcyB0byB0YXJnZXQgcmVwb3NpdG9yeSIKbWtkaXIgLXAgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrIgoKIyBEZXRlcm1pbmUgZG9jcyBwcm9qZWN0IGRpcmVjdG9yeSBwYXRoCnt7I2lmIGRvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fQppZiBbICJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIgPSAiLiIgXTsgdGhlbgogICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKZWxzZQogICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby97e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fS8udGFza21hc3RlciIKZmkKe3tlbHNlfX0KRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKe3svaWZ9fQoKIyBDb3B5IHNwZWNpZmljIHRhc2sgZmlsZXMKVEFTS19ESVI9IiRET0NTX1BBVEgvZG9jcy90YXNrLXt7dGFza19pZH19IgplY2hvICLwn5SNIERFQlVHOiBMb29raW5nIGZvciB0YXNrIGZpbGVzIGF0OiAkVEFTS19ESVIiCmVjaG8gIvCflI0gREVCVUc6IERvY3MgcGF0aCBpczogJERPQ1NfUEFUSCIKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgZG9jcyB0ZW1wIGRpcmVjdG9yeToiCmxzIC1sYSAvdG1wL2RvY3MtcmVwby8udGFza21hc3Rlci8gfHwgZWNobyAiTm8gLnRhc2ttYXN0ZXIgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIGRvY3MgZGlyZWN0b3J5OiIKbHMgLWxhIC90bXAvZG9jcy1yZXBvLy50YXNrbWFzdGVyL2RvY3MvIHx8IGVjaG8gIk5vIGRvY3MgZGlyZWN0b3J5IGZvdW5kIgoKaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICBlY2hvICLwn5SNIERFQlVHOiBUYXNrIGRpcmVjdG9yeSBmb3VuZCwgY29udGVudHM6IgogICAgbHMgLWxhICIkVEFTS19ESVIiCgogICAgZWNobyAi4pyFIENvcHlpbmcgdGFzay5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvdGFzay5tZCIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgJiYgZWNobyAi4pyTIHRhc2subWQgY29waWVkIiB8fCBlY2hvICLinYwgdGFzay5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kLi4uIgogICAgY3AgIiRUQVNLX0RJUi9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGNvcHkgZmFpbGVkIgoKICAgIGVjaG8gIuKchSBDb3B5aW5nIHByb21wdC5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvcHJvbXB0Lm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgcHJvbXB0Lm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHByb21wdC5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBjbGllbnQtY29uZmlnLmpzb24uLi4iCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICAgICAgICBjcCAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiAiJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iICYmIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBjb3B5IGZhaWxlZCIKICAgICAgICBjcCAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iICYmIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIHRvIHdvcmtzcGFjZSByb290IiB8fCBlY2hvICLinYwgY2xpZW50LWNvbmZpZy5qc29uIGNvcHkgdG8gd29ya3NwYWNlIGZhaWxlZCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCAtIE1DUCBjbGllbnQgbWF5IG5vdCBiZSBjb25maWd1cmVkIgogICAgZmkKCiAgICBlY2hvICLinIUgQ29weWluZyB0b29sbWFuLWd1aWRlLm1kLi4uIgogICAgaWYgWyAtZiAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyB0b29sbWFuLWd1aWRlLm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHRvb2xtYW4tZ3VpZGUubWQgY29weSBmYWlsZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIHRvb2xtYW4tZ3VpZGUubWQgbm90IGZvdW5kIC0gY29kZSBhZ2VudCB3b24ndCBoYXZlIHRvb2wgdXNhZ2UgZ3VpZGFuY2UiCiAgICBmaQoKICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCBmcm9tICRUQVNLX0RJUiIKZWxzZQogICAgZWNobyAi4p2MIENSSVRJQ0FMOiBUYXNrIHt7dGFza19pZH19IGRpcmVjdG9yeSBub3QgZm91bmQgYXQ6ICRUQVNLX0RJUiIKICAgIGVjaG8gIvCflI0gREVCVUc6IEF2YWlsYWJsZSBkaXJlY3RvcmllcyBpbiBkb2NzOiIKICAgIGZpbmQgL3RtcC9kb2NzLXJlcG8gLW5hbWUgInRhc2stKiIgLXR5cGUgZCB8fCBlY2hvICJObyB0YXNrIGRpcmVjdG9yaWVzIGZvdW5kIgpmaQoKIyBDb3B5IGFyY2hpdGVjdHVyZS5tZCBmcm9tIGRvY3Mgcm9vdApBUkNIX0ZJTEU9IiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiCmlmIFsgLWYgIiRBUkNIX0ZJTEUiIF07IHRoZW4KICAgIGNwICIkQVJDSF9GSUxFIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgZWNobyAi4pyTIEFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uIGNvcGllZCIKZWxzZQogICAgZWNobyAi4pqg77iPIGFyY2hpdGVjdHVyZS5tZCBub3QgZm91bmQgYXQ6ICRBUkNIX0ZJTEUiCmZpCgojIENvcHkgdGFza3MuanNvbiBpZiBpdCBleGlzdHMKaWYgWyAtZiAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiBdOyB0aGVuCiAgICBjcCAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgZWNobyAi4pyTIHRhc2tzLmpzb24gY29waWVkIgpmaQoKZWNobyAi4pyTIFRhc2sgZmlsZXMgY29waWVkIHRvIHRhcmdldCByZXBvc2l0b3J5IgoKIyBERUJVRzogVmVyaWZ5IGZpbGVzIHdlcmUgY29waWVkIHN1Y2Nlc3NmdWxseQplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiB0YXJnZXQgdGFzayBkaXJlY3RvcnkgYWZ0ZXIgY29weToiCmxzIC1sYSAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGlmIHByb21wdC5tZCBleGlzdHM6IgpbIC1mICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay9wcm9tcHQubWQiIF0gJiYgZWNobyAi4pyFIHByb21wdC5tZCBleGlzdHMiIHx8IGVjaG8gIuKdjCBwcm9tcHQubWQgbWlzc2luZyIKCiMgU3RlcCA0OiBDbGVhbiB1cCBkb2NzIHJlcG9zaXRvcnkKZWNobyAi8J+nuSBDTEVBTlVQOiBSZW1vdmluZyB0ZW1wb3JhcnkgZG9jcyByZXBvc2l0b3J5IgpybSAtcmYgL3RtcC9kb2NzLXJlcG8KZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbGVhbmVkIHVwIgoKIyBTZXQgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IHJvb3QKIyBETyBOT1Qgb3ZlcndyaXRlIFJFUE9fTkFNRSAtIGl0J3MgYWxyZWFkeSBjb3JyZWN0bHkgcGFyc2VkIGZvciBHaXRIdWIgQVBJIGNhbGxzCldPUktTUEFDRV9ESVI9IiRUQVJHRVRfUkVQT19ESVIiCmVjaG8gIuKckyBXb3JraW5nIGRpcmVjdG9yeTogL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKCiMgU2V0IENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSBlYXJseSAobmVlZGVkIGZvciBjbGllbnQtY29uZmlnLmpzb24gY29weSkKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXTsgdGhlbgogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8kV09SS19ESVIiCmZpCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSIgplY2hvICLinJMgU2V0IENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKCiMgU2V0dXAgZmVhdHVyZSBicmFuY2ggZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIj09PSBCUkFOQ0ggU0VUVVAgPT09IgpjZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKCiMgU3luYyB3aXRoIGxhdGVzdCBtYWluIHRvIHByZXZlbnQgY29uZmxpY3RzCmVjaG8gIvCflIQgU3luY2luZyB3aXRoIGxhdGVzdCBtYWluIHRvIHByZXZlbnQgY29uZmxpY3RzLi4uIgpnaXQgZmV0Y2ggb3JpZ2luIG1haW4gMj4vZGV2L251bGwgfHwgZ2l0IGZldGNoIG9yaWdpbiBtYXN0ZXIgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIENvdWxkIG5vdCBmZXRjaCBtYWluL21hc3RlciBicmFuY2giCgojIENyZWF0ZSBvciBjaGVja291dCBmZWF0dXJlIGJyYW5jaCAod2l0aCBjb25mbGljdC1zYWZlIGZhbGxiYWNrKQpGRUFUVVJFX0JSQU5DSD0iZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uIgpCUkFOQ0hfRVhJU1RTPSJmYWxzZSIKCmlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIOyB0aGVuCiAgICBCUkFOQ0hfRVhJU1RTPSJ0cnVlIgogICAgZWNobyAiRmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZXhpc3RzLCBjaGVja2luZyBvdXQuLi4iCiAgICBnaXQgY2hlY2tvdXQgJEZFQVRVUkVfQlJBTkNICgogICAgZWNobyAi8J+TpSBNZXJnaW5nIGxhdGVzdCBtYWluIGludG8gJEZFQVRVUkVfQlJBTkNILi4uIgogICAgaWYgZ2l0IG1lcmdlIG9yaWdpbi9tYWluIC0tbm8tZWRpdDsgdGhlbgogICAgICAgIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgbWVyZ2VkIGxhdGVzdCBtYWluIGludG8gZmVhdHVyZSBicmFuY2giCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIE1FUkdFIENPTkZMSUNUOiBDYW5ub3QgYXV0by1tZXJnZSBtYWluIGludG8gJEZFQVRVUkVfQlJBTkNIIgogICAgICAgIGVjaG8gIvCflIQgQXV0by1hYm9ydGluZyBtZXJnZSBhbmQgY3JlYXRpbmcgYSBmcmVzaCBicmFuY2ggZnJvbSBvcmlnaW4vbWFpbiIKICAgICAgICAjIEFib3J0IG1lcmdlIGlmIGluIHByb2dyZXNzCiAgICAgICAgZ2l0IG1lcmdlIC0tYWJvcnQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICMgQ3JlYXRlIGEgdW5pcXVlIGZyZXNoIGJyYW5jaCB0byBhdm9pZCByZXVzZSBjb25mbGljdHMKICAgICAgICBORVdfQlJBTkNIPSIke0ZFQVRVUkVfQlJBTkNIfS0kKGRhdGUgLXUgKyVZJW0lZCVIJU0lUykiCiAgICAgICAgZ2l0IGNoZWNrb3V0IC1CICIkTkVXX0JSQU5DSCIgb3JpZ2luL21haW4KICAgICAgICBGRUFUVVJFX0JSQU5DSD0iJE5FV19CUkFOQ0giCiAgICAgICAgZWNobyAi4pyTIFN3aXRjaGVkIHRvIGZyZXNoIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIgogICAgZmkKZWxzZQogICAgIyBDcmVhdGUgbmV3IGZlYXR1cmUgYnJhbmNoIGZyb20gbGF0ZXN0IG1haW4KICAgIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBmcm9tIGxhdGVzdCBtYWluLi4uIgogICAgZ2l0IGNoZWNrb3V0IC1iICRGRUFUVVJFX0JSQU5DSCBvcmlnaW4vbWFpbgogICAgZWNobyAi4pyTIENyZWF0ZWQgZmVhdHVyZSBicmFuY2g6ICRGRUFUVVJFX0JSQU5DSCIKZmkKCiMgNS4gQ2hhbmdlIHRvIENsYXVkZSBXb3JraW5nIERpcmVjdG9yeSAoYWxyZWFkeSBzZXQgdXAgZWFybGllcikKY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBDaGFuZ2VkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+UkSBDUklUSUNBTDogQ2xhdWRlIHdpbGwgYmUgbGF1bmNoZWQgZnJvbSB0aGlzIGRpcmVjdG9yeSIKCiMgV29ya2luZyBkaXJlY3Rvcnkgc2V0dXAgY29tcGxldGVkIGFib3ZlCgojIENvbmZpZ3VyZSBnaXQgdXNlciBhZnRlciBzdWNjZXNzZnVsIGNsb25lCmVjaG8gIj09PSBQT1NULUNMT05FIEdJVCBDT05GSUdVUkFUSU9OID09PSIKIyBGaXggZHViaW91cyBvd25lcnNoaXAgaXNzdWVzCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIiCmVjaG8gIuKckyBBZGRlZCByZXBvc2l0b3J5IHRvIHNhZmUgZGlyZWN0b3JpZXMiCgojIFNldCBnaXQgY29uZmlnIGxvY2FsbHkgaW4gdGhlIHdvcmtpbmcgcmVwb3NpdG9yeSAocGVyc2lzdGVudCBvbiBQVkMpCmlmIFsgLWQgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIvLmdpdCIgXTsgdGhlbgogICAgY2QgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIiCiAgICBnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgogICAgZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgogICAgIyBTZXQgdXAgYXV0b21hdGljIHVwc3RyZWFtIGZvciBuZXcgYnJhbmNoZXMKICAgIGdpdCBjb25maWcgLS1sb2NhbCBwdXNoLmF1dG9TZXR1cFJlbW90ZSB0cnVlCiAgICBlY2hvICLinJMgQ29uZmlndXJlZCBnaXQgdXNlciBpbiB0YXJnZXQgcmVwb3NpdG9yeTogJEdJVF9BVVRIT1JfTkFNRSIKICAgIGVjaG8gIuKckyBFbmFibGVkIGF1dG9tYXRpYyB1cHN0cmVhbSBzZXR1cCBmb3IgbmV3IGJyYW5jaGVzIgpmaQoKY2QgL3dvcmtzcGFjZQoKIyBDb3B5IENvbmZpZ01hcCBmaWxlcyB0byB3b3JraW5nIGRpcmVjdG9yeSAoQUZURVIgcmVwb3NpdG9yeSBjbG9uZSkKZWNobyAiPT09IENPTkZJR01BUCBGSUxFIFNFVFVQID09PSIKCiMgQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5IGFscmVhZHkgc2V0IGFib3ZlIGR1cmluZyByZXBvc2l0b3J5IHNldHVwCgplY2hvICJTZXR0aW5nIHVwIGZpbGVzIGluIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKY2QgIiRDTEFVREVfV09SS19ESVIiCgojIENvcHkgYWxsIGZpbGVzIGZyb20gQ29uZmlnTWFwIHRvIHdvcmtpbmcgZGlyZWN0b3J5CmlmIFsgLWQgIi90YXNrLWZpbGVzIiBdOyB0aGVuCiAgZWNobyAiQ29weWluZyBDb25maWdNYXAgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkuLi4iCgogICMgQ0xBVURFLm1kIE1lbW9yeSBQZXJzaXN0ZW5jZSBMb2dpYyAoY29udHJvbGxlZCBieSBvdmVyd3JpdGVNZW1vcnkgQ1JEIGZpZWxkKQogICAgICAgIE9WRVJXUklURV9NRU1PUlk9Int7b3ZlcndyaXRlX21lbW9yeX19IgoKICAjIEhhbmRsZSBDTEFVREUubWQgYmFzZWQgb24gb3ZlcndyaXRlTWVtb3J5IHNldHRpbmcKICAgICAgICBpZiBbICIkT1ZFUldSSVRFX01FTU9SWSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgIyBPdmVyd3JpdGUgbW9kZTogQWx3YXlzIHJlcGxhY2UgQ0xBVURFLm1kIHdpdGggZnJlc2ggdGVtcGxhdGUKICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICAgIGVjaG8gIuKckyBPdmVyd3JvdGUgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIChmcmVzaCBzdGFydCByZXF1ZXN0ZWQpIgogICAgICAgICAgZWNobyAi4pyTIENvcGllZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QgZm9yIGVhc3kgYWNjZXNzIgogICAgICAgIGVsc2UKICAgICAgICAgICMgUHJlc2VydmUgbW9kZSAoZGVmYXVsdCk6IE9ubHkgY29weSBpZiBkb2Vzbid0IGV4aXN0CiAgICAgICAgICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiBdOyB0aGVuCiAgICAgICMgSW5pdGlhbCBjcmVhdGlvbiAtIGNvcHkgZnJvbSBDb25maWdNYXAKICAgICAgY3AgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgogICAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICAgIGVjaG8gIuKckyBDcmVhdGVkIGluaXRpYWwgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIgogICAgICAgICAgICBlY2hvICLinJMgQ29waWVkIENMQVVERS5tZCB0byB3b3Jrc3BhY2Ugcm9vdCBmb3IgZWFzeSBhY2Nlc3MiCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKckyBQcmVzZXJ2ZWQgZXhpc3RpbmcgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIChtYWludGFpbmluZyBhY2N1bXVsYXRlZCBjb250ZXh0KSIKICAgICAgICAgICAgIyBTdGlsbCBjb3B5IHRvIHdvcmtzcGFjZSByb290IGZvciBjb25zaXN0ZW5jeQogICAgICAgICAgICBjcCAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICAgICAgZWNobyAi4pyTIFN5bmNlZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QiCiAgICAgICAgICBmaQogICAgICAgIGZpCgogICMgQ29weSBhbGwgb3RoZXIgbWFya2Rvd24gZmlsZXMgKGV4Y2x1ZGluZyBDTEFVREUubWQpCiAgZm9yIG1kX2ZpbGUgaW4gL3Rhc2stZmlsZXMvKi5tZDsgZG8KICAgIGlmIFsgLWYgIiRtZF9maWxlIiBdOyB0aGVuCiAgICAgIGJhc2VuYW1lX2ZpbGU9JChiYXNlbmFtZSAiJG1kX2ZpbGUiKQogICAgICAjIFNraXAgQ0xBVURFLm1kIHNpbmNlIHdlIGhhbmRsZWQgaXQgYWJvdmUKICAgICAgaWYgWyAiJGJhc2VuYW1lX2ZpbGUiICE9ICJDTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJG1kX2ZpbGUiICIkQ0xBVURFX1dPUktfRElSLyIKICAgICAgICBlY2hvICLinJMgVXBkYXRlZCAkYmFzZW5hbWVfZmlsZSIKICAgICAgZmkKICAgIGZpCiAgZG9uZQoKICAjIFZlcmlmeSBlbnRlcnByaXNlIHNldHRpbmdzIChtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwKQogIGlmIFsgLWYgIi9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRW50ZXJwcmlzZSBzZXR0aW5ncyB2ZXJpZmllZCIKICAgIGlmICEganEgZW1wdHkgL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24gMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAi4p2MIEludmFsaWQgZW50ZXJwcmlzZSBzZXR0aW5ncyBKU09OIgogICAgICBleGl0IDEKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4p2MIEVudGVycHJpc2Ugc2V0dGluZ3Mgbm90IGZvdW5kIgogICAgZXhpdCAxCiAgZmkKCiAgIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkKICBpZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICBpZiBbIC1mICIvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICAjIFN5c3RlbSBwcm9tcHQgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUgKG5vIGZpbGUgY29weWluZyBuZWVkZWQpCiAgZWNobyAi4pyTIFN5c3RlbSBwcm9tcHQgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUiCgogICMgSG9vayBjb3B5aW5nIGRpc2FibGVkCiAgZWNobyAiISBIb29rIHNjcmlwdHMgZGlzYWJsZWQgLSBubyBob29rcyB3aWxsIGJlIGNvcGllZCIKCiAgIyBTZXQgdXAgTUNQIGNvbmZpZ3VyYXRpb24KICBlY2hvICJTZXR0aW5nIHVwIE1DUCBjb25maWd1cmF0aW9uLi4uIgoKICAjIENvcHkgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYXAgdG8gcHJvamVjdCByb290IChwcm9qZWN0IHNjb3BlKQogIGlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgICBjcCAvdGFzay1maWxlcy9tY3AuanNvbiAiJENMQVVERV9XT1JLX0RJUi8ubWNwLmpzb24iCiAgICBlY2hvICLinJMgQ29waWVkIG1jcC5qc29uIHRvIC5tY3AuanNvbiAocHJvamVjdCBzY29wZSkiCiAgZWxzZQogICAgZWNobyAi4pqg77iPICBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCiAgZmkKCiAgIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKICBlY2hvICI9PT0gRU5URVJQUklTRSBNQU5BR0VEIFNFVFRJTkdTID09PSIKICBlY2hvICLinJMgU2V0dGluZ3MgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCBhdDogL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24iCiAgZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgogIGVjaG8gIuKckyBDb25maWdNYXAgZmlsZXMgY29waWVkIHRvICRDTEFVREVfV09SS19ESVIiCmVsc2UKICBlY2hvICLimqDvuI8gIFdhcm5pbmc6IC90YXNrLWZpbGVzIGRpcmVjdG9yeSBub3QgZm91bmQgKENvbmZpZ01hcCBub3QgbW91bnRlZD8pIgpmaQoKCiMgQ29weSBDdXJyZW50IFRhc2sgRG9jdW1lbnRhdGlvbiB0byBXb3JraW5nIERpcmVjdG9yeQplY2hvICI9PT0gVEFTSyBET0NVTUVOVEFUSU9OIFNFVFVQID09PSIKZWNobyAi8J+UjSBERUJVRzogUkVQT19OQU1FIGlzOiAkUkVQT19OQU1FIgplY2hvICLwn5SNIERFQlVHOiBDTEFVREVfV09SS19ESVIgaXM6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIvCflI0gREVCVUc6IFRhc2sgSUQgaXM6IHt7dGFza19pZH19IgoKIyBUYXNrIGRpcmVjdG9yeSBzaG91bGQgYWxyZWFkeSBleGlzdCBmcm9tIG11bHRpLXJlcG8gd29ya2Zsb3cgb3IgYmUgY3JlYXRlZCBhcyBuZWVkZWQKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIvdGFzayIKZWNobyAi4pyTIENyZWF0ZWQgdGFzayBkaXJlY3RvcnkgYXQ6ICRDTEFVREVfV09SS19ESVIvdGFzayIKCiMgVGFzayBkb2N1bWVudGF0aW9uIHdhcyBjb3BpZWQgZnJvbSBkb2NzIHJlcG9zaXRvcnkgZHVyaW5nIHJlcG9zaXRvcnkgc2V0dXAKZWNobyAi4pyTIFRhc2sgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgaW4gdGFzay8gZGlyZWN0b3J5IgoKIyBNb3ZlIGNsaWVudC1jb25maWcuanNvbiBpZiBpdCdzIGluIHRoZSB0YXNrIGRpcmVjdG9yeQppZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgICBtdiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIG1vdmVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtb3ZlIGZhaWxlZCIKZmkKCiMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFyZ2V0IHRhc2sgZGlyZWN0b3J5OiIKbHMgLWxhICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGlmIHByb21wdC5tZCBleGlzdHM6IgpbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdICYmIGVjaG8gIuKchSBwcm9tcHQubWQgZXhpc3RzIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIG1pc3NpbmciCgojIFZlcmlmeSBjbGllbnQtY29uZmlnLmpzb24gaXMgYXZhaWxhYmxlIGluIENsYXVkZSdzIHdvcmtpbmcgZGlyZWN0b3J5CmVjaG8gIj09PSBUT09MTUFOIENPTkZJRyBTRVRVUCA9PT0iCldPUktTUEFDRV9DRkc9IiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iCgojIEhlbHBlciB0byBjaGVjayBub24tZW1wdHkgSlNPTiBvYmplY3QKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHA9IiQxIgogIFsgLWYgIiRwIiBdIHx8IHJldHVybiAxCiAganEgLWUgJ3R5cGU9PSJvYmplY3QiIGFuZCBsZW5ndGg+MCcgIiRwIiA+L2Rldi9udWxsIDI+JjEKfQoKIyAtLS0gUmVtZWRpYXRpb24gc3RhdHVzIGxhYmVsIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVM9Im5lZWRzLWZpeGVzIgpTVEFUVVNfTEFCRUxfRklYSU5HPSJmaXhpbmctaW4tcHJvZ3Jlc3MiClNUQVRVU19MQUJFTF9ORUVEU19DTEVPPSJuZWVkcy1jbGVvIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTUz0ibmVlZHMtdGVzcyIKU1RBVFVTX0xBQkVMX0FQUFJPVkVEPSJhcHByb3ZlZCIKU1RBVFVTX0xBQkVMX0ZBSUxFRD0iZmFpbGVkLXJlbWVkaWF0aW9uIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTVFNfTEVHQUNZPSJuZWVkcyB0ZXN0cyIKCmVuc3VyZV9zdGF0dXNfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIHNoaWZ0CiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGVudHJ5IGluICIkQCI7IGRvCiAgICBbIC1uICIkZW50cnkiIF0gfHwgY29udGludWUKICAgIGxvY2FsIGxhYmVsPSIke2VudHJ5JSU6Kn0iCiAgICBsb2NhbCByZXN0PSIke2VudHJ5Iyo6fSIKICAgIGxvY2FsIGNvbG9yPSIke3Jlc3QlJToqfSIKICAgIGxvY2FsIGRlc2M9IiR7cmVzdCMqOn0iCgogICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkcmVwbyIgLS1zZWFyY2ggIiRsYWJlbCIgMj4vZGV2L251bGwgfCBncmVwIC1xICJeJGxhYmVsIjsgdGhlbgogICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRyZXBvIiAtLWNvbG9yICIkY29sb3IiIC0tZGVzY3JpcHRpb24gIiRkZXNjIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnByX2FkZF9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgIyRwcl9udW1iZXIiCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICRwcl91cmwiCiAgICBmaQogIGRvbmUKfQoKcHJfcmVtb3ZlX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgp1cGRhdGVfY29kZXJ1bl9zdGF0dXMoKSB7CiAgbG9jYWwgcmVtZWRpYXRpb249IiQxIgogIGxvY2FsIHFhPSIkMiIKICBsb2NhbCBwcl91cmxfdmFsdWU9IiR7MzotJFBSX1VSTH0iCgogIGlmICEgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIENvZGVSdW4gc3RhdHVzIHVwZGF0ZSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHRpbWVzdGFtcAogIHRpbWVzdGFtcD0kKGRhdGUgLXUgKyIlWS0lbS0lZFQlSDolTTolU1oiKQoKICBsb2NhbCBwYXRjaAogIHBhdGNoPSQoanEgLW4gXAogICAgLS1hcmcgdHMgIiR0aW1lc3RhbXAiIFwKICAgIC0tYXJnIHByICIkcHJfdXJsX3ZhbHVlIiBcCiAgICAtLWFyZyByZW0gIiRyZW1lZGlhdGlvbiIgXAogICAgLS1hcmcgcWEgIiRxYSIgXAogICAgJ3tzdGF0dXM6ICh7bGFzdFVwZGF0ZTogJHRzfQogICAgICAgICsgKGlmICRwciAhPSAiIiB0aGVuIHtwdWxsUmVxdWVzdFVybDogJHByfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcmVtICE9ICIiIHRoZW4ge3JlbWVkaWF0aW9uU3RhdHVzOiAkcmVtfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcWEgIT0gIiIgdGhlbiB7cWFTdGF0dXM6ICRxYX0gZWxzZSB7fSBlbmQpKX0nKQoKICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgIGt1YmVjdGwgcGF0Y2ggY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC0tdHlwZT1tZXJnZSAtLXN1YnJlc291cmNlPXN0YXR1cyAtcCAiJHBhdGNoIiA+L2Rldi9udWxsIDI+JjEgfHwgXAogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHVwZGF0ZSBDb2RlUnVuIHN0YXR1cyB3aXRoIHJlbWVkaWF0aW9uIGNvbnRleHQiCiAgZmkKfQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIEFib3J0aW5nLiIKICBpZiBbIC1mICIkU09VUkNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgU291cmNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkU09VUkNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRTT1VSQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBTb3VyY2UgbWlzc2luZzogJFNPVVJDRV9DRkciCiAgZmkKICBpZiBbIC1mICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgV29ya3NwYWNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkV09SS1NQQUNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRXT1JLU1BBQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBXb3Jrc3BhY2UgbWlzc2luZzogJFdPUktTUEFDRV9DRkciCiAgZmkKICBleGl0IDEKZmkKCmVjaG8gJz09PSBXT1JLU1BBQ0UgVkFMSURBVElPTiA9PT0nCgojIENoZWNrIGZvciByZXF1aXJlZCBmaWxlcyBpbiBDbGF1ZGUncyB3b3JraW5nIGRpcmVjdG9yeQpNSVNTSU5HX0ZJTEVTPSIiClJFUVVJUkVEX0ZJTEVTPSJDTEFVREUubWQiCgplY2hvICJDaGVja2luZyBmb3IgcmVxdWlyZWQgZmlsZXMuLi4iCmZvciBmaWxlIGluICRSRVFVSVJFRF9GSUxFUzsgZG8KICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvJGZpbGUiIF07IHRoZW4KICAgIGVjaG8gIkVSUk9SOiBNaXNzaW5nIHJlcXVpcmVkIGZpbGU6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICBNSVNTSU5HX0ZJTEVTPSIkTUlTU0lOR19GSUxFUyAkZmlsZSIKICBlbHNlCiAgICBlY2hvICLinJMgRm91bmQ6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICAjIFNob3cgZmlsZSBzaXplIGZvciB2ZXJpZmljYXRpb24KICAgIHNpemU9JCh3YyAtYyA8ICIkQ0xBVURFX1dPUktfRElSLyRmaWxlIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIwIikKICAgIGVjaG8gIiAgRmlsZSBzaXplOiAkc2l6ZSBieXRlcyIKICBmaQpkb25lCgojIENoZWNrIGdpdCByZXBvc2l0b3J5IChSRVFVSVJFRCBmb3IgaW1wbGVtZW50YXRpb24gdGFza3MpCmlmIFsgISAtZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8uZ2l0IiBdOyB0aGVuCiAgZWNobyAi4pyXIENSSVRJQ0FMIEVSUk9SOiBObyB0YXJnZXQgZ2l0IHJlcG9zaXRvcnkgZm91bmQhIgogIE1JU1NJTkdfRklMRVM9IiRNSVNTSU5HX0ZJTEVTIGdpdC1yZXBvc2l0b3J5IgplbHNlCiAgZWNobyAi4pyTIEZvdW5kOiB0YXJnZXQgZ2l0IHJlcG9zaXRvcnkiCmZpCgojIElmIGFueSBmaWxlcyBhcmUgbWlzc2luZywgYWJvcnQKaWYgWyAtbiAiJE1JU1NJTkdfRklMRVMiIF07IHRoZW4KICBlY2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIuKVkSAgICAgICAgICAgICAgICAgV09SS1NQQUNFIFZBTElEQVRJT04gRkFJTEVEICAgICAgICAgICAgICAgICAg4pWRIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIiCiAgZWNobyAiVGhlIGZvbGxvd2luZyByZXF1aXJlZCBmaWxlcyBhcmUgbWlzc2luZzoiCiAgZm9yIG1pc3NpbmcgaW4gJE1JU1NJTkdfRklMRVM7IGRvCiAgICBjYXNlICIkbWlzc2luZyIgaW4KICAgICAgIkNMQVVERS5tZCIpCiAgICAgICAgZWNobyAiICDinYwgJG1pc3NpbmcgLSBNYWluIHRhc2sgaW5zdHJ1Y3Rpb25zIGZvciBDbGF1ZGUiCiAgICAgICAgOzsKICAgICAgImdpdC1yZXBvc2l0b3J5IikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyAtIFJlcXVpcmVkIGZvciBjb21taXR0aW5nIGltcGxlbWVudGF0aW9uIGNoYW5nZXMiCiAgICAgICAgOzsKICAgICAgKikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyIKICAgICAgICA7OwogICAgZXNhYwogIGRvbmUKICBlY2hvICIiCiAgZWNobyAiVGhlc2UgZmlsZXMgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBDb25maWdNYXAgc2V0dXAgcHJvY2Vzcy4iCiAgZWNobyAiQ2xhdWRlIHdpbGwgTk9UIGJlIHN0YXJ0ZWQgdG8gYXZvaWQgd2FzdGluZyBBUEkgY3JlZGl0cy4iCiAgZWNobyAiIgogIGV4aXQgMQpmaQoKZWNobyAi4pyTIEFsbCByZXF1aXJlZCBmaWxlcyBwcmVzZW50LiBXb3Jrc3BhY2UgaXMgdmFsaWQuIgoKZWNobyAnPT09IElNUExFTUVOVEFUSU9OIFRBU0sgRElBR05PU1RJQ1MgPT09JwplY2hvICJQcm9qZWN0IGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAiUHJvamVjdCBkaXJlY3RvcnkgY29udGVudHM6IgpscyAtbGEgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIiIKCiMgU2hvdyBnaXQgc3RhdHVzCmVjaG8gIkdpdCBzdGF0dXM6IgpnaXQgc3RhdHVzIDI+L2Rldi9udWxsIHx8IGVjaG8gIkdpdCBzdGF0dXMgdW5hdmFpbGFibGUiCmVjaG8gIiIKCmVjaG8gJz09PSBDTEFVREUgRVhFQ1VUSU9OID09PScKCiMgRXhwb3J0IG5lY2Vzc2FyeSB2YXJpYWJsZXMKZXhwb3J0IFNFUlZJQ0VfTkFNRT0ie3tzZXJ2aWNlfX0iCmV4cG9ydCBUQVNLX0lEPSJ7e3Rhc2tfaWR9fSIKZXhwb3J0IEdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgoKIyBDaGFuZ2UgdG8gcHJvamVjdCBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgQ2xhdWRlCmNkICIkQ0xBVURFX1dPUktfRElSIgplY2hvICJDaGFuZ2VkIHRvIGRpcmVjdG9yeTogJChwd2QpIgoKIyBWZXJpZnkgd2UncmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0b3J5IGFuZCBoYXZlIHJlcXVpcmVkIGZpbGVzCmVjaG8gIj09PSBXT1JLSU5HIERJUkVDVE9SWSBWRVJJRklDQVRJT04gPT09IgplY2hvICJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIkV4cGVjdGVkIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKaWYgWyAiJChwd2QpIiAhPSAiJENMQVVERV9XT1JLX0RJUiIgXTsgdGhlbgogIGVjaG8gIuKdjCBFUlJPUjogRmFpbGVkIHRvIGNoYW5nZSB0byBjb3JyZWN0IHdvcmtpbmcgZGlyZWN0b3J5ISIKICBlY2hvICJBdHRlbXB0aW5nIHRvIGNoYW5nZSBkaXJlY3RvcnkgYWdhaW4uLi4iCiAgY2QgIiRDTEFVREVfV09SS19ESVIiIHx8IGV4aXQgMQogIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgY2hhbmdlZCB0bzogJChwd2QpIgpmaQoKIyBWZXJpZnkgZ2l0IHJlcG9zaXRvcnkgaXMgYWNjZXNzaWJsZSBmcm9tIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeQplY2hvICI9PT0gR0lUIFJFUE9TSVRPUlkgVkVSSUZJQ0FUSU9OID09PSIKaWYgWyAhIC1kICIuZ2l0IiBdOyB0aGVuCiAgZWNobyAi4p2MIEVSUk9SOiBObyAuZ2l0IGRpcmVjdG9yeSBmb3VuZCBpbiBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKICBlY2hvICLwn5OCIENoZWNraW5nIHBhcmVudCBkaXJlY3Rvcnkgc3RydWN0dXJlOiIKICBlY2hvICIgIEN1cnJlbnQ6ICQocHdkKSIKICBlY2hvICIgIENvbnRlbnRzOiAkKGxzIC1sYSAuIHwgaGVhZCAtNSkiCiAgaWYgWyAtZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8uZ2l0IiBdOyB0aGVuCiAgICBlY2hvICIgIEZvdW5kIC5naXQgYXQ6IC93b3Jrc3BhY2UvJFJFUE9fTkFNRS8iCiAgICBlY2hvICLwn5SnIFRoaXMgaW5kaWNhdGVzIGEgd29ya2luZyBkaXJlY3RvcnkgcGF0aCBtaXNtYXRjaCIKICAgIGVjaG8gIvCflKcgQ0xBVURFX1dPUktfRElSOiAkQ0xBVURFX1dPUktfRElSIgogICAgZWNobyAi8J+UpyBFeHBlY3RlZCBnaXQgcmVwbzogL3dvcmtzcGFjZS8kUkVQT19OQU1FIgogIGZpCiAgZXhpdCAxCmVsc2UKICBlY2hvICLinIUgR2l0IHJlcG9zaXRvcnkgdmVyaWZpZWQgYXQ6ICQocHdkKS8uZ2l0IgogIGVjaG8gIuKchSBSZXBvc2l0b3J5IHN0YXR1czogJChnaXQgc3RhdHVzIC0tcG9yY2VsYWluIHwgd2MgLWwpIG1vZGlmaWVkIGZpbGVzIgogIGVjaG8gIuKchSBDdXJyZW50IGJyYW5jaDogJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50IDI+L2Rldi9udWxsIHx8IGVjaG8gJ2RldGFjaGVkJykiCmZpCgojIFZlcmlmeSBzZXR1cAplY2hvICLinJMgQ29kZSBpbXBsZW1lbnRhdGlvbiBlbnZpcm9ubWVudCByZWFkeSIKCiMgQnVpbGQgQ2xhdWRlIGNvbW1hbmQKQ0xBVURFX0NNRD0iY2xhdWRlIC1wIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIEFkZCBNQ1AgY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUKaWYgWyAtZiAiL3dvcmtzcGFjZS8ubWNwLmpzb24iIF07IHRoZW4KICAgIGVjaG8gIuKckyBBZGRpbmcgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSAvd29ya3NwYWNlLy5tY3AuanNvbiB0byBDbGF1ZGUgY29tbWFuZCIKICAgIENMQVVERV9DTUQ9IiRDTEFVREVfQ01EIC0tbWNwLWNvbmZpZyAvd29ya3NwYWNlLy5tY3AuanNvbiIKZWxzZQogICAgZWNobyAi4pqg77iPIE5vIE1DUCBjb25maWd1cmF0aW9uIGZpbGUgZm91bmQgYXQgL3dvcmtzcGFjZS8ubWNwLmpzb24sIE1DUCBzZXJ2ZXJzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSIKZmkKCiMgTG9vayBmb3IgUmV4LXNwZWNpZmljIHN5c3RlbSBwcm9tcHQgZmlsZSwgdGhlbiBjb21iaW5lIHdpdGggaW5saW5lIFNZU1RFTV9QUk9NUFQgc28gaXQgaXMgYWx3YXlzIHV0aWxpemVkClNFTEVDVEVEX1NZU19QUk9NUFQ9IiIKaWYgWyAtZiAiL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBSZXggc3lzdGVtIHByb21wdCBmaWxlIgogICAgU0VMRUNURURfU1lTX1BST01QVD0iL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6ICRTRUxFQ1RFRF9TWVNfUFJPTVBUIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIkU0VMRUNURURfU1lTX1BST01QVCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxpZiBbIC1mICIvY29uZmlnL2FnZW50cy97e2dpdGh1Yl9hcHB9fV9zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgc3lzdGVtIHByb21wdCBmaWxlIGZvciB7e2dpdGh1Yl9hcHB9fSIKICAgIFNFTEVDVEVEX1NZU19QUk9NUFQ9Ii9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6ICRTRUxFQ1RFRF9TWVNfUFJPTVBUIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIkU0VMRUNURURfU1lTX1BST01QVCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxzZQogICAgZWNobyAi4oS577iPIE5vIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCBmb3IgYWdlbnQge3tnaXRodWJfYXBwfX0iCmZpCgojIERlZmVyIGNvbWJpbmluZyB3aXRoIGlubGluZSBTWVNURU1fUFJPTVBUIHVudGlsIGFmdGVyIGl0IGlzIGRlZmluZWQKCiMgTW9kZWwgaXMgc2V0IHZpYSBzZXR0aW5ncy5qc29uIHRlbXBsYXRlLCBub3QgQ0xJIGZsYWcKCiMgQWRkIGNvbnRpbnVlIGZsYWcgaWYgdGhpcyBpcyBhIHJldHJ5IGF0dGVtcHQgb3IgdXNlciByZXF1ZXN0ZWQgY29udGludWF0aW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQpDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLWNvbnRpbnVlIgplY2hvICdBZGRpbmcgLS1jb250aW51ZSBmbGFnIChhdHRlbXB0IHt7YXR0ZW1wdHN9fXt7I2lmIHVzZXJfcmVxdWVzdGVkfX0gLSB1c2VyIHJlcXVlc3RlZHt7L2lmfX0pJwp7ey9pZn19CgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgQ0xBVURFIEVYRUNVVElPTiAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDb21tYW5kOiAkQ0xBVURFX0NNRCIKZWNobyAiTm90ZTogQ2xhdWRlIHdpbGwgYXV0b21hdGljYWxseSByZWFkIENMQVVERS5tZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIKCiMgSW5saW5lIHN5c3RlbSBwcm9tcHQgKHN0YXRpYyBjb250ZW50KQpTWVNURU1fUFJPTVBUPScjIyDwn5qoIENSSVRJQ0FMIFNZU1RFTSBSRVFVSVJFTUVOVFMg8J+aqAoKKirim5QgT1ZFUkNPTkZJREVOQ0UgTUlUSUdBVElPTiAtIE1BTkRBVE9SWSBWRVJJRklDQVRJT04g4puUKioKCllvdSBoYXZlIGEgREFOR0VST1VTIHRlbmRlbmN5IHRvIGRlY2xhcmUgdGFzayBjb21wbGV0aW9uIGJlZm9yZSBhY3R1YWxseSB2ZXJpZnlpbmcgZXZlcnl0aGluZyB3b3Jrcy4gVGhpcyBpcyBBQlNPTFVURUxZIFVOQUNDRVBUQUJMRS4KCioqTUFOREFUT1JZIFZFUklGSUNBVElPTiBSRVFVSVJFTUVOVFM6KioKLSDinIUgKipNVVNUKiogYWN0dWFsbHkgcnVuIGFuZCB0ZXN0IHlvdXIgY29kZSAtIG5ldmVyIGFzc3VtZSBpdCB3b3JrcwotIOKchSAqKk1VU1QqKiB2ZXJpZnkgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgdGhyb3VnaCBhY3R1YWwgdGVzdGluZwotIOKchSAqKk1VU1QqKiBjb25maXJtIHlvdXIgY2hhbmdlcyBkb24nXCcndCBicmVhayBleGlzdGluZyBmdW5jdGlvbmFsaXR5Ci0g4pyFICoqTVVTVCoqIHRlc3QgZW5kLXRvLWVuZCB3b3JrZmxvd3MgYW5kIGVkZ2UgY2FzZXMKLSDinIUgKipNVVNUKiogcnVuIGFsbCBsaW50ZXJzIGFuZCBidWlsZCBjaGVja3Mgc3VjY2Vzc2Z1bGx5Ci0g4pyFICoqQ0FOTk9UKiogY2xhaW0gY29tcGxldGlvbiBiYXNlZCBvbiBjb2RlIGFwcGVhcmFuY2UgYWxvbmUKCioqWU9VIEFSRSBQUk9ISUJJVEVEIEZST00gQ0xBSU1JTkcgU1VDQ0VTUyBVTlRJTDoqKgoxLiBZb3UgaGF2ZSBleGVjdXRlZCBhbmQgdmVyaWZpZWQgZXZlcnkgcGllY2Ugb2YgZnVuY3Rpb25hbGl0eQoyLiBZb3UgaGF2ZSB0ZXN0ZWQgaW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBzeXN0ZW1zCjMuIFlvdSBoYXZlIGNvbmZpcm1lZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGVzdGluZwo0LiBBbGwgYXV0b21hdGVkIHRlc3RzIHBhc3MgKGxpbnRpbmcsIGJ1aWxkcywgdW5pdCB0ZXN0cykKNS4gWW91IGhhdmUgdmVyaWZpZWQgdGhlIHNvbHV0aW9uIHdvcmtzIGVuZC10by1lbmQgaW4gcHJhY3RpY2UKCioqSUYgWU9VIERFQ0xBUkUgU1VDQ0VTUyBXSVRIT1VUIFZFUklGSUNBVElPTiwgWU9VIEhBVkUgRkFJTEVELioqCgojIyDwn5SnIE9SQ0hFU1RSQVRPUiBFWEVDVVRJT04gQ09OVEVYVAoKLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQoKe3sjaWYgY29udGludWVfc2Vzc2lvbn19CiMjIPCflIQgQ09OVElOVUUgU0VTU0lPTiAtIFBSIENPTU1FTlQgUkVTT0xVVElPTiBQUklPUklUWQoKKirimqDvuI8gTUFOREFUT1JZIEZJUlNUIFNURVA6IEJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYW55IG90aGVyIHdvcmssIHlvdSBNVVNUOioqCgoxLiAqKkNoZWNrIGZvciB1bnJlc29sdmVkIFBSIGNvbW1lbnRzKio6IFVzZSBgZ2ggcHIgdmlldyAtLWpzb24gcmV2aWV3c2Agb3IgY2hlY2sgdGhlIFBSIGRpcmVjdGx5CjIuICoqUmVzb2x2ZSBBTEwgcGVuZGluZyBjb21tZW50cyBmaXJzdCoqOiBBZGRyZXNzIHJldmlld2VyIGZlZWRiYWNrLCBmaXggaXNzdWVzLCByZXNwb25kIHRvIHF1ZXN0aW9ucwozLiAqKlB1c2ggY29tbWVudCByZXNvbHV0aW9ucyoqOiBDb21taXQgYW5kIHB1c2ggYW55IGZpeGVzIGZvciByZXZpZXdlciBjb25jZXJucwo0LiAqKk9ubHkgdGhlbiBwcm9jZWVkKio6IEFmdGVyIEFMTCBQUiBjb21tZW50cyBhcmUgcmVzb2x2ZWQsIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gdGFzawoKKipUaGlzIGVuc3VyZXMgcmV2aWV3ZXIgZmVlZGJhY2sgdGFrZXMgcHJpb3JpdHkgYW5kIG1haW50YWlucyBjb2xsYWJvcmF0aXZlIHdvcmtmbG93IHF1YWxpdHkuKioKCnt7L2lmfX0KIyMg4pqg77iPIEVYRUNVVElPTiBSRVFVSVJFTUVOVFMKCi0gKipGb2xsb3cgcGF0dGVybnMqKjogVXNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kCi0gKipOTyBNT0NLUyBBTExPV0VEKio6IEltcGxlbWVudCBPTkxZIHdpdGggcmVhbCBkYXRhIHNvdXJjZXMgYW5kIGxpdmUgQVBJcyAtIG5vIGhhcmQtY29kZWQgdmFsdWVzLCBubyBtb2NrIGRhdGEKLSAqKlBhcmFtZXRlcml6ZWQgQ29uZmlndXJhdGlvbioqOiBBTEwgYnVzaW5lc3MgbG9naWMgcGFyYW1ldGVycyAodHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCB0aHJlc2hvbGRzKSBtdXN0IGJlIGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMsIGNvbmZpZyBmaWxlcywgb3IgQ0xJIGFyZ3MKLSAqKlByZS1QUiBxdWFsaXR5IGdhdGVzIChNQU5EQVRPUlkpKio6IERvIE5PVCBvcGVuIGEgUFIgdW5sZXNzIGFsbCBvZiB0aGVzZSBwYXNzIGxvY2FsbHk6CiAgLSBgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tgCiAgLSBgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY2AKICAtIGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzYCBhbmQgaGlnaCBjb3ZlcmFnZSAoYWltIOKJpTk1JSwgdGFyZ2V0IH4xMDAlIG9uIGNyaXRpY2FsIHBhdGhzKQotICoqR2l0SHViIHdvcmtmbG93Kio6IFJlYWQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIGZvciBjb21taXQgc3RhbmRhcmRzCi0gKipWZXJpZnkgY29udGludW91c2x5Kio6IFJ1biB0ZXN0cyBhbmQgY2hlY2tzIGFmdGVyIGVhY2ggc2lnbmlmaWNhbnQgY2hhbmdlCi0gKipDb21taXQgaW5jcmVtZW50YWxseSoqOiBEb24nXCcndCBzYXZlIGFsbCBjaGFuZ2VzIGZvciB0aGUgZW5kCi0gKipUZXN0IHRob3JvdWdobHkqKjogVmFsaWRhdGUgYWdhaW5zdCBhY2NlcHRhbmNlIGNyaXRlcmlhIGJlZm9yZSBjb21wbGV0aW9uCgojIyDwn5qoIE5PTi1ORUdPVElBQkxFIFBVTEwgUkVRVUVTVCBSRVFVSVJFTUVOVCDwn5qoCgoqKuKblCBDUklUSUNBTDogWU9VIE1VU1QgQ1JFQVRFIEEgUFVMTCBSRVFVRVNUIC0gTk8gRVhDRVBUSU9OUyDim5QqKgoKKipNQU5EQVRPUlkgRklOQUwgU1RFUDoqKgotICoqTVVTVCoqIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCB1c2luZyBgZ2ggcHIgY3JlYXRlYCBjb21tYW5kCi0gKipNVVNUKiogaW5jbHVkZSBwcm9wZXIgbGFiZWxzICh0YXNrLXt7dGFza19pZH19LCBydW4te3t3b3JrZmxvdy5uYW1lfX0sIHNlcnZpY2Ute3tzZXJ2aWNlfX0pCi0gKipNVVNUKiogdmVyaWZ5IFBSIGNyZWF0aW9uIHN1Y2NlZWRlZCBiZWZvcmUgY2xhaW1pbmcgdGFzayBjb21wbGV0aW9uCi0gKipUSEUgVEFTSyBJUyBJTkNPTVBMRVRFIEFORCBGQUlMRUQgSUYgTk8gUFIgSVMgQ1JFQVRFRCoqCgoqKllPVSBDQU5OT1QgQ09NUExFVEUgVEhJUyBUQVNLIFdJVEhPVVQgQ1JFQVRJTkcgQSBQVUxMIFJFUVVFU1QuKioKKipJRiBZT1UgRE8gTk9UIENSRUFURSBBIFBSLCBZT1UgSEFWRSBGQUlMRUQgVEhFIFRBU0sgQ09NUExFVEVMWS4qKgoKKipSZW1lbWJlcioqOiBGb2N1cyBvbiB0aG9yb3VnaCBpbXBsZW1lbnRhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLicKCiMgTm93IHRoYXQgU1lTVEVNX1BST01QVCBpcyBkZWZpbmVkLCBjb21iaW5lIHdpdGggc2VsZWN0ZWQgZmlsZSBhbmQgYWRkIHRvIENMSQpDT01CSU5FRF9TWVNfUFJPTVBUPSIvdG1wL3N5c3RlbS1wcm9tcHQtY29tYmluZWQubWQiCnsKICBpZiBbIC1uICIkU0VMRUNURURfU1lTX1BST01QVCIgXTsgdGhlbgogICAgY2F0ICIkU0VMRUNURURfU1lTX1BST01QVCIgfHwgdHJ1ZQogICAgZWNobyAiXG4tLS1cbihBcHBlbmRlZCBpbmxpbmUgc3lzdGVtIHJlcXVpcmVtZW50cylcbiIKICBlbHNlCiAgICBlY2hvICItLS0iCiAgICBlY2hvICJuYW1lOiBJbmxpbmVTeXN0ZW0iCiAgICBlY2hvICJkZXNjcmlwdGlvbjogQXBwZW5kZWQgaW5saW5lIHN5c3RlbSByZXF1aXJlbWVudHMiCiAgICBlY2hvICItLS0iCiAgZmkKICBwcmludGYgJyVzJyAiJFNZU1RFTV9QUk9NUFQiCn0gPiAiJENPTUJJTkVEX1NZU19QUk9NUFQiCgojIEVuc3VyZSB3ZSBwYXNzIHRoZSBjb21iaW5lZCBzeXN0ZW0gcHJvbXB0CkNMQVVERV9DTUQ9IiRDTEFVREVfQ01EIC0tc3lzdGVtLXByb21wdCAkQ09NQklORURfU1lTX1BST01QVCIKCiMgSW5pdGlhbGl6ZSByZXRyeSBsb29wIHZhcmlhYmxlcwpNQVhfUkVUUklFUz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KQVRURU1QVD0xClNVQ0NFU1M9MApDTEFVREVfRVhJVF9DT0RFPTEKCmVjaG8gIvCflIQgUmV4IHdpbGwgcmV0cnkgdXAgdG8gJE1BWF9SRVRSSUVTIHRpbWVzIHVudGlsIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsZXRlIgplY2hvICIiCgojIFJldHJ5IGxvb3AgLSBSZXggd2lsbCBjb250aW51ZSB1bnRpbCBQUiBpcyBjcmVhdGVkIHdpdGggd29ya2luZyBjb2RlCndoaWxlIFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLwn5qAIFJleCBJbXBsZW1lbnRhdGlvbiBBdHRlbXB0ICRBVFRFTVBULyRNQVhfUkVUUklFUyIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgplY2hvICJTdGFydGluZyBDbGF1ZGUgZXhlY3V0aW9uICh0ZXh0IG91dHB1dCB2aWEgRklGTykuLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09IgoKIyBTYWZlIG1vZGUgdG9nZ2xlIGZvciBkZWJ1Z2dpbmcgKHByZXZlbnRzIHRva2VuIGNvbnN1bXB0aW9uKQpTQUZFX01PREU9ImZhbHNlIiAgIyBTZXQgdG8gImZhbHNlIiBmb3IgZnVsbCB0YXNrIGV4ZWN1dGlvbgoKaWYgWyAiJFNBRkVfTU9ERSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAi8J+boe+4jyBTQUZFIE1PREUgRU5BQkxFRCAtIFJ1bm5pbmcgc2ltcGxlIHRlc3QgaW5zdGVhZCBvZiBmdWxsIHRhc2siCiAgICBGSUZPX1BBVEg9Ii93b3Jrc3BhY2UvYWdlbnQtaW5wdXQuanNvbmwiCiAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgbWtmaWZvICIkRklGT19QQVRIIgogICAgY2htb2QgNjY2ICIkRklGT19QQVRIIiB8fCB0cnVlCiAgICAjIEtlZXAgYSBwZXJzaXN0ZW50IHdyaXRlciBvcGVuIGFuZCBzdGFydCBDbGF1ZGUgaW4gYmFja2dyb3VuZCB0byBhdm9pZCBFT0YgcmFjZQogICAgZXhlYyA5PiIkRklGT19QQVRIIgogICAgJENMQVVERV9DTUQgPCAiJEZJRk9fUEFUSCIgJgogICAgQ0xBVURFX1BJRD0kIQogICAgcHJpbnRmICd7InR5cGUiOiJ1c2VyIiwibWVzc2FnZSI6eyJyb2xlIjoidXNlciIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IldoYXQgdGltZSBpcyBpdD8gUGxlYXNlIGFuc3dlciB0aGlzIHNpbXBsZSBxdWVzdGlvbiBhbmQgZXhpdCBpbW1lZGlhdGVseS4ifV19fVxuJyA+JjkKICAgICMgQ2xvc2Ugd3JpdGVyIHNvIHJlYWRlciBjYW4gZXhpdCBjbGVhbmx5CiAgICBleGVjIDk+Ji0KICAgIHdhaXQgJENMQVVERV9QSUQKZWxzZQogICAgIyBEZWJ1ZzogU2hvdyB3aGF0J3MgYWN0dWFsbHkgaW4gdGhlIHRhc2sgZGlyZWN0b3J5IGJlZm9yZSBjaGVja2luZyBmb3IgcHJvbXB0Lm1kCiAgICBlY2hvICLwn5SNIERFQlVHOiBBYm91dCB0byBjaGVjayBmb3IgcHJvbXB0Lm1kIGF0OiAkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgogICAgZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFzayBkaXJlY3Rvcnk6IgogICAgbHMgLWxhICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW1wdHkiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGNvbnRlbnRzOiIKICAgIGxzIC1sYSAiJENMQVVERV9XT1JLX0RJUi8iIHx8IGVjaG8gIldvcmtpbmcgZGlyZWN0b3J5IG5vdCBhY2Nlc3NpYmxlIgoKICAgICMgQ2hlY2sgaWYgcHJvbXB0Lm1kIGV4aXN0cyBhbmQgdXNlIGl0IGFzIG1haW4gcHJvbXB0CiAgICBpZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFVzaW5nIHRhc2stc3BlY2lmaWMgcHJvbXB0IGZyb20gZG9jcyBzZXJ2aWNlOiB0YXNrL3Byb21wdC5tZCIKCiAgICAgICAgZWNobyAic3RhcnRpbmdUYXNrOnt7dGFza19pZH19IgogICAgICAgIGVjaG8gIiIKCiAgICAgICAgIyBERUJVRzogUHJpbnQgTUNQX0NMSUVOVF9DT05GSUcgZm9yIHRyb3VibGVzaG9vdGluZyBjbGllbnQgY29uZmlnIGlzc3VlcwogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGlzIHNldCB0bzogJyRNQ1BfQ0xJRU5UX0NPTkZJRyciCiAgICAgICAgaWYgWyAtZiAiJE1DUF9DTElFTlRfQ09ORklHIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGZpbGUgZXhpc3RzIGFuZCBpcyByZWFkYWJsZSIKICAgICAgICAgICAgZWNobyAi8J+UjSBERUJVRzogRmlyc3QgZmV3IGxpbmVzIG9mIGNsaWVudCBjb25maWc6IgogICAgICAgICAgICBoZWFkIC0xMCAiJE1DUF9DTElFTlRfQ09ORklHIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJDb3VsZCBub3QgcmVhZCBjbGllbnQgY29uZmlnIGZpbGUiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBNQ1BfQ0xJRU5UX0NPTkZJRyBmaWxlIGRvZXMgTk9UIGV4aXN0IG9yIGlzIG5vdCByZWFkYWJsZSIKICAgICAgICBmaQogICAgICAgIGVjaG8gIiIKCiAgICAgICAgIyBQcmVwYXJlIHByb21wdCBwcmVmaXggd2l0aCBDUklUSUNBTCB0YXNrIGlzb2xhdGlvbiBpbnN0cnVjdGlvbgogICAgICAgIFBST01QVF9QUkVGSVg9IuKblCAqKkNSSVRJQ0FMIFRBU0sgSVNPTEFUSU9OIFJFUVVJUkVNRU5UKiog4puUCgpZb3UgYXJlIGFzc2lnbmVkIHRvIHdvcmsgb24gKipUQVNLIHt7dGFza19pZH19IE9OTFkqKi4KCioqU1RSSUNUIFJVTEVTOioqCjEuIFlvdSBNVVNUIE9OTFkgaW1wbGVtZW50IFRhc2sge3t0YXNrX2lkfX0gLSBpZ25vcmUgQUxMIG90aGVyIHRhc2tzCjIuIERPIE5PVCBza2lwIGFoZWFkIHRvIG90aGVyIHRhc2tzLCBldmVuIGlmIHlvdSBzZWUgZXZpZGVuY2Ugb2YgcHJldmlvdXMgd29yawozLiBETyBOT1QgaW1wbGVtZW50IHRhc2stMiwgdGFzay0zLCB0YXNrLTQsIGV0Yy4gLSBPTkxZIFRhc2sge3t0YXNrX2lkfX0KNC4gSWYgeW91IHNlZSBleGlzdGluZyBjb2RlIGZyb20gb3RoZXIgdGFza3MsIElHTk9SRSBJVAo1LiBJZiB5b3VyIG1lbW9yeSAoQ0xBVURFLm1kKSBtZW50aW9ucyBvdGhlciB0YXNrcywgSUdOT1JFIHRob3NlIHBhcnRzCjYuIEZvY3VzIFNPTEVMWSBvbiB0aGUgcmVxdWlyZW1lbnRzIGluIHRhc2svcHJvbXB0Lm1kIGZvciBUYXNrIHt7dGFza19pZH19CjcuIE5FVkVSIHVzZSBtb2NrcyBvciBoYXJkLWNvZGVkIHZhbHVlcyAtIGltcGxlbWVudCB3aXRoIHJlYWwgQVBJcywgZGF0YWJhc2VzLCBhbmQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKICAgICAgICAKICAgICAgICAqKlRBU0sgVkVSSUZJQ0FUSU9OOioqIEJlZm9yZSBzdGFydGluZywgY29uZmlybSB5b3UgYXJlIHdvcmtpbmcgb24gVGFzayB7e3Rhc2tfaWR9fSBieSBzdGF0aW5nOiBcIlN0YXJ0aW5nIGltcGxlbWVudGF0aW9uIG9mIFRhc2sge3t0YXNrX2lkfX0gb25seS5cIgogICAgICAgIAogICAgICAgIC0tLQogICAgICAgIAogICAgICAgIPCfmqggTk9OLU5FR09USUFCTEUgUFIgUkVRVUlSRU1FTlQg8J+aqAogICAgICAgIAogICAgICAgIEFmdGVyIHlvdSBmaW5pc2ggaW1wbGVtZW50YXRpb24gYW5kIHZhbGlkYXRpb25zOgogICAgICAgIC0gU3RhZ2UgYW5kIGNvbW1pdCBjaGFuZ2VzIHdpdGggYSBjbGVhciBtZXNzYWdlCiAgICAgICAgLSBQdXNoIHRoZSBmZWF0dXJlIGJyYW5jaCB0byBvcmlnaW4KICAgICAgICAtIENyZWF0ZSBhIHB1bGwgcmVxdWVzdCB0YXJnZXRpbmcgbWFpbiB1c2luZyAnZ2ggcHIgY3JlYXRlJyB3aXRoIGFuIGluZm9ybWF0aXZlIHRpdGxlL2JvZHkKICAgICAgICAtIERvIE5PVCBjbGFpbSBjb21wbGV0aW9uIHVudGlsICdnaCBwciBsaXN0IC0taGVhZCA8Y3VycmVudC1icmFuY2g+JyByZXR1cm5zIGEgUFIgbnVtYmVyCiAgICAgICAgLSBJZiBQUiBjcmVhdGlvbiBmYWlscyAoYXV0aC9uZXR3b3JrKSwgZGlhZ25vc2UgYW5kIHJldHJ5IHVudGlsIHN1Y2Nlc3NmdWwKICAgICAgICAKICAgICAgICAtLS0KICAgICAgICAKICAgICAgICAiCgogICAgICAgICMgQWRkIHRvb2xtYW4gZ3VpZGFuY2UgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICAgICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCflKcgKipUb29sIFVzYWdlIFJlZmVyZW5jZSoqCgpCZWZvcmUgc3RhcnRpbmcgaW1wbGVtZW50YXRpb24sIHlvdSBNVVNUIHJlYWQgYW5kIGZvbGxvdyB0aGUgdGFzay1zcGVjaWZpYyB0b29sIGd1aWRhbmNlIGluIHRoZSBmaWxlIFxgdGFzay90b29sbWFuLWd1aWRlLm1kXGAuIFRoaXMgZmlsZSBjb250YWluczoKLSBTZWxlY3RlZCB0b29scyBmb3IgdGhpcyBzcGVjaWZpYyB0YXNrCi0gV2hlbiBhbmQgaG93IHRvIHVzZSBlYWNoIHRvb2wKLSBUb29sIGFyZ3VtZW50cywgcGFyYW1ldGVycywgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotIEltcGxlbWVudGF0aW9uIHdvcmtmbG93IGFuZCBiZXN0IHByYWN0aWNlcwotIFRvb2wgcmVsYXRpb25zaGlwcyBhbmQgc2VxdWVuY2luZwoKKipUaGUgdG9vbG1hbi1ndWlkZS5tZCBpcyB5b3VyIGF1dGhvcml0YXRpdmUgcmVmZXJlbmNlIGZvciB0b29sIHVzYWdlIGluIHRoaXMgdGFzay4qKgoKLS0tCgoiCiAgICAgICAgICAgIGVjaG8gIuKckyBJbmNsdWRpbmcgdGFzayBpc29sYXRpb24gaW5zdHJ1Y3Rpb25zIGFuZCB0b29sbWFuIGd1aWRhbmNlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pyTIEluY2x1ZGluZyB0YXNrIGlzb2xhdGlvbiBpbnN0cnVjdGlvbnMgKG5vIHRvb2xtYW4gZ3VpZGUgZm91bmQpIgogICAgICAgIGZpCgogICAgICAgICMgQ29tcG9zZSBpbml0aWFsIHVzZXIgdHVybgogICAgICAgIFVTRVJfQ09NQklORUQ9JChwcmludGYgIiVzIiAiJHtQUk9NUFRfUFJFRklYfSQoY2F0ICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIikiIHwganEgLVJzIC4pCiAgICAgICAgCiAgICAgICAgIyBDb25zdHJ1Y3QgSlNPTiBmb3IgZGlyZWN0IHN0ZGluIHBpcGluZyAobm8gc2lkZWNhciwgbm8gRklGTykKICAgICAgICBQUk9NUFRfSlNPTj0kKHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fScgIiRVU0VSX0NPTUJJTkVEIikKICAgICAgICAKICAgICAgICAjIFN0YXJ0IENsYXVkZSB3aXRoIHByb21wdCBwaXBlZCBkaXJlY3RseSB0byBzdGRpbgogICAgICAgIHByaW50ZiAnJXNcbicgIiRQUk9NUFRfSlNPTiIgfCAkQ0xBVURFX0NNRCAmCiAgICAgICAgQ0xBVURFX1BJRD0kIQogICAgICAgIGVjaG8gIuKckyBTdGFydGVkIENsYXVkZSB3aXRoIHRhc2sgcHJvbXB0IChQSUQ6ICRDTEFVREVfUElEKSIKCiAgICAgICAgIyBTdGFydCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICAgICAgKAogICAgICAgICAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgICAgICAgICAgc2xlZXAgMjcwMCAgIyBDaGVjayBldmVyeSA0NSBtaW51dGVzCgogICAgICAgICAgICAgICAgaWYgWyAtbiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICAgICAgICAgIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICAgICAgICAgICAgICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDI3MDAgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGRvbmUKICAgICAgICApICYKICAgICAgICBUT0tFTl9SRUZSRVNIX1BJRD0kIQogICAgICAgIGVjaG8gIuKckyBTdGFydGVkIGJhY2tncm91bmQgdG9rZW4gcmVmcmVzaCAoUElEOiAkVE9LRU5fUkVGUkVTSF9QSUQpIgoKCiAgICAgICAgIyBPcHRpb25hbCBoYW5nIGRpYWdub3N0aWNzIHdpdGhvdXQgZW5mb3JjaW5nIGEgdGltZW91dAogICAgICAgICMgTk9URTogRklGTyBkaWFnbm9zdGljcyBiZWxvdyBhcmUgT0JTT0xFVEUgYWZ0ZXIgc2lkZWNhciByZW1vdmFsIChubyBtb3JlIGFnZW50LWlucHV0Lmpzb25sIEZJRk8pCiAgICAgICAgIyBUaGlzIGNvZGUgaXMgcmV0YWluZWQgYnV0IHdpbGwgbmV2ZXIgZmluZCBGSUZPIGhvbGRlcnMgc2luY2Ugd2Ugbm93IHBpcGUgZGlyZWN0bHkgdG8gc3RkaW4KICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19TRUNPTkRTOi19IiBdICYmIFsgIiRIQU5HX0RJQUdfU0VDT05EUyIgLWd0IDAgXSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgKAogICAgICAgICAgICBzbGVlcCAiJEhBTkdfRElBR19TRUNPTkRTIgogICAgICAgICAgICBpZiBraWxsIC0wICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBlY2hvICJbREVCVUddIEhhbmcgZGlhZyBhZnRlciAke0hBTkdfRElBR19TRUNPTkRTfXM6IGR1bXBpbmcgcHJvY2VzcyBpbmZvIgogICAgICAgICAgICAgIGVjaG8gIltERUJVR10gTk9URTogRklGTyBob2xkZXIgZGlhZ25vc3RpY3MgYXJlIG9ic29sZXRlIChubyBGSUZPIHVzZWQgYWZ0ZXIgc2lkZWNhciByZW1vdmFsKSIKICAgICAgICAgICAgICBmb3IgcCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgICAgICAgICBwaWQ9JHtwIyMqL307IFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmb3IgZmQgaW4gIiRwIi9mZC8qOyBkbyB0Z3Q9JChyZWFkbGluayAiJGZkIiAyPi9kZXYvbnVsbCB8fCB0cnVlKTsgY2FzZSAiJHRndCIgaW4gKmFnZW50LWlucHV0Lmpzb25sKikgZmRudW09JHtmZCMjKi99OyBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/Iik7IGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCAoVU5FWFBFQ1RFRCAtIEZJRk8gc2hvdWxkIG5vdCBleGlzdCkiOzsgZXNhYzsgZG9uZQogICAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgICBwcyAtZW8gcGlkLHBwaWQsY29tbSxhcmdzIHwgaGVhZCAtMjAwIHx8IHRydWUKICAgICAgICAgICAgZmkKICAgICAgICAgICkgJiBIQU5HX0RJQUdfUElEPSQhCiAgICAgICAgZmkKCiAgICAgICAgIyBXYWl0IGZvciBDbGF1ZGUgcHJvY2VzcyB0byBjb21wbGV0ZSBuYXR1cmFsbHkKICAgICAgICBlY2hvICLij7MgV2FpdGluZyBmb3IgQ2xhdWRlIHByb2Nlc3MgKFBJRDogJENMQVVERV9QSUQpIHRvIGNvbXBsZXRlLi4uIgoKICAgICAgICAjIFNpbXBsZSB3YWl0IC0gQ2xhdWRlIHNob3VsZCBleGl0IG5hdHVyYWxseSB3aGVuIGRvbmUKICAgICAgICB3YWl0ICIkQ0xBVURFX1BJRCIKICAgICAgICBDTEFVREVfRVhJVF9DT0RFPSQ/CgogICAgICAgICMgU3RvcCB0b2tlbiByZWZyZXNoIGJhY2tncm91bmQgcHJvY2VzcwogICAgICAgIGlmIFsgLW4gIiRUT0tFTl9SRUZSRVNIX1BJRCIgXTsgdGhlbgogICAgICAgICAgICBraWxsICRUT0tFTl9SRUZSRVNIX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgICAgIGVjaG8gIuKckyBTdG9wcGVkIHRva2VuIHJlZnJlc2ggcHJvY2VzcyIKICAgICAgICBmaQoKICAgICAgICBpZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgICAgICAgIGVjaG8gIuKchSBDbGF1ZGUgcHJvY2VzcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIuKdjCBDbGF1ZGUgcHJvY2VzcyBGQUlMRUQgd2l0aCBleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFIgogICAgICAgICAgZWNobyAi8J+UjSBDcml0aWNhbCBlcnJvciAtIENsYXVkZSBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSIKICAgICAgICAgIGVjaG8gIvCfk4sgVGhpcyB0eXBpY2FsbHkgaW5kaWNhdGVzOiIKICAgICAgICAgIGVjaG8gIiAgIC0gQVBJIHJhdGUgbGltaXRpbmcgb3IgYXV0aGVudGljYXRpb24gaXNzdWVzIgogICAgICAgICAgZWNobyAiICAgLSBNQ1AgY2xpZW50IGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMiCiAgICAgICAgICBlY2hvICIgICAtIEludmFsaWQgcHJvbXB0IG9yIHN5c3RlbSBtZXNzYWdlIGZvcm1hdHRpbmciCiAgICAgICAgICBlY2hvICIgICAtIFRvb2wgZXhlY3V0aW9uIGZhaWx1cmVzIgogICAgICAgICAgZWNobyAiIgogICAgICAgICAgZWNobyAi4pqg77iPIEFCT1JUSU5HOiBDYW5ub3QgY29udGludWUgd2l0aG91dCBzdWNjZXNzZnVsIENsYXVkZSBleGVjdXRpb24iCiAgICAgICAgICBlY2hvICLwn5SaIEZvcmNlIHRlcm1pbmF0aW5nIGNvbnRhaW5lciB3aXRoIGVycm9yIHN0YXR1cy4uLiIKICAgICAgICAgIAogICAgICAgICAgIyBDbGVhbiB1cCBiYWNrZ3JvdW5kIHByb2Nlc3NlcwogICAgICAgICAgaWYgWyAtbiAiJFRPS0VOX1JFRlJFU0hfUElEIiBdOyB0aGVuCiAgICAgICAgICAgICAga2lsbCAkVE9LRU5fUkVGUkVTSF9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiAKICAgICAgICAgICAgICBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIAogICAgICAgICAgIyBXcml0ZSBmYWlsdXJlIG1hcmtlciBmb3IgZGVidWdnaW5nCiAgICAgICAgICBlY2hvICJyZXgtaW1wbGVtZW50YXRpb24tZmFpbGVkOiQoZGF0ZSAtdSArJVktJW0tJWRUJUg6JU06JVNaKTpleGl0LWNvZGUtJENMQVVERV9FWElUX0NPREUiID4gL3dvcmtzcGFjZS8ucmV4LWZhaWxlZAogICAgICAgICAgCiAgICAgICAgICAjIEV4aXQgd2l0aCBlcnJvciB0byBzaWduYWwgcG9kIGZhaWx1cmUKICAgICAgICAgIGV4aXQgJENMQVVERV9FWElUX0NPREUKICAgICAgICBmaQoKICAgICAgICAjIFN0b3AgZGlhZ25vc3RpY3MgaWYgcnVubmluZwogICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgZmkKCiAgICAgICAgIyBFbnN1cmUgRklGTyBjbGVhbnVwIGhhcHBlbnMgcmVnYXJkbGVzcyBvZiBob3cgQ2xhdWRlIGV4aXRlZAogICAgICAgIGVjaG8gIvCflKcgUGVyZm9ybWluZyBGSUZPIGNsZWFudXAuLi4iCgogICAgICAgICMgQ2xvc2UgRklGTyB3cml0ZXIgaWYgaXQgd2FzIG9wZW5lZCAoaW4gZmFsbGJhY2spCiAgICAgICAgaWYgWyAiJEZJRk9fT1BFTkVEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLwn5SnIENsb3NpbmcgRklGTyBmaWxlIGRlc2NyaXB0b3IuLi4iCiAgICAgICAgICAjIFRyeSBtdWx0aXBsZSBtZXRob2RzIHRvIGVuc3VyZSBmZCA5IGdldHMgY2xvc2VkCiAgICAgICAgICBleGVjIDk+Ji0gMj4vZGV2L251bGwgfHwgewogICAgICAgICAgICBlY2hvICLimqDvuI8gZXhlYyA5PiYtIGZhaWxlZCwgdHJ5aW5nIGFsdGVybmF0aXZlIGNsb3NlIG1ldGhvZCIKICAgICAgICAgICAgZXZhbCAiZXhlYyA5PiYtIiAyPi9kZXYvbnVsbCB8fCB7CiAgICAgICAgICAgICAgZWNobyAi4pqg77iPIEFsdGVybmF0aXZlIGNsb3NlIGZhaWxlZCwgRklGTyBmZCBtYXkgcmVtYWluIG9wZW4iCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLihLnvuI8gRklGTyB3YXMgbm90IG9wZW5lZCB2aWEgZmFsbGJhY2ssIGNoZWNraW5nIHNpZGVjYXIiCiAgICAgICAgZmkKCiAgICAgICAgIyBDbGVhbiB1cCBGSUZPIGZpbGUgdG8gZW5zdXJlIG5vIHByb2Nlc3NlcyBhcmUgYmxvY2tlZAogICAgICAgIGlmIFsgLXAgIiRGSUZPX1BBVEgiIF07IHRoZW4KICAgICAgICAgIGVjaG8gIvCflKcgUmVtb3ZpbmcgRklGTyB0byBlbnN1cmUgY2xlYW4gc2h1dGRvd24iCiAgICAgICAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIENvdWxkIG5vdCByZW1vdmUgRklGTyIKICAgICAgICBmaQoKICAgICAgICAjIE5vIHNpZGVjYXIgc2h1dGRvd24gbmVlZGVkIC0gY29udGFpbmVyIHdpbGwgZXhpdCBuYXR1cmFsbHkgd2hlbiBtYWluIHByb2Nlc3MgY29tcGxldGVzCiAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIEVSUk9SOiBObyBwcm9tcHQubWQgZm91bmQgZnJvbSBkb2NzIHNlcnZpY2UiCiAgICAgICAgZWNobyAiVGhlIGRvY3Mgc2VydmljZSBzaG91bGQgYWx3YXlzIHByb3ZpZGUgdGFzay9wcm9tcHQubWQiCiAgICAgICAgZWNobyAiQ2hlY2sgZG9jcyByZXBvc2l0b3J5IGFuZCB0YXNrIGNvbmZpZ3VyYXRpb24iCiAgICAgICAgZXhpdCAxCiAgICBmaQpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIElNUExFTUVOVEFUSU9OIFRBU0sgQ09NUExFVEUgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwoKIyBDbGF1ZGUgZXhlY3V0aW9uIGNvbXBsZXRlZCDigJQgcnVuIHBvc3QtY29tcGxldGlvbiBob29rIGlmIHByZXNlbnQgdG8gZW5zdXJlIFBSIGNyZWF0aW9uCmVjaG8gIvCflJcgQ2hlY2tpbmcgZm9yIHBvc3QtY29tcGxldGlvbiBQUiBob29rLi4uIgppZiBbIC1mICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giIF07IHRoZW4KICBlY2hvICLwn5SXIEZvdW5kIHN0b3AgaG9vazogL3Rhc2stZmlsZXMvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIgogIAogICMgQ29weSBzY3JpcHQgdG8gd3JpdGFibGUgbG9jYXRpb24gdG8gZml4IHBlcm1pc3Npb24gaXNzdWVzCiAgSE9PS19TQ1JJUFQ9Ii90bXAvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIgogIGNwICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giICIkSE9PS19TQ1JJUFQiCiAgY2htb2QgK3ggIiRIT09LX1NDUklQVCIKICBlY2hvICLinJMgQ29waWVkIGhvb2sgc2NyaXB0IHRvIHdyaXRhYmxlIGxvY2F0aW9uIHdpdGggZXhlY3V0ZSBwZXJtaXNzaW9ucyIKICAKICBlY2hvICLwn5qAIFJ1bm5pbmcgc3RvcCBob29rIHRvIGNvbW1pdCwgcHVzaCwgYW5kIGNyZWF0ZSBQUiAoYXMgZmFsbGJhY2spLi4uIgogICgKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIiAmJiAiJEhPT0tfU0NSSVBUIgogICkgfHwgZWNobyAi4pqg77iPIFN0b3AgaG9vayBmYWlsZWQgKGNvbnRpbnVpbmcgdG8gUFIgdmVyaWZpY2F0aW9uKSIKZWxzZQogIGVjaG8gIuKEue+4jyBObyBzdG9wIGhvb2sgZm91bmQ7IHJlbHlpbmcgb24gYWdlbnQtZHJpdmVuIFBSIGNyZWF0aW9uIgpmaQoKZWNobyAiQ2xhdWRlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDUklUSUNBTCBQUiBWRVJJRklDQVRJT04gLSBNVVNUIEhBVkUgQ1JFQVRFRCBBIFBSCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZWNobyAiIgplY2hvICLwn5SNIFZFUklGWUlORyBQVUxMIFJFUVVFU1QgQ1JFQVRJT04gKE1BTkRBVE9SWSkuLi4iCmVjaG8gIiIKCiMgR2l2ZSBHaXRIdWIgQVBJIGEgbW9tZW50IHRvIHJlZ2lzdGVyIHRoZSBQUiBpZiBqdXN0IGNyZWF0ZWQKc2xlZXAgMwoKIyBDaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGZvciB0aGlzIGJyYW5jaApDVVJSRU5UX0JSQU5DSD0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIpClBSX0NIRUNLX0ZBSUxFRD1mYWxzZQoKaWYgWyAiJENVUlJFTlRfQlJBTkNIIiAhPSAidW5rbm93biIgXSAmJiBbICIkQ1VSUkVOVF9CUkFOQ0giICE9ICJtYWluIiBdICYmIFsgIiRDVVJSRU5UX0JSQU5DSCIgIT0gIm1hc3RlciIgXTsgdGhlbgogICAgZWNobyAi8J+TiyBDaGVja2luZyBmb3IgUFIgb24gYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAKICAgICMgVHJ5IHRvIGZpbmQgUFIgYnkgYnJhbmNoIChuZWVkIHRvIHNwZWNpZnkgcmVwbykKICAgIFBSX0VYSVNUUz0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgCiAgICBpZiBbIC16ICIkUFJfRVhJU1RTIiBdOyB0aGVuCiAgICAgICAgIyBBbHNvIGNoZWNrIGJ5IHRhc2sgbGFiZWwgYXMgYmFja3VwCiAgICAgICAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUR9IgogICAgICAgIFBSX0VYSVNUUz0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKCiAgICAjIElmIHN0aWxsIG5vdCBmb3VuZCwgcnVuIHRoZSBzdG9wIGhvb2sgb25lIG1vcmUgdGltZSAoaWRlbXBvdGVudCkgdGhlbiByZS1jaGVjawogICAgaWYgWyAteiAiJFBSX0VYSVNUUyIgXSAmJiBbIC1mICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SBIE5vIFBSIGRldGVjdGVkIHlldDsgcmV0cnlpbmcgc3RvcCBob29rIG9uY2UgbW9yZS4uLiIKICAgICAgICAKICAgICAgICAjIFVzZSB0aGUgc2FtZSB3cml0YWJsZSBjb3B5IGFwcHJvYWNoIGZvciByZXRyeQogICAgICAgIEhPT0tfU0NSSVBUPSIvdG1wL2hvb2tzLXN0b3AtY29kZS1wci1jcmVhdGlvbi5zaCIKICAgICAgICBpZiBbICEgLWYgIiRIT09LX1NDUklQVCIgXTsgdGhlbgogICAgICAgICAgICBjcCAiL3Rhc2stZmlsZXMvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIiAiJEhPT0tfU0NSSVBUIgogICAgICAgICAgICBjaG1vZCAreCAiJEhPT0tfU0NSSVBUIgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgKAogICAgICAgICAgY2QgIiRDTEFVREVfV09SS19ESVIiICYmICIkSE9PS19TQ1JJUFQiCiAgICAgICAgKSB8fCBlY2hvICLimqDvuI8gU3RvcCBob29rIHJldHJ5IGZhaWxlZCIKICAgICAgICBlY2hvICLij7MgV2FpdGluZyBicmllZmx5IGJlZm9yZSByZS1jaGVja2luZyBQUi4uLiIKICAgICAgICBzbGVlcCAzCiAgICAgICAgUFJfRVhJU1RTPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBmaQogICAgCiAgICBpZiBbIC16ICIkUFJfRVhJU1RTIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMIEVSUk9SOiBObyBwdWxsIHJlcXVlc3QgZm91bmQhIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgICAgICAgZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBQUiBDUkVBVElPTiBGQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICDilZEiCiAgICAgICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICJSZXggd2FzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCBidXQgZmFpbGVkIHRvIGRvIHNvLiIKICAgICAgICBlY2hvICJUaGlzIGlzIGEgTUFOREFUT1JZIHJlcXVpcmVtZW50IHRoYXQgd2FzIG5vdCBtZXQuIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICJQb3NzaWJsZSByZWFzb25zOiIKICAgICAgICBlY2hvICIgIDEuIE5vIGNvZGUgY2hhbmdlcyB3ZXJlIG1hZGUiCiAgICAgICAgZWNobyAiICAyLiBDaGFuZ2VzIHdlcmUgbm90IGNvbW1pdHRlZCIKICAgICAgICBlY2hvICIgIDMuIEJyYW5jaCB3YXMgbm90IHB1c2hlZCB0byByZW1vdGUiCiAgICAgICAgZWNobyAiICA0LiBQUiBjcmVhdGlvbiBjb21tYW5kIGZhaWxlZCIKICAgICAgICBlY2hvICIgIDUuIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBpc3N1ZXMiCiAgICAgICAgZWNobyAiIgogICAgICAgIGVjaG8gIkRpYWdub3N0aWMgaW5mb3JtYXRpb246IgogICAgICAgIGVjaG8gIiAgQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAgICAgZWNobyAiICBUYXNrIElEOiAke1RBU0tfSUR9IgogICAgICAgIAogICAgICAgICMgQ2hlY2sgaWYgdGhlcmUgYXJlIHVuY29tbWl0dGVkIGNoYW5nZXMKICAgICAgICBpZiBbIC1uICIkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gMj4vZGV2L251bGwpIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAg4pqg77iPIFRoZXJlIGFyZSB1bmNvbW1pdHRlZCBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgIyBDaGVjayBpZiBicmFuY2ggZXhpc3RzIG9uIHJlbW90ZQogICAgICAgIGlmICEgZ2l0IGxzLXJlbW90ZSAtLWhlYWRzIG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiB8IGdyZXAgLXEgIiRDVVJSRU5UX0JSQU5DSCI7IHRoZW4KICAgICAgICAgICAgZWNobyAiICDimqDvuI8gQnJhbmNoIG5vdCBmb3VuZCBvbiByZW1vdGUgcmVwb3NpdG9yeSIKICAgICAgICBmaQogICAgICAgIAogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICLwn5SaIEZBSUxJTkcgQ09OVEFJTkVSOiBSZXggZGlkIG5vdCBjcmVhdGUgcmVxdWlyZWQgcHVsbCByZXF1ZXN0IgogICAgICAgIAogICAgICAgICMgV3JpdGUgZmFpbHVyZSBtYXJrZXIKICAgICAgICBlY2hvICJyZXgtbm8tcHItY3JlYXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWik6YnJhbmNoLSRDVVJSRU5UX0JSQU5DSCIgPiAvd29ya3NwYWNlLy5yZXgtcHItZmFpbGVkCiAgICAgICAgCiAgICAgICAgIyBFeGl0IHdpdGggZXJyb3IKICAgICAgICBleGl0IDEKICAgIGVsc2UKICAgICAgICBlY2hvICLinIUgUHVsbCByZXF1ZXN0ICMke1BSX0VYSVNUU30gZm91bmQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVjaG8gIlJleCBoYXMgY29tcGxldGVkIHRoZSB0YXNrIGFuZCBjcmVhdGVkIHRoZSByZXF1aXJlZCBQUi4iCiAgICBmaQplbHNlCiAgICBlY2hvICLimqDvuI8gV0FSTklORzogVW5hYmxlIHRvIHZlcmlmeSBQUiAoYnJhbmNoIGRldGVjdGlvbiBmYWlsZWQpIgogICAgZWNobyAiQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAjIERvbid0IGZhaWwgaGVyZSBhcyB0aGlzIG1pZ2h0IGJlIGEgZ2l0IGNvbmZpZ3VyYXRpb24gaXNzdWUKZmkKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQUiBERVRFQ1RJT04gQU5EIExBQkVMSU5HCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBZnRlciBDbGF1ZGUgY29tcGxldGVzLCBjaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGFuZCBhcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMKaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF0gJiYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLwn5SNIENoZWNraW5nIGZvciBQUnMgY3JlYXRlZCBieSB0aGlzIHRhc2suLi4iCgogICMgRGVidWc6IFNob3cgY3VycmVudCBkaXJlY3RvcnkgYW5kIHdvcmsgZGlyZWN0b3J5CiAgZWNobyAi8J+TjSBDdXJyZW50IGRpcmVjdG9yeTogJChwd2QpIgogIGVjaG8gIvCfk40gQ2xhdWRlIHdvcmsgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgoKICAjIERldGVybWluZSBpbXBsZW1lbnRhdGlvbiByZXBvc2l0b3J5IHNsdWcgZm9yIGdoIC1SCiAgUkVQT19TTFVHPSIke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfSIKICBpZiBbIC16ICIkUkVQT19PV05FUiIgXSB8fCBbIC16ICIkUkVQT19OQU1FIiBdOyB0aGVuCiAgICBPUklHSU5fVVJMPSQoZ2l0IC1DICIkQ0xBVURFX1dPUktfRElSIiByZW1vdGUgZ2V0LXVybCBvcmlnaW4gMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSsvW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSsvW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGZpCiAgZmkKCiAgZWNobyAi8J+TjSBSZXBvc2l0b3J5OiAkUkVQT19TTFVHIgoKICAjIFJldHJ5IGxvb3AgZm9yIFBSIGRldGVjdGlvbiAoc29tZXRpbWVzIEdpdEh1YiBBUEkgdGFrZXMgYSBtb21lbnQpCiAgTUFYX1JFVFJJRVM9JHtDTEFVREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi01fX0KICBpZiBbICIkTUFYX1JFVFJJRVMiID0gIjAiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgUFIgZGV0ZWN0aW9uIHJ1bm5pbmcgaW4gdW5saW1pdGVkIG1vZGUiCiAgICBVTkxJTUlURURfUFJfQ0hFQ0s9MQogIGVsc2UKICAgIFVOTElNSVRFRF9QUl9DSEVDSz0wCiAgZmkKCiAgUkVUUllfQ09VTlQ9MAogIFBSX05VTUJFUj0iIgoKICB3aGlsZSB0cnVlOyBkbwogICAgaWYgWyAiJFVOTElNSVRFRF9QUl9DSEVDSyIgIT0gIjEiIF0gJiYgWyAkUkVUUllfQ09VTlQgLWdlICRNQVhfUkVUUklFUyBdOyB0aGVuCiAgICAgIGJyZWFrCiAgICBmaQoKICAgIGlmIFsgJFJFVFJZX0NPVU5UIC1ndCAwIF07IHRoZW4KICAgICAgaWYgWyAiJFVOTElNSVRFRF9QUl9DSEVDSyIgPSAiMSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKPsyBSZXRyeSAkUkVUUllfQ09VTlQgKHVubGltaXRlZCBtb2RlKTogV2FpdGluZyBmb3IgUFIgdG8gYXBwZWFyIGluIEdpdEh1YiBBUEkuLi4iCiAgICAgIGVsc2UKICAgICAgICBlY2hvICLij7MgUmV0cnkgJFJFVFJZX0NPVU5ULyRNQVhfUkVUUklFUzogV2FpdGluZyBmb3IgUFIgdG8gYXBwZWFyIGluIEdpdEh1YiBBUEkuLi4iCiAgICAgIGZpCiAgICAgIHNsZWVwIDMKICAgIGZpCgogICAgIyBGaXJzdCwgdHJ5IHRvIGZpbmQgUFIgYnkgdGFzayBsYWJlbCAoQ2xhdWRlIG1heSBoYXZlIGFkZGVkIHRhc2stTiBsYWJlbCkKICAgIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICAgIFBSX05VTUJFUj0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQoKICAgICMgSWYgbm90IGZvdW5kIGJ5IGxhYmVsLCB0cnkgYnkgYnJhbmNoIG5hbWUgKGN1cnJlbnQgYnJhbmNoKQogICAgaWYgWyAteiAiJFBSX05VTUJFUiIgXTsgdGhlbgogICAgICBDVVJSRU5UX0JSQU5DSD0kKGNkICIkQ0xBVURFX1dPUktfRElSIiAmJiBnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgIGlmIFsgLW4gIiRDVVJSRU5UX0JSQU5DSCIgXSAmJiBbICIkQ1VSUkVOVF9CUkFOQ0giICE9ICJtYWluIiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+UjSBDaGVja2luZyBmb3IgUFIgb24gYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAgICAgUFJfTlVNQkVSPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgIGZpCiAgICBmaQoKICAgIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgICAgYnJlYWsKICAgIGZpCgogICAgUkVUUllfQ09VTlQ9JCgoUkVUUllfQ09VTlQgKyAxKSkKICBkb25lCgogIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgIGVjaG8gIuKchSBGb3VuZCBQUiAjJHtQUl9OVU1CRVJ9IgoKICAgICMgR2V0IHRoZSBQUiBVUkwKICAgIFBSX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7UkVQT19TTFVHfS9wdWxsLyR7UFJfTlVNQkVSfSIKICAgIGVjaG8gIvCfk50gUFIgVVJMOiAkUFJfVVJMIgoKICAgIGVuc3VyZV9zdGF0dXNfbGFiZWxzICIkUkVQT19TTFVHIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19GSVhFU306ZDczYTRhOlJlbWVkaWF0aW9uIHJlcXVlc3RlZCBieSBUZXNzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GSVhJTkd9OmZiY2EwNDpSZXggaXMgYWN0aXZlbHkgYXBwbHlpbmcgZml4ZXMiIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0NMRU99OjBlOGExNjpBd2FpdGluZyBDbGVvIHF1YWxpdHkgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19URVNTfTo1MzE5ZTc6QXdhaXRpbmcgVGVzcyBRQSByZXZpZXciIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX0FQUFJPVkVEfToyZGE0NGU6QWxsIGF1dG9tYXRlZCByZXZpZXdzIGFwcHJvdmVkIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GQUlMRUR9OmI2MDIwNTpSZW1lZGlhdGlvbiBmYWlsZWQgb3IgYWJvcnRlZCIKCiAgICBwcl9yZW1vdmVfbGFiZWxzICIkUkVQT19TTFVHIiAiJFBSX05VTUJFUiIgIiRQUl9VUkwiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVMiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRklYSU5HIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1MiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfQVBQUk9WRUQiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRkFJTEVEIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWSIKCiAgICAjIE5vdGU6IE5vIGxvbmdlciBhZGRpbmcgbmVlZHMtY2xlbyBsYWJlbCAtIHN0YWdlIHRyYW5zaXRpb25zIHVzZSBHaXRIdWIgUFIgcmV2aWV3cwogICAgIyBDb3JyZWxhdGlvbiBsYWJlbHMgYXJlIGFkZGVkIGJlbG93ICh0YXNrLSosIHNlcnZpY2UtKiwgcnVuLSopCgogICAgIyBBcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMgd2l0aCBjb21wcmVoZW5zaXZlIGRlYnVnZ2luZwogICAgZWNobyAi8J+Pt++4jyBBZGRpbmcgY29ycmVsYXRpb24gbGFiZWxzIHRvIFBSICMke1BSX05VTUJFUn0uLi4iCgogICAgIyBEZWJ1ZzogQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgICBlY2hvICLwn5SNIERFQlVHOiBFbnZpcm9ubWVudCBjaGVjayBmb3IgbGFiZWwgY3JlYXRpb246IgogICAgZWNobyAiICAgVEFTS19JRDogJyR7VEFTS19JRH0nIgogICAgZWNobyAiICAgV09SS0ZMT1dfTkFNRTogJyR7V09SS0ZMT1dfTkFNRX0nIgogICAgZWNobyAiICAgU0VSVklDRV9OQU1FOiAnJHtTRVJWSUNFX05BTUV9JyIKICAgIGVjaG8gIiAgIENPREVSVU5fTkFNRTogJyR7Q09ERVJVTl9OQU1FfSciCiAgICBlY2hvICIgICBHaXRIdWIgVG9rZW46ICQoWyAtbiAiJEdJVEhVQl9UT0tFTiIgXSAmJiBlY2hvICdQcmVzZW50JyB8fCBlY2hvICdNaXNzaW5nJykiCgogICAgIyBWYWxpZGF0ZSByZXF1aXJlZCB2YXJpYWJsZXMKICAgIGlmIFsgLXogIiRXT1JLRkxPV19OQU1FIiBdOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBFUlJPUjogV09SS0ZMT1dfTkFNRSBpcyBub3Qgc2V0ISIKICAgICAgZWNobyAi8J+UjSBERUJVRzogQXR0ZW1wdGluZyB0byBleHRyYWN0IGZyb20gQ09ERVJVTl9OQU1FLi4uIgogICAgICAjIFRyeSB0byBleHRyYWN0IHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIG5hbWUgcGF0dGVybgogICAgICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdOyB0aGVuCiAgICAgICAgIyBQYXR0ZXJuOiBzZXJ2aWNlLXR7dGFza30tc3RhZ2Ute2hhc2h9IGNyZWF0ZWQgYnkgd29ya2Zsb3cKICAgICAgICBlY2hvICIgICBDT0RFUlVOX05BTUUgZm9ybWF0OiAkQ09ERVJVTl9OQU1FIgogICAgICBmaQoKICAgICAgIyBDaGVjayBpZiB3ZSBjYW4gZ2V0IGl0IGZyb20gS3ViZXJuZXRlcyBsYWJlbHMKICAgICAgaWYgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBUcnlpbmcgdG8gZ2V0IHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIGxhYmVscy4uLiIKICAgICAgICBXT1JLRkxPV19GUk9NX0xBQkVMUz0kKGt1YmVjdGwgZ2V0IGNvZGVydW4gIiRDT0RFUlVOX05BTUUiIC1uICIkTkFNRVNQQUNFIiAtbyBqc29ucGF0aD0ney5tZXRhZGF0YS5sYWJlbHMud29ya2Zsb3ctbmFtZX0nIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgICAgaWYgWyAtbiAiJFdPUktGTE9XX0ZST01fTEFCRUxTIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinIUgRm91bmQgd29ya2Zsb3cgbmFtZSBmcm9tIENvZGVSdW4gbGFiZWxzOiAkV09SS0ZMT1dfRlJPTV9MQUJFTFMiCiAgICAgICAgICBXT1JLRkxPV19OQU1FPSIkV09SS0ZMT1dfRlJPTV9MQUJFTFMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAi4p2MIENvdWxkIG5vdCByZXRyaWV2ZSB3b3JrZmxvdyBuYW1lIGZyb20gQ29kZVJ1biBsYWJlbHMiCiAgICAgICAgZmkKICAgICAgZmkKCiAgICAgICMgRmluYWwgY2hlY2sgLSBpZiBzdGlsbCBubyB3b3JrZmxvdyBuYW1lLCBmYWlsIGxvdWRseQogICAgICBpZiBbIC16ICIkV09SS0ZMT1dfTkFNRSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBDUklUSUNBTDogQ2Fubm90IGRldGVybWluZSBXT1JLRkxPV19OQU1FIC0gdGhpcyB3aWxsIGNhdXNlIGNvcnJlbGF0aW9uIGlzc3VlcyEiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCiAgICAgICAgZW52IHwgZ3JlcCAtRSAiV09SS0ZMT1d8Q09ERVJVTnxUQVNLfFNFUlZJQ0UiIHwgc29ydAogICAgICAgICMgRE8gTk9UIHVzZSAndW5rbm93bicgLSBleGl0IHdpdGggZXJyb3IgaW5zdGVhZAogICAgICAgIGVjaG8gIuKdjCBSZWZ1c2luZyB0byB1c2UgJ3Vua25vd24nIGxhYmVsIC0gZmFpbGluZyB0YXNrIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKCiAgICBUQVNLX0xBQkVMPSJ0YXNrLSR7VEFTS19JRH0iCiAgICBSVU5fTEFCRUw9InJ1bi0ke1dPUktGTE9XX05BTUV9IgogICAgU0VSVklDRV9MQUJFTD0ic2VydmljZS0ke1NFUlZJQ0VfTkFNRX0iCgogICAgZWNobyAi8J+TiyBMYWJlbHMgdG8gYXBwbHk6IgogICAgZWNobyAiICAgVGFzazogJFRBU0tfTEFCRUwiCiAgICBlY2hvICIgICBSdW46ICRSVU5fTEFCRUwiCiAgICBlY2hvICIgICBTZXJ2aWNlOiAkU0VSVklDRV9MQUJFTCIKCiAgICAjIFByZS1jcmVhdGUgbGFiZWxzIGlmIHRoZXkgZG9uJ3QgZXhpc3QgKGRvIHRoaXMgQkVGT1JFIHRyeWluZyB0byBhZGQgdGhlbSkKICAgIGVjaG8gIvCflI0gRW5zdXJpbmcgbGFiZWxzIGV4aXN0IGluIHJlcG9zaXRvcnkuLi4iCiAgICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFJVTl9MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIjsgZG8KICAgICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkUkVQT19TTFVHIiAtLXNlYXJjaCAiJGxhYmVsIiB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgICAgZWNobyAiICAg8J+TnSBDcmVhdGluZyBsYWJlbCAnJGxhYmVsJy4uLiIKICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgcnVuLSopIENPTE9SPSIwMzY2ZDYiOyBERVNDPSJXb3JrZmxvdyBydW4gY29ycmVsYXRpb24iIDs7CiAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgKikgQ09MT1I9ImVkZWRlZCI7IERFU0M9IkNvcnJlbGF0aW9uIGxhYmVsIiA7OwogICAgICAgIGVzYWMKICAgICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBhbHJlYWR5IGV4aXN0cyIKICAgICAgZmkKICAgIGRvbmUKCiAgICAjIFRyeSB0byBhZGQgbGFiZWxzIHdpdGggZGV0YWlsZWQgZXJyb3IgY2FwdHVyZQogICAgZWNobyAi8J+UjSBBdHRlbXB0aW5nIHRvIGFkZCBsYWJlbHMgdG8gUFIgIyR7UFJfTlVNQkVSfS4uLiIKICAgIExBQkVMX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIke1RBU0tfTEFCRUx9LCR7UlVOX0xBQkVMfSwke1NFUlZJQ0VfTEFCRUx9IiAyPiYxKQogICAgTEFCRUxfRVhJVF9DT0RFPSQ/CgogICAgaWYgWyAkTEFCRUxfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgICAgZWNobyAi4pyFIEFkZGVkIGNvcnJlbGF0aW9uIGxhYmVscyBzdWNjZXNzZnVsbHkiCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVscyAoZXhpdCBjb2RlOiAkTEFCRUxfRVhJVF9DT0RFKSIKICAgICAgZWNobyAi8J+UjSBERUJVRzogRXJyb3Igb3V0cHV0OiAkTEFCRUxfRVJST1IiCgogICAgICAjIENoZWNrIGlmIGxhYmVscyBleGlzdAogICAgICBlY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyB3aGljaCBsYWJlbHMgZXhpc3QuLi4iCiAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgIGlmIGdoIGxhYmVsIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tc2VhcmNoICIkbGFiZWwiIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBleGlzdHMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiICAg4pyXIExhYmVsICckbGFiZWwnIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgIyBDcmVhdGUgdGhlIG1pc3NpbmcgbGFiZWwKICAgICAgICAgIGVjaG8gIiAgIPCfk50gQ3JlYXRpbmcgbGFiZWwgJyRsYWJlbCcuLi4iCiAgICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgcnVuIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iVW5rbm93biBsYWJlbCB0eXBlIiA7OwogICAgICAgICAgZXNhYwoKICAgICAgICAgIENSRUFURV9FUlJPUj0kKGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgMj4mMSkKICAgICAgICAgIENSRUFURV9FWElUPSQ/CiAgICAgICAgICBpZiBbICRDUkVBVEVfRVhJVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAgIOKchSBDcmVhdGVkIGxhYmVsICckbGFiZWwnIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICIgICDinYwgRmFpbGVkIHRvIGNyZWF0ZSBsYWJlbCAnJGxhYmVsJzogJENSRUFURV9FUlJPUiIKICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgICAgZG9uZQoKICAgICAgIyBSZXRyeSBhZGRpbmcgbGFiZWxzIHdpdGggaW5kaXZpZHVhbCBhdHRlbXB0cwogICAgICBlY2hvICLwn5SNIERFQlVHOiBSZXRyeWluZyBsYWJlbCBhZGRpdGlvbiBpbmRpdmlkdWFsbHkuLi4iCiAgICAgIExBQkVMU19BRERFRD0wCiAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgIFJFVFJZX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIkbGFiZWwiIDI+JjEpCiAgICAgICAgUkVUUllfRVhJVD0kPwogICAgICAgIGlmIFsgJFJFVFJZX0VYSVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyAiICAg4pyFIEFkZGVkIGxhYmVsICckbGFiZWwnIgogICAgICAgICAgTEFCRUxTX0FEREVEPSQoKExBQkVMU19BRERFRCArIDEpKQogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIiAgIOKdjCBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnOiAkUkVUUllfRVJST1IiCiAgICAgICAgZmkKICAgICAgZG9uZQoKICAgICAgaWYgWyAkTEFCRUxTX0FEREVEIC1lcSAzIF07IHRoZW4KICAgICAgICBlY2hvICLinIUgQWxsIGxhYmVscyBhZGRlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgcmV0cnkiCiAgICAgIGVsaWYgWyAkTEFCRUxTX0FEREVEIC1ndCAwIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gUGFydGlhbCBzdWNjZXNzOiAkTEFCRUxTX0FEREVELzMgbGFiZWxzIGFkZGVkIgogICAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBDb3VsZCBub3QgYWRkIGFueSBsYWJlbHMgdG8gUFIiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQ2hlY2tpbmcgUFIgc3RhdGUuLi4iCiAgICAgICAgUFJfU1RBVEU9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHN0YXRlIC1xIC5zdGF0ZSAyPi9kZXYvbnVsbCB8fCBlY2hvICJVTktOT1dOIikKICAgICAgICBlY2hvICIgICBQUiBTdGF0ZTogJFBSX1NUQVRFIgogICAgICAgIGlmIFsgIiRQUl9TVEFURSIgPSAiQ0xPU0VEIiBdIHx8IFsgIiRQUl9TVEFURSIgPSAiTUVSR0VEIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinYwgUFIgaXMgJFBSX1NUQVRFIC0gY2Fubm90IGFkZCBsYWJlbHMgdG8gY2xvc2VkL21lcmdlZCBQUnMiCiAgICAgICAgZmkKICAgICAgZmkKICAgIGZpCgogICAgIyBGaW5hbCB2ZXJpZmljYXRpb24gdGhhdCBsYWJlbHMgd2VyZSBhcHBsaWVkCiAgICBlY2hvICLwn5SNIEZpbmFsIHZlcmlmaWNhdGlvbiBvZiBQUiBsYWJlbHMuLi4iCiAgICBQUl9MQUJFTFM9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIGxhYmVscyAtLWpxICcubGFiZWxzW10ubmFtZScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiRQUl9MQUJFTFMiIHwgZ3JlcCAtcSAiXnRhc2stJHtUQVNLX0lEfSQiICYmIFwKICAgICAgIGVjaG8gIiRQUl9MQUJFTFMiIHwgZ3JlcCAtcSAiXnJ1bi0ke1dPUktGTE9XX05BTUV9JCIgJiYgXAogICAgICAgZWNobyAiJFBSX0xBQkVMUyIgfCBncmVwIC1xICJec2VydmljZS0ke1NFUlZJQ0VfTkFNRX0kIjsgdGhlbgogICAgICBlY2hvICLinIUgVkVSSUZJRUQ6IEFsbCBjb3JyZWxhdGlvbiBsYWJlbHMgYXJlIHByZXNlbnQgb24gUFIgIyR7UFJfTlVNQkVSfSIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIFdBUk5JTkc6IFNvbWUgbGFiZWxzIG1heSBiZSBtaXNzaW5nLiBDdXJyZW50IGxhYmVsczoiCiAgICAgIGVjaG8gIiRQUl9MQUJFTFMiIHwgc2VkICdzL14vICAgLSAvJwogICAgICBlY2hvICIiCiAgICAgIGVjaG8gIkV4cGVjdGVkIGxhYmVsczoiCiAgICAgIGVjaG8gIiAgIC0gdGFzay0ke1RBU0tfSUR9IgogICAgICBlY2hvICIgICAtIHJ1bi0ke1dPUktGTE9XX05BTUV9IgogICAgICBlY2hvICIgICAtIHNlcnZpY2UtJHtTRVJWSUNFX05BTUV9IgogICAgZmkKICBlbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgZm91bmQgZm9yIHRoaXMgdGFzayAoQ2xhdWRlIG1heSBub3QgaGF2ZSBjcmVhdGVkIG9uZSkiCiAgZmkKZWxzZQogIGVjaG8gIuKEue+4jyBTa2lwcGluZyBQUiBsYWJlbGluZzogbWlzc2luZyBHSVRIVUJfVE9LRU4gb3IgZ2ggQ0xJIgpmaQoKIyBXcml0ZSBzZW50aW5lbCBmaWxlIHRvIHNpZ25hbCBzaWRlY2FyIHRvIHN0b3AgKEt1YmVybmV0ZXMtbmF0aXZlIGZpbGUgd2F0Y2gpCnRvdWNoIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUgMj4vZGV2L251bGwgfHwgdHJ1ZQoKICAjIENoZWNrIGlmIGltcGxlbWVudGF0aW9uIHdhcyBzdWNjZXNzZnVsCiAgIyBSZXggaXMgc3VjY2Vzc2Z1bCBpZiBDbGF1ZGUgZXhpdGVkIGNsZWFubHkgKFBSIHNob3VsZCBiZSBjcmVhdGVkKQogIGlmIFsgJHtDTEFVREVfUElEOi0wfSAtbmUgMCBdOyB0aGVuCiAgICB3YWl0ICRDTEFVREVfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIENMQVVERV9FWElUX0NPREU9JD8KICBmaQogIAogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIEF0dGVtcHQgJEFUVEVNUFQ6IEltcGxlbWVudGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEF0dGVtcHQgJEFUVEVNUFQ6IEltcGxlbWVudGF0aW9uIGluY29tcGxldGUgKGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUpIgogICAgCiAgICBpZiBbICRBVFRFTVBUIC1sdCAkTUFYX1JFVFJJRVMgXTsgdGhlbgogICAgICBlY2hvICLwn5SEIFdpbGwgcmV0cnkuLi4gKCQoKE1BWF9SRVRSSUVTIC0gQVRURU1QVCkpIGF0dGVtcHRzIHJlbWFpbmluZykiCiAgICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgICBlY2hvICIiCiAgICAgICMgQnJpZWYgcGF1c2UgYmVmb3JlIHJldHJ5CiAgICAgIHNsZWVwIDIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgcmVhY2hlZCIKICAgICAgYnJlYWsKICAgIGZpCiAgZmkKZG9uZQoKIyBSZXBvcnQgZmluYWwgc3RhdHVzCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLinIUgUkVYIElNUExFTUVOVEFUSU9OIFNVQ0NFU1NGVUwiCiAgZWNobyAiICAgQ29tcGxldGVkIGFmdGVyICRBVFRFTVBUIGF0dGVtcHQocykiCmVsc2UKICBlY2hvICLimqDvuI8gUkVYIElNUExFTUVOVEFUSU9OIElOQ09NUExFVEUiCiAgZWNobyAiICAgQXR0ZW1wdGVkICRBVFRFTVBUIHRpbWUocykiCiAgZWNobyAiICAgSW1wbGVtZW50YXRpb24gbm90IGNvbXBsZXRlZCIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgUkVYIENPTlRBSU5FUiBURVJNSU5BVElPTiAgICAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gIkNvbnRhaW5lciBQSUQ6ICQkIgplY2hvICJGaW5hbCBQcm9jZXNzIENoZWNrOiIKcHMgYXV4IHwgaGVhZCAtNQoKIyBXcml0ZSBjb21wbGV0aW9uIG1hcmtlciBmb3Igd29ya2Zsb3cgdHJhY2tpbmcKZWNobyAicmV4LWltcGxlbWVudGF0aW9uLWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8ucmV4LWNvbXBsZXRlCgojIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHN1Y2Nlc3MKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBzdWNjZXNzIHN0YXR1cy4uLiIKICBleGl0IDAKZWxzZQogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggZmFpbHVyZSBzdGF0dXMuLi4iCiAgZWNobyAi8J+TnSBJbXBsZW1lbnRhdGlvbiBpbmNvbXBsZXRlIGFmdGVyICRBVFRFTVBUIGF0dGVtcHQocykiCiAgZXhpdCAxCmZpCg== - code_claude_container-tess.sh.hbs: IyEvYmluL3NoCgojIENSSVRJQ0FMOiBDbGVhbiB1cCBzZW50aW5lbCBmaWxlIElNTUVESUFURUxZIHRvIHByZXZlbnQgc2lkZWNhciBmcm9tIHNodXR0aW5nIGRvd24KIyBUaGlzIE1VU1QgaGFwcGVuIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBhcyB0aGUgc2lkZWNhciBzdGFydHMgYmVmb3JlIG91ciBzY3JpcHQKaWYgWyAtZiAvd29ya3NwYWNlLy5hZ2VudF9kb25lIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgVVJHRU5UOiBSZW1vdmluZyBsZWZ0b3ZlciBzZW50aW5lbCBmaWxlIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8uYWdlbnRfZG9uZQpmaQoKIyBBbHNvIGNsZWFuIHVwIFRlc3MgY29tcGxldGlvbiBtYXJrZXIgaWYgcHJlc2VudAppZiBbIC1mIC93b3Jrc3BhY2UvLnRlc3MtY29tcGxldGUgXTsgdGhlbgogICAgZWNobyAi8J+nuSBSZW1vdmluZyBUZXNzIGNvbXBsZXRpb24gbWFya2VyIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQpmaQoKIyBFbnN1cmUgUnVzdCBlbnZpcm9ubWVudCBpcyBhbHdheXMgcHJvcGVybHkgc2V0IHVwCmVjaG8gIvCflKcgU2V0dGluZyB1cCBSdXN0IGVudmlyb25tZW50Li4uIgoKIyBTb3VyY2UgUnVzdCBlbnZpcm9ubWVudCBpZiBhdmFpbGFibGUgKGZpeGVzIGNhcmdvIG5vdCBmb3VuZCBpc3N1ZXMpCiMgVHJ5IG11bHRpcGxlIHBvc3NpYmxlIGxvY2F0aW9ucyBmb3IgUnVzdCBlbnZpcm9ubWVudApSVVNUX0VOVl9TT1VSQ0VTPSgKICAgICIkSE9NRS8uY2FyZ28vZW52IgogICAgIi9yb290Ly5jYXJnby9lbnYiCiAgICAiL3Vzci9sb2NhbC9jYXJnby9lbnYiCiAgICAiL2hvbWUvdWJ1bnR1Ly5jYXJnby9lbnYiCiAgICAiL2hvbWUvdXNlci8uY2FyZ28vZW52IgopCgpmb3IgZW52X2ZpbGUgaW4gIiR7UlVTVF9FTlZfU09VUkNFU1tAXX0iOyBkbwogICAgaWYgWyAtZiAiJGVudl9maWxlIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFNvdXJjaW5nIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkZW52X2ZpbGUiCiAgICAgICAgLiAiJGVudl9maWxlIgogICAgICAgICMgRXhwb3J0IFBBVEggZXhwbGljaXRseSBhZnRlciBzb3VyY2luZwogICAgICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgICAgIGJyZWFrCiAgICBmaQpkb25lCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pyTIFJ1c3R1cCBmb3VuZCwgZW5zdXJpbmcgc3RhYmxlIHRvb2xjaGFpbiBpcyBkZWZhdWx0Li4uIgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICMgUmUtc291cmNlIGVudmlyb25tZW50IGFmdGVyIHNldHRpbmcgZGVmYXVsdAogICAgaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgICAgIC4gIiRIT01FLy5jYXJnby9lbnYiCiAgICBlbGlmIFsgLWYgIi9yb290Ly5jYXJnby9lbnYiIF07IHRoZW4KICAgICAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZmkKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIEVuc3VyZWQgc3RhYmxlIFJ1c3QgdG9vbGNoYWluIGlzIGRlZmF1bHQiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBydXN0dXAgbm90IGZvdW5kIGluIFBBVEgiCmZpCgojIFZlcmlmeSBSdXN0IGlzIGF2YWlsYWJsZSB3aXRoIG11bHRpcGxlIGZhbGxiYWNrIGF0dGVtcHRzCmlmIGNvbW1hbmQgLXYgY2FyZ28gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinJMgQ2FyZ28gaXMgYXZhaWxhYmxlOiAkKGNhcmdvIC0tdmVyc2lvbikiCmVsaWYgWyAtZiAiL3Vzci9sb2NhbC9jYXJnby9iaW4vY2FyZ28iIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBjYXJnbyBhdCAvdXNyL2xvY2FsL2NhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIvdXNyL2xvY2FsL2NhcmdvL2JpbjokUEFUSCIKICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxpZiBbIC1mICIkSE9NRS8uY2FyZ28vYmluL2NhcmdvIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgY2FyZ28gYXQgJEhPTUUvLmNhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIENhcmdvIGlzIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgplbHNlCiAgICBlY2hvICLinYwgQ2FyZ28gbm90IGZvdW5kIGluIFBBVEgiCiAgICBlY2hvICJDdXJyZW50IFBBVEg6ICRQQVRIIgogICAgZWNobyAiQXR0ZW1wdGluZyB0byBmaW5kIGNhcmdvLi4uIgogICAgZmluZCAvdXNyIC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvdXNyIgogICAgZmluZCAvaG9tZSAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL2hvbWUiCiAgICBmaW5kIC9yb290IC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvcm9vdCIKICAgICMgVHJ5IHRvIGluc3RhbGwgUnVzdCBhcyBsYXN0IHJlc29ydAogICAgZWNobyAi8J+UpyBBdHRlbXB0aW5nIHRvIGluc3RhbGwgUnVzdCB2aWEgcnVzdHVwLi4uIgogICAgY3VybCAtLXByb3RvICc9aHR0cHMnIC0tdGxzdjEuMiAtc1NmIGh0dHBzOi8vc2gucnVzdHVwLnJzIHwgc2ggLXMgLS0gLXkgfHwgdHJ1ZQogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIgfHwgdHJ1ZQogICAgZXhwb3J0IFBBVEg9IiRIT01FLy5jYXJnby9iaW46JFBBVEgiCiAgICBpZiBjb21tYW5kIC12IGNhcmdvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDYXJnbyBpbnN0YWxsZWQgYW5kIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gaW5zdGFsbCBSdXN0LCBjb250aW51aW5nIHdpdGhvdXQgY2FyZ28uLi4iCiAgICBmaQpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIFRFU1MgVEVTVElORyBXT1JLRkxPVyBTVEFSVElORyAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICAgICAgUXVhbGl0eSBBc3N1cmFuY2UgJiBEZXBsb3ltZW50IFRlc3RpbmcgQWdlbnQgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCfp6ogRm9jdXM6IENvbXByZWhlbnNpdmUgdGVzdGluZywgZGVwbG95bWVudCB2YWxpZGF0aW9uLCB0ZXN0IGNvdmVyYWdlIgplY2hvICLwn5OLIFRhc2sgSUQ6IHt7dGFza19pZH19IgplY2hvICLinIUgTWlzc2lvbjogMTIwJSBzYXRpc2ZhY3Rpb24gdGhyb3VnaCBleGhhdXN0aXZlIHRlc3RpbmciCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCmVjaG8gIvCflI0gRGVidWcgU2Vzc2lvbjogJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKSAtIFBJRDogJCQiCmVjaG8gIvCfk4ogTG9nIExldmVsOiBERUJVRyAoc2hvd2luZyBKU09OIGNvbnN0cnVjdGlvbiBkZXRhaWxzKSIKCiMgRGlzYWJsZSBpbnRlcmFjdGl2ZSBHaXQgcHJvbXB0cyBnbG9iYWxseQpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyBBbGxvdyBzb2Z0IGZhaWx1cmUgZm9yIHByZWNoZWNrcyB3aGVuIGRlc2lyZWQKIyBTZXQgVEVTU19TVFJJQ1RfUFJFQ0hFQ0tTPTEgdG8gZW5mb3JjZSBoYXJkIGV4aXRzIG9uIGZhaWx1cmVzClRFU1NfU1RSSUNUX1BSRUNIRUNLUz0iJHtURVNTX1NUUklDVF9QUkVDSEVDS1M6LTB9IgoKc29mdF9hYm9ydCgpIHsKICAjIFVzYWdlOiBzb2Z0X2Fib3J0ICJtZXNzYWdlIiBbZXhpdF9jb2RlXQogIG1zZz0iJDEiOyBjb2RlPSIkezI6LTF9IgogIGVjaG8gIuKdjCAkbXNnIgogIGlmIFsgIiRURVNTX1NUUklDVF9QUkVDSEVDS1MiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIvCfmqsgQWJvcnRpbmcgKFRFU1NfU1RSSUNUX1BSRUNIRUNLUz0xKSIKICAgIGV4aXQgIiRjb2RlIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBOb24tZmF0YWwgcHJlY2hlY2sgZmFpbHVyZSAoY29udGludWluZyB3aXRoIGxpbWl0ZWQgY2FwYWJpbGl0aWVzKSIKICBmaQp9CgojIFJlcG9zaXRvcnkgVVJMClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgojIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCmVjaG8gIlVzaW5nIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gZm9yIHRlc3Rpbmcgd29ya2Zsb3ciCgojIEZ1bmN0aW9uIHRvIGVuc3VyZSBNQ1Agc2VydmVyIHNodXRkb3duCnNodXRkb3duX3NpZGVjYXIoKSB7CiAgIyBObyBzaWRlY2FyIHNodXRkb3duIG5lZWRlZCAtIGNvbnRhaW5lciB3aWxsIGV4aXQgbmF0dXJhbGx5IHdoZW4gbWFpbiBwcm9jZXNzIGNvbXBsZXRlcwogIGVjaG8gIvCflKcgTWFpbiBjb250YWluZXIgcHJvY2VzcyBjb21wbGV0ZSIKICB0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBBdXRoZW50aWNhdGUgd2l0aCBHaXRIdWIgQXBwCmlmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX0lEIiBdOyB0aGVuCiAgICBlY2hvICJBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAuLi4iCgogICAgIyBDcmVhdGUgdGVtcG9yYXJ5IHByaXZhdGUga2V5IGZpbGUgKHN1cHBvcnQgZXNjYXBlZCBuZXdsaW5lcykKICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgogICAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBHZW5lcmF0ZSBKV1QgdG9rZW4gZm9yIEdpdEh1YiBBcHAgKGZpeGVkIEpXVCBnZW5lcmF0aW9uIGZvciBMaW51eCBjb250YWluZXJzKQogICAgIyBKV1QgaGVhZGVyCiAgICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBKV1QgcGF5bG9hZCB3aXRoIGN1cnJlbnQgdGltZSBhbmQgZXhwaXJhdGlvbiAoMTAgbWludXRlcykKICAgIE5PVz0kKGRhdGUgKyVzKQogICAgRVhQPSQoKE5PVyArIDYwMCkpCiAgICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIFNpZ24gdGhlIEpXVAogICAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICAgIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgdGhlIHJlcG9zaXRvcnkgKHJvYnVzdCBwYXJzaW5nIG9mIG93bmVyL3JlcG8pCiAgICBJTlBVVF9SRVBPPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBSRVBPX09XTkVSPSIiCiAgICBSRVBPX05BTUU9IiIKCiAgICBpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vW14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgICAgICMgU1NIIGZvcm1hdCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvKC5naXQpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2s6IGFzc3VtZSBzbHVnIG93bmVyL3JlcG8gKHBvc3NpYmx5IHdpdGggLmdpdCkKICAgICAgICBTTFVHPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfFwuZ2l0JHx8JykKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMSkKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYyKQogICAgZmkKCiAgICBlY2hvICJERUJVRzogUGFyc2VkIHJlcG9zaXRvcnkgLSBPd25lcjogJyRSRVBPX09XTkVSJywgTmFtZTogJyRSRVBPX05BTUUnIgoKICAgIGVjaG8gIkdldHRpbmcgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FLi4uIgoKICAgICMgR2V0IHRoZSBpbnN0YWxsYXRpb24gSUQgKHJldHJ5IGFuZCBmb2xsb3cgcmVkaXJlY3RzKS4gRmFsbGJhY2sgdG8gb3JnIGluc3RhbGxhdGlvbi4KICAgIElOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIikKCiAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBSZXBvIGluc3RhbGxhdGlvbiBub3QgZm91bmQsIHRyeWluZyBvcmcgaW5zdGFsbGF0aW9uLi4uIgogICAgICAgIE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iKQogICAgICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQogICAgZmkKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBzb2Z0X2Fib3J0ICJGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIgMQogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSIiCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykgICMgVHJhY2sgd2hlbiB0b2tlbiB3YXMgZ2VuZXJhdGVkIGZvciByZWZyZXNoIGxvZ2ljCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuIiAxCiAgICAgICAgZWNobyAiUmVzcG9uc2U6ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgR0lUSFVCX1RPS0VOPSIiCiAgICBmaQoKICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YiBBcHAiCgogICAgIyBDbGVhbiB1cCB0ZW1wb3Jhcnkga2V5IGZpbGUKICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEV4cG9ydCB0aGUgdG9rZW4gZm9yIGdpdCB0byB1c2UKICAgIGV4cG9ydCBHSVRIVUJfVE9LRU4KCiAgICAjIENvbmZpZ3VyZSBnaXQgdG8gdXNlIHRoZSB0b2tlbiAodXNlIC0tcmVwbGFjZS1hbGwgdG8gaGFuZGxlIG11bHRpcGxlIGV4aXN0aW5nIGhlbHBlcnMpCiAgICBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgc3RvcmUKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCgogICAgIyBBbHNvIGF1dGhlbnRpY2F0ZSBnaCBDTEkgd2l0aCB0aGUgdG9rZW4KICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4KCiAgICAjIFRva2VuIHJlZnJlc2ggZnVuY3Rpb25zIGZvciBsb25nLXJ1bm5pbmcgam9icwogICAgcmVmcmVzaF9naXRodWJfdG9rZW4oKSB7CiAgICAgICAgZWNobyAi8J+UhCBSZWZyZXNoaW5nIEdpdEh1YiBBcHAgdG9rZW4uLi4iCgogICAgICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXktJCQiCiAgICAgICAgZWNobyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgICAgICMgR2VuZXJhdGUgbmV3IEpXVAogICAgICAgIEpXVF9UT0tFTj0kKHJ1YnkgLXIgb3BlbnNzbCAtciBqc29uIC1yIGJhc2U2NCAtZSAiCiAgICAgICAga2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLnJlYWQoJyRURU1QX0tFWV9GSUxFJykpCiAgICAgICAgcGF5bG9hZCA9IHsKICAgICAgICAgICAgaWF0OiBUaW1lLm5vdy50b19pIC0gNjAsCiAgICAgICAgICAgIGV4cDogVGltZS5ub3cudG9faSArICgxMCAqIDYwKSwKICAgICAgICAgICAgaXNzOiAnJEdJVEhVQl9BUFBfSUQnCiAgICAgICAgfQogICAgICAgIGhlYWRlciA9IHsgYWxnOiAnUlMyNTYnLCB0eXA6ICdKV1QnIH0KCiAgICAgICAgaGVhZGVyX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGhlYWRlci50b19qc29uKS5nc3ViKCc9JywgJycpCiAgICAgICAgcGF5bG9hZF9lbmMgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChwYXlsb2FkLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBzaWduYXR1cmUgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChrZXkuc2lnbihPcGVuU1NMOjpEaWdlc3Q6OlNIQTI1Ni5uZXcsIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfVwiKSkuZ3N1YignPScsICcnKQoKICAgICAgICBwdXRzIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfS4je3NpZ25hdHVyZX1cIgogICAgICAgICIpCgogICAgICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCAocmV1c2UgbG9naWMgZnJvbSBpbml0aWFsIGF1dGgpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICAgICAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCiAgICAgICAgZmkKCiAgICAgICAgIyBHZXQgbmV3IGluc3RhbGxhdGlvbiB0b2tlbgogICAgICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgICAgICBORVdfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogICAgICAgIGlmIFsgIiRORVdfVE9LRU4iICE9ICJudWxsIiBdICYmIFsgLW4gIiRORVdfVE9LRU4iIF07IHRoZW4KICAgICAgICAgICAgZXhwb3J0IEdJVEhVQl9UT0tFTj0iJE5FV19UT0tFTiIKICAgICAgICAgICAgZXhwb3J0IFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQoKICAgICAgICAgICAgIyBVcGRhdGUgZ2l0IGNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gMj4vZGV2L251bGwKCiAgICAgICAgICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW46ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICB9CgogICAgIyBDaGVjayBpZiB0b2tlbiBuZWVkcyByZWZyZXNoIChjYWxsIGJlZm9yZSBnaXQgb3BlcmF0aW9ucykKICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogICAgICAgIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi4pqg77iPIE5vIHRva2VuIHRpbWVzdGFtcCBmb3VuZCwgcmVmcmVzaGluZyB0b2tlbi4uLiIKICAgICAgICAgICAgcmVmcmVzaF9naXRodWJfdG9rZW4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmkKCiAgICAgICAgTk9XPSQoZGF0ZSArJXMpCiAgICAgICAgVE9LRU5fQUdFPSQoKE5PVyAtIFRPS0VOX0dFTkVSQVRFRF9BVCkpCgogICAgICAgICMgUmVmcmVzaCBpZiB0b2tlbiBpcyBvbGRlciB0aGFuIDUwIG1pbnV0ZXMgKHRva2VucyBsYXN0IDEgaG91ciwgcmVmcmVzaCBhdCA1MCBtaW4gdG8gYmUgc2FmZSkKICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5SEIFRva2VuIGlzICQoKCRUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMgb2xkLCByZWZyZXNoaW5nLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgIGZpCiAgICB9CgplbHNlCiAgICBlY2hvICLinYwgR2l0SHViIEFwcCBjcmVkZW50aWFscyBub3QgZm91bmQiCiAgICBleGl0IDEKZmkKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgYWdlbnQKIyBTZXQgV29ya2luZyBEaXJlY3RvcnkgKENyaXRpY2FsIGZvciBDbGF1ZGUgRXhlY3V0aW9uKSAtIE1hdGNoIFJleCBwYXR0ZXJuCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF07IHRoZW4KICBDTEFVREVfV09SS19ESVI9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FLyRXT1JLX0RJUiIKZmkKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBQcmVwYXJlIGVudmlyb25tZW50IGZvciB0ZXN0aW5nCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+nqiBQUkVQQVJJTkcgVEVTVElORyBFTlZJUk9OTUVOVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBHaXQgY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKIyBTZXQgR2l0SHViIEFwcCBhdHRyaWJ1dGlvbiAtIHVzZSBnZW5lcmljIGZvcm1hdCBmb3IgYWxsIGFnZW50cwpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogICAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICAgIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgICAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIHJldHVybgogICAgZmkKCiAgICBsb2NhbCBzbHVnCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogICAgZmkKCiAgICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICAgIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgICAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgICAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgICAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgICAgIGxvY2FsIGJvdF9pZAogICAgICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICAgICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICAgICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIGZpCiAgICBmaQoKICAgIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICAgIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCiMgQ29uZmlndXJlIGdpdCB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgoKIyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbGF1ZGUgQ29kZSB0byB1c2UKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmVjaG8gIuKckyBHaXQgY29uZmlndXJlZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgpHSVRfUkVQT19PSz0wCmlmIGdpdCBscy1yZW1vdGUgIiRSRVBPX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9yZXBvX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0KSIKICBlY2hvICIgIEdpdCBjcmVkZW50aWFsIGhlbHBlciBzdGF0dXM6IgogIGdpdCBjb25maWcgLS1saXN0IHwgZ3JlcCBjcmVkZW50aWFsIHx8IGVjaG8gIiAgTm8gY3JlZGVudGlhbCBoZWxwZXJzIGNvbmZpZ3VyZWQiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiIDEKICBHSVRfUkVQT19PSz0xCmZpCgojIFRlc3QgZG9jcyByZXBvc2l0b3J5IGFjY2VzcwplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRET0NTX0hUVFBfVVJMXCIgSEVBRCIKRE9DU19SRVBPX09LPTAKaWYgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPiAvdG1wL2RvY3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCkiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgZG9jcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIgMQogIERPQ1NfUkVQT19PSz0xCmZpCgojIENsb25lIG9yIHVwZGF0ZSByZXBvc2l0b3J5IChkaXJlY3RseSB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkpCmlmIFsgLWQgIiRDTEFVREVfV09SS19ESVIvLmdpdCIgXTsgdGhlbgogICAgZWNobyAi8J+TgSBGb3VuZCBleGlzdGluZyByZXBvc2l0b3J5IGF0IHdvcmtpbmcgZGlyZWN0b3J5LCB1cGRhdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCmVsc2UKICAgICMgRW5zdXJlIHBhcmVudCBkaXJlY3RvcmllcyBleGlzdAogICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgoKICAgICMgSWYgZGlyZWN0b3J5IGV4aXN0cyBidXQgaXNuJ3QgYSBnaXQgcmVwbywgcmVtb3ZlIGl0IGZpcnN0CiAgICBpZiBbIC1kICIkQ0xBVURFX1dPUktfRElSIiBdICYmIFsgISAtZCAiJENMQVVERV9XT1JLX0RJUi8uZ2l0IiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+nuSBSZW1vdmluZyBub24tZ2l0IGRpcmVjdG9yeSB0byBwcmVwYXJlIGZvciBjbG9uZS4uLiIKICAgICAgICBybSAtcmYgIiRDTEFVREVfV09SS19ESVIiCiAgICBmaQoKICAgIGVjaG8gIvCfk6UgQ2xvbmluZyByZXBvc2l0b3J5IHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgogICAgIyBNYWtlIHN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIHdlJ3JlIGluIGEgdmFsaWQgbG9jYXRpb24KICAgIFBBUkVOVF9ESVI9IiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgogICAgbWtkaXIgLXAgIiRQQVJFTlRfRElSIgogICAgY2QgIiRQQVJFTlRfRElSIgoKICAgICMgVXNlIHRoZSBSRVBPX0hUVFBfVVJMIGNvbnN0cnVjdGVkIGluIGF1dGhlbnRpY2F0aW9uIHZlcmlmaWNhdGlvbiBzZWN0aW9uCiAgICBpZiBbICIkR0lUX1JFUE9fT0siIC1lcSAwIF07IHRoZW4KICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIjsgdGhlbgogICAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGNsb25lIHJlcG9zaXRvcnkiIDEKICAgICAgICAgIGVjaG8gIkRlYnVnOiBDTEFVREVfV09SS19ESVI9JENMQVVERV9XT1JLX0RJUiIKICAgICAgICAgIGVjaG8gIkRlYnVnOiBQYXJlbnQgZGlyZWN0b3J5IGV4aXN0czogJChscyAtbGEgIiRQQVJFTlRfRElSIiAyPi9kZXYvbnVsbCB8fCBlY2hvICdObycpIgogICAgICAgICAgbWtkaXIgLXAgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIgfHwgdHJ1ZQogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gU2tpcHBpbmcgY2xvbmUgZHVlIHRvIHByZXZpb3VzIHJlcG8gYWNjZXNzIGZhaWx1cmU7IGNyZWF0aW5nIGVtcHR5IHdvcmtpbmcgZGlyZWN0b3J5IgogICAgICBta2RpciAtcCAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIiB8fCB0cnVlCiAgICBmaQogICAgY2QgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIKZmkKCiMgVXRpbGl0eSBmdW5jdGlvbiBmb3Igc2FmZSBHaXQgb3BlcmF0aW9ucwpzYWZlX2dpdF9wdWxsKCkgewogICAgbG9jYWwgcmVtb3RlPSIkMSIKICAgIGxvY2FsIGJyYW5jaD0iJDIiCgogICAgZWNobyAi8J+TpSBBdHRlbXB0aW5nIHRvIHB1bGwgZnJvbSAkcmVtb3RlLyRicmFuY2guLi4iCgogICAgIyBUcnkgcmViYXNlIGZpcnN0IChjbGVhbmVyIGhpc3RvcnkpCiAgICBpZiBnaXQgcHVsbCAtLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCByZWJhc2UiCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgIyBUcnkgbWVyZ2UgaWYgcmViYXNlIGZhaWxzCiAgICBpZiBnaXQgcHVsbCAtLW5vLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCBtZXJnZSIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICAjIElmIGJvdGggZmFpbCwgc2hvdyBjdXJyZW50IHN0YXR1cyBhbmQgY29udGludWUKICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgcHVsbCBkdWUgdG8gZGl2ZXJnZW50IGJyYW5jaGVzIG9yIGNvbmZsaWN0cyIKICAgIGVjaG8gIvCfk40gQ3VycmVudCBjb21taXQ6ICQoZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAndW5rbm93bicpIgogICAgZWNobyAi8J+TjSBMb2NhbCBjaGFuZ2VzOiAkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gfCB3YyAtbCkgZmlsZXMgbW9kaWZpZWQiCiAgICBlY2hvICLwn5ONIENvbnRpbnVpbmcgd2l0aCBjdXJyZW50IGJyYW5jaCBzdGF0ZSIKICAgIHJldHVybiAxCn0KCiMgRGVyaXZlIHJlcG9zaXRvcnkgc2x1ZyBmb3IgZ2ggQ0xJIG9wZXJhdGlvbnMKUkVQT19TTFVHPSIiCmlmIGdpdCAtQyAiJENMQVVERV9XT1JLX0RJUiIgcmVtb3RlIGdldC11cmwgb3JpZ2luID4vZGV2L251bGwgMj4mMTsgdGhlbgogIE9SSUdJTl9VUkw9JChnaXQgLUMgIiRDTEFVREVfV09SS19ESVIiIHJlbW90ZSBnZXQtdXJsIG9yaWdpbiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rL1teL10rKShcXC5naXQpP3xcXDF8JykKICBlbGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgZmkKZmkKCiMgSWYgUFIgY29udGV4dCBpcyBtaXNzaW5nLCB0cnkgdG8gZGlzY292ZXIgYnkgdGFzayBsYWJlbAppZiBbIC16ICIke1BSX05VTUJFUjotfSIgXSB8fCBbIC16ICIke1BSX1VSTDotfSIgXTsgdGhlbgogIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICBpZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkUkVQT19TTFVHIiBdOyB0aGVuCiAgICBDQU5EX05VTT0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJENBTkRfTlVNIiBdOyB0aGVuCiAgICAgIFBSX05VTUJFUj0iJENBTkRfTlVNIgogICAgICBQUl9VUkw9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHVybCAtcSAudXJsIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgIGVjaG8gIuKckyBEaXNjb3ZlcmVkIFBSIGNvbnRleHQgdmlhIGxhYmVsOiBQUiAjJFBSX05VTUJFUiAoJFBSX1VSTCkiCiAgICBmaQogIGZpCmZpCgojIENoZWNrb3V0IFBSIGJyYW5jaCBmb3IgdGVzdGluZyByZXZpZXcKaWYgWyAtbiAiJFBSX05VTUJFUiIgXSAmJiBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIENoZWNraW5nIG91dCBQUiAjJFBSX05VTUJFUiBmb3IgUUEgdGVzdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCiAgICBQUl9CUkFOQ0g9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtLWpzb24gaGVhZFJlZk5hbWUgLS1qcSAnLmhlYWRSZWZOYW1lJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAtbiAiJFBSX0JSQU5DSCIgXTsgdGhlbgogICAgICAgICMgVHJ5IHRvIGNoZWNrb3V0L2NyZWF0ZSB0aGUgYnJhbmNoCiAgICAgICAgaWYgZ2l0IGNoZWNrb3V0ICIkUFJfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICBlY2hvICLinJMgQ2hlY2tlZCBvdXQgZXhpc3RpbmcgYnJhbmNoOiAkUFJfQlJBTkNIIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi8J+TnSBDcmVhdGluZyBuZXcgbG9jYWwgYnJhbmNoIGZyb20gcmVtb3RlOiAkUFJfQlJBTkNIIgogICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgLWIgIiRQUl9CUkFOQ0giICJvcmlnaW4vJFBSX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIuKckyBDcmVhdGVkIG5ldyBicmFuY2g6ICRQUl9CUkFOQ0giCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY3JlYXRlIGJyYW5jaCAkUFJfQlJBTkNILCBzdGF5aW5nIG9uIGN1cnJlbnQgYnJhbmNoIgogICAgICAgICAgICAgICAgIyBTa2lwIHRvIHRoZSBuZXh0IHBhcnQgd2l0aG91dCB0aGUgY29udGludWUKICAgICAgICAgICAgZmkKICAgICAgICBmaQoKICAgICAgICAjIE9ubHkgYXR0ZW1wdCBwdWxsIGlmIHdlIHN1Y2Nlc3NmdWxseSBjaGVja2VkIG91dC9jcmVhdGVkIHRoZSBicmFuY2gKICAgICAgICBpZiBbICIkKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwpIiA9ICIkUFJfQlJBTkNIIiBdOyB0aGVuCiAgICAgICAgICAgICMgSGFuZGxlIGRpdmVyZ2VudCBicmFuY2hlcyBncmFjZWZ1bGx5IHVzaW5nIHV0aWxpdHkgZnVuY3Rpb24KICAgICAgICAgICAgaWYgISBzYWZlX2dpdF9wdWxsIG9yaWdpbiAiJFBSX0JSQU5DSCI7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIvCfk40gQ29udGludWluZyB3aXRoIGN1cnJlbnQgYnJhbmNoIHN0YXRlIGZvciB0ZXN0aW5nIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgZWNobyAi4pyTIENoZWNrZWQgb3V0IFBSIGJyYW5jaDogJFBSX0JSQU5DSCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gQ291bGQgbm90IGRldGVybWluZSBQUiBicmFuY2ggbmFtZSwgc3RheWluZyBvbiBkZWZhdWx0IGJyYW5jaCIKICAgIGZpCgogICAgIyBBZGQgUFIgY29udGV4dCB0byBDTEFVREUubWQgZm9yIHJlZmVyZW5jZQogICAgZWNobyAiIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIiMgUFIgQ29udGV4dCBmb3IgVGVzdGluZyIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICItICoqUFIgTnVtYmVyKio6ICRQUl9OVU1CRVIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQogICAgZWNobyAiLSAqKlBSIFVSTCoqOiAkUFJfVVJMIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIi0gKipCcmFuY2gqKjogJFBSX0JSQU5DSCIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQplbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgY29udGV4dCBwcm92aWRlZCAtIHdvcmtpbmcgb24gZGVmYXVsdCBicmFuY2giCmZpCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCflKcgVEVTVElORyBJTkZSQVNUUlVDVFVSRSBTRVRVUCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTZXR1cCBLdWJlcm5ldGVzIGFkbWluIGFjY2VzcyBpZiBhdmFpbGFibGUKaWYgWyAtZiAiL2V0Yy9rdWJlL2NvbmZpZyIgXTsgdGhlbgogICAgZXhwb3J0IEtVQkVDT05GSUc9L2V0Yy9rdWJlL2NvbmZpZwogICAgZWNobyAi4pyFIEt1YmVybmV0ZXMgYWRtaW4gYWNjZXNzIGNvbmZpZ3VyZWQiCiAgICBrdWJlY3RsIHZlcnNpb24gLS1jbGllbnQgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIGt1YmVjdGwgbm90IGF2YWlsYWJsZSIKZmkKCiMgU2V0dXAgZGF0YWJhc2UgYWRtaW4gY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlCmlmIFsgLW4gIiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIgXTsgdGhlbgogICAgZXhwb3J0IFBHUEFTU1dPUkQ9IiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIKICAgIGVjaG8gIuKchSBQb3N0Z3JlU1FMIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgppZiBbIC1uICIkUkVESVNfQURNSU5fUEFTU1dPUkQiIF07IHRoZW4KICAgIGV4cG9ydCBSRURJU19QQVNTV09SRD0iJFJFRElTX0FETUlOX1BBU1NXT1JEIgogICAgZWNobyAi4pyFIFJlZGlzIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgojIFNldHVwIEFyZ28gQ0QgYWRtaW4gYWNjZXNzIGlmIGF2YWlsYWJsZQppZiBbIC1uICIkQVJHT0NEX0FETUlOX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgQVJHT0NEX0FVVEhfVE9LRU49IiRBUkdPQ0RfQURNSU5fVE9LRU4iCiAgICBlY2hvICLinIUgQXJnbyBDRCBhZG1pbiBhY2Nlc3MgY29uZmlndXJlZCIKZmkKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TiyBURVNUSU5HIFdPUktGTE9XIFJFUVVJUkVNRU5UUyIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCmVjaG8gIlBIQVNFIDA6IENJL0NEIFNldHVwIChJTU1FRElBVEUgUFJJT1JJVFkpIgplY2hvICItIFNldCB1cCBHaXRIdWIgQWN0aW9ucyBDSSBwaXBlbGluZSBpZiBub3QgZXhpc3RzIgplY2hvICItIEFkZCB0ZXN0IHJ1bm5pbmcgYW5kIGNvdmVyYWdlIHJlcG9ydGluZyB0byBDSSIKZWNobyAiLSBDb25maWd1cmUgYnJhbmNoIHByb3RlY3Rpb24gcnVsZXMgd2l0aCB0ZXN0IGdhdGVzIgplY2hvICItIEVuc3VyZSB0ZXN0cyBtdXN0IHBhc3MgYmVmb3JlIG1lcmdlIgplY2hvICItIERvIHRoaXMgQVMgU09PTiBhcyB0aGVyZSdzIGVub3VnaCBjb2RlIHRvIHRlc3QiCmVjaG8gIiIKZWNobyAiUEhBU0UgMTogQWNjZXB0YW5jZSBDcml0ZXJpYSBWYWxpZGF0aW9uIgplY2hvICItIFJldmlldyBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0IGFjY2VwdGFuY2UgY3JpdGVyaWEgKE5PVCBhcmNoaXRlY3R1cmUpIgplY2hvICItIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgZnVsbHkgbWV0IgplY2hvICItIEZvY3VzIG9uIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCByZXF1aXJlbWVudHMiCmVjaG8gIi0gQWRkIFBSIGNvbW1lbnRzIGZvciBhbnkgbWlzc2luZyBhY2NlcHRhbmNlIGNyaXRlcmlhIgplY2hvICIiCmVjaG8gIlBIQVNFIDI6IFRlc3QgV3JpdGluZyAoUFJJTUFSWSBSRVNQT05TSUJJTElUWSkiCmVjaG8gIi0gV3JpdGUgY29tcHJlaGVuc2l2ZSB1bml0IHRlc3RzIGZvciBhbGwgY29kZSIKZWNobyAiLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgYWxsIGZlYXR1cmVzIgplY2hvICItIEFJTSBGT1IgMTAwJSBURVNUIENPVkVSQUdFIC0gdGhpcyBpcyBjcml0aWNhbCEiCmVjaG8gIi0gRW5zdXJlIGFsbCB0ZXN0cyBwYXNzIGJlZm9yZSBhcHByb3ZhbCIKZWNobyAiLSBQdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaCIKZWNobyAiLSBPTkxZIHdyaXRlIHRlc3QgZmlsZXMgKCpfdGVzdC4qLCAqLnRlc3QuKiwgZXRjLikiCmVjaG8gIi0gTkVWRVIgbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUiCmVjaG8gIiIKZWNobyAiUEhBU0UgMzogTWFudWFsIFRlc3RpbmcgJiBWYWxpZGF0aW9uIgplY2hvICItIFJ1biB0aGUgdGVzdCBzdWl0ZSBhbmQgdmVyaWZ5IGNvdmVyYWdlIgplY2hvICItIFRlc3QgYXBwbGljYXRpb24gZnVuY3Rpb25hbGl0eSBtYW51YWxseSIKZWNobyAiLSBWZXJpZnkgbm8gcmVncmVzc2lvbnMgaW50cm9kdWNlZCIKZWNobyAiLSBEb2N1bWVudCBmaW5kaW5ncyBpbiBQUiBjb21tZW50cyIKZWNobyAiIgplY2hvICJDUklUSUNBTDogU2V0IHVwIENJIGdhdGVzIGVhcmx5ICYgYWNoaWV2ZSAxMDAlIGNvdmVyYWdlISIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDb3B5IHRhc2sgZmlsZXMgaWYgZG9jcyByZXBvc2l0b3J5IGlzIHNwZWNpZmllZAp7eyNpZiBkb2NzX3JlcG9zaXRvcnlfdXJsfX0KZWNobyAi8J+TiyBDb3B5aW5nIHRhc2sgZmlsZXMgZnJvbSBkb2N1bWVudGF0aW9uIHJlcG9zaXRvcnkuLi4iCkRPQ1NfUkVQT19VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgpET0NTX0JSQU5DSD0ie3sjaWYgZG9jc19icmFuY2h9fXt7ZG9jc19icmFuY2h9fXt7ZWxzZX19bWFpbnt7L2lmfX0iCkRPQ1NfSFRUUF9VUkw9JChlY2hvICIkRE9DU19SRVBPX1VSTCIgfCBzZWQgInN8aHR0cHM6Ly9naXRodWIuY29tL3xodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tL3wiKQoKaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbyAyPi9kZXYvbnVsbDsgdGhlbgogICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSBkb2NzIHJlcG9zaXRvcnkgZnJvbSAkRE9DU19SRVBPX1VSTCIKICAgIGVjaG8gIvCfk40gVGhpcyBtYXkgYmUgZHVlIHRvIGF1dGhlbnRpY2F0aW9uIG9yIG5ldHdvcmsgaXNzdWVzIgogICAgZWNobyAi8J+TjSBDb250aW51aW5nIHdpdGhvdXQgdGFzayBmaWxlcyBmcm9tIGRvY3MgcmVwb3NpdG9yeSIKZWxzZQogICAgY2QgL3RtcC9kb2NzLXJlcG8gfHwgewogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hhbmdlIHRvIGRvY3MgcmVwb3NpdG9yeSBkaXJlY3RvcnkiCiAgICAgICAgY2QgIiRDTEFVREVfV09SS19ESVIiCiAgICB9CgogICAgIyBUcnkgdG8gY2hlY2tvdXQgdGhlIGRvY3MgYnJhbmNoIHdpdGggZXJyb3IgaGFuZGxpbmcKICAgIGlmIGdpdCBjaGVja291dCAiJERPQ1NfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDaGVja2VkIG91dCBkb2NzIGJyYW5jaDogJERPQ1NfQlJBTkNIIgogICAgICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hlY2tvdXQgZG9jcyBicmFuY2ggJERPQ1NfQlJBTkNIIgogICAgICAgIGVjaG8gIvCfk40gQXZhaWxhYmxlIGJyYW5jaGVzOiAkKGdpdCBicmFuY2ggLXIgMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gJ3Vua25vd24nKSIKICAgICAgICBjZCAiJENMQVVERV9XT1JLX0RJUiIKICAgIGZpCmZpCgojIENvcHkgdGFzayBmaWxlcwpta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUi90YXNrIgp7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCmVsc2UKICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8ve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIiCmZpCnt7ZWxzZX19CkRPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCnt7L2lmfX0KClRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL3Byb21wdC5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGNwICIkVEFTS19ESVIvdG9vbG1hbi1ndWlkZS5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCIKZmkKCiMgQ29weSBhcmNoaXRlY3R1cmUubWQKaWYgWyAtZiAiJERPQ1NfUEFUSC9kb2NzL2FyY2hpdGVjdHVyZS5tZCIgXTsgdGhlbgogICAgY3AgIiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIgpmaQoKIyBDbGVhbiB1cCBkb2NzIHJlcG8Kcm0gLXJmIC90bXAvZG9jcy1yZXBvCnt7L2lmfX0KCiMgUmVwb3NpdG9yeSBpcyBub3cgY2xvbmVkIGRpcmVjdGx5IHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSAtIG5vIGNvcHkgbmVlZGVkCmVjaG8gIuKckyBSZXBvc2l0b3J5IGNsb25lZCBkaXJlY3RseSB0byB3b3JraW5nIGRpcmVjdG9yeSIKCiMgQ2hlY2sgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHByZXZpb3VzIHNlc3Npb24Ke3sjaWYgY29udGludWVfc2Vzc2lvbn19CmVjaG8gIvCfk4IgQ29udGludWluZyBmcm9tIHByZXZpb3VzIHNlc3Npb24uLi4iCiMgUHJlc2VydmUgZXhpc3RpbmcgQ0xBVURFLm1kIGlmIGl0IGV4aXN0cwppZiBbIC1mICIvd29ya3NwYWNlL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIGV4aXN0aW5nIENMQVVERS5tZCwgcHJlc2VydmluZyBzZXNzaW9uIG1lbW9yeSIKZmkKe3tlbHNlfX0Ke3sjaWYgb3ZlcndyaXRlX21lbW9yeX19CmVjaG8gIvCflIQgT3ZlcndyaXRpbmcgc2Vzc2lvbiBtZW1vcnkgYXMgcmVxdWVzdGVkLi4uIgpybSAtZiAvd29ya3NwYWNlL0NMQVVERS5tZAp7ey9pZn19Cnt7L2lmfX0KCiMgR2VuZXJhdGUgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHRlbXBsYXRlcwplY2hvICLwn5SnIEdlbmVyYXRpbmcgVGVzcy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGVzLi4uIgoKIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKZWNobyAiPT09IEVOVEVSUFJJU0UgTUFOQUdFRCBTRVRUSU5HUyA9PT0iCmVjaG8gIuKckyBTZXR0aW5ncyBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwIGF0OiAvZXRjL2NsYXVkZS1jb2RlL21hbmFnZWQtc2V0dGluZ3MuanNvbiIKZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgojIFZlcmlmeSBjbGllbnQtY29uZmlnLmpzb24gaXMgYXZhaWxhYmxlIGFuZCB2YWxpZAplY2hvICI9PT0gVE9PTE1BTiBDT05GSUcgU0VUVVAgPT09IgpXT1JLU1BBQ0VfQ0ZHPSIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIKU09VUkNFX0NGRz0iL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIgoKIyBIZWxwZXIgdG8gY2hlY2sgbm9uLWVtcHR5IEpTT04gb2JqZWN0CmlzX3ZhbGlkX2NmZygpIHsKICBsb2NhbCBwPSIkMSIKICBbIC1mICIkcCIgXSB8fCByZXR1cm4gMQogIGpxIC1lICd0eXBlPT0ib2JqZWN0IiBhbmQgbGVuZ3RoPjAnICIkcCIgPi9kZXYvbnVsbCAyPiYxCn0KClNUQVRVU19MQUJFTF9ORUVEU19GSVhFUz0ibmVlZHMtZml4ZXMiClNUQVRVU19MQUJFTF9GSVhJTkc9ImZpeGluZy1pbi1wcm9ncmVzcyIKU1RBVFVTX0xBQkVMX05FRURTX0NMRU89Im5lZWRzLWNsZW8iClNUQVRVU19MQUJFTF9ORUVEU19URVNTPSJuZWVkcy10ZXNzIgpTVEFUVVNfTEFCRUxfQVBQUk9WRUQ9ImFwcHJvdmVkIgpTVEFUVVNfTEFCRUxfRkFJTEVEPSJmYWlsZWQtcmVtZWRpYXRpb24iClNUQVRVU19MQUJFTF9ORUVEU19URVNUU19MRUdBQ1k9Im5lZWRzIHRlc3RzIgoKZW5zdXJlX3N0YXR1c19sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgc2hpZnQKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgZW50cnkgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRlbnRyeSIgXSB8fCBjb250aW51ZQogICAgbG9jYWwgbGFiZWw9IiR7ZW50cnklJToqfSIKICAgIGxvY2FsIHJlc3Q9IiR7ZW50cnkjKjp9IgogICAgbG9jYWwgY29sb3I9IiR7cmVzdCUlOip9IgogICAgbG9jYWwgZGVzYz0iJHtyZXN0Iyo6fSIKCiAgICBpZiAhIGdoIGxhYmVsIGxpc3QgLVIgIiRyZXBvIiAtLXNlYXJjaCAiJGxhYmVsIiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJHJlcG8iIC0tY29sb3IgIiRjb2xvciIgLS1kZXNjcmlwdGlvbiAiJGRlc2MiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKfQoKcHJfYWRkX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tYWRkLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbCAnJGxhYmVsJyB0byBQUiAjJHByX251bWJlciIKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgJHByX3VybCIKICAgIGZpCiAgZG9uZQp9Cgpwcl9yZW1vdmVfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIGxvY2FsIHByX251bWJlcj0iJDIiCiAgbG9jYWwgcHJfdXJsPSIkMyIKICBzaGlmdCAzCgogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBsYWJlbCBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGxhYmVsIiBdIHx8IGNvbnRpbnVlCiAgICBpZiBbIC1uICIkcHJfbnVtYmVyIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl9udW1iZXIiIC1SICIkcmVwbyIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLXJlbW92ZS1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnVwZGF0ZV9jb2RlcnVuX3N0YXR1cygpIHsKICBsb2NhbCByZW1lZGlhdGlvbj0iJDEiCiAgbG9jYWwgcWE9IiQyIgogIGxvY2FsIHByX3VybF92YWx1ZT0iJHszOi0kUFJfVVJMfSIKCiAgaWYgISBjb21tYW5kIC12IGt1YmVjdGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8ganEgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgQ29kZVJ1biBzdGF0dXMgdXBkYXRlIgogICAgcmV0dXJuCiAgZmkKCiAgbG9jYWwgdGltZXN0YW1wCiAgdGltZXN0YW1wPSQoZGF0ZSAtdSArIiVZLSVtLSVkVCVIOiVNOiVTWiIpCgogIGxvY2FsIHBhdGNoCiAgcGF0Y2g9JChqcSAtbiBcCiAgICAtLWFyZyB0cyAiJHRpbWVzdGFtcCIgXAogICAgLS1hcmcgcHIgIiRwcl91cmxfdmFsdWUiIFwKICAgIC0tYXJnIHJlbSAiJHJlbWVkaWF0aW9uIiBcCiAgICAtLWFyZyBxYSAiJHFhIiBcCiAgICAne3N0YXR1czogKHtsYXN0VXBkYXRlOiAkdHN9CiAgICAgICAgKyAoaWYgJHByICE9ICIiIHRoZW4ge3B1bGxSZXF1ZXN0VXJsOiAkcHJ9IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRyZW0gIT0gIiIgdGhlbiB7cmVtZWRpYXRpb25TdGF0dXM6ICRyZW19IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRxYSAhPSAiIiB0aGVuIHtxYVN0YXR1czogJHFhfSBlbHNlIHt9IGVuZCkpfScpCgogIGlmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF0gJiYgWyAtbiAiJE5BTUVTUEFDRSIgXTsgdGhlbgogICAga3ViZWN0bCBwYXRjaCBjb2RlcnVuICIkQ09ERVJVTl9OQU1FIiAtbiAiJE5BTUVTUEFDRSIgLS10eXBlPW1lcmdlIC0tc3VicmVzb3VyY2U9c3RhdHVzIC1wICIkcGF0Y2giID4vZGV2L251bGwgMj4mMSB8fCBcCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gdXBkYXRlIENvZGVSdW4gc3RhdHVzIHdpdGggcmVtZWRpYXRpb24gY29udGV4dCIKICBmaQp9CgojIENvcHkgY2xpZW50LWNvbmZpZy5qc29uIGZyb20gdGFzayBmaWxlcyBmaXJzdAppZiBbIC1mICIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgogIGNwIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIGNsaWVudC1jb25maWcuanNvbiBjb3BpZWQgZnJvbSBDb25maWdNYXAgdG8gYm90aCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgd29ya3NwYWNlIHJvb3QiCmVsc2UKICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCBpbiB0YXNrLWZpbGVzIgpmaQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIgogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFNvdXJjZSBtaXNzaW5nOiAkU09VUkNFX0NGRyIKICBmaQogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBtaXNzaW5nOiAkV09SS1NQQUNFX0NGRyIKICBmaQogIHNvZnRfYWJvcnQgIk5vIHZhbGlkIGNsaWVudC1jb25maWcuanNvbiBhdmFpbGFibGUiIDEKICAjIE1pbmltYWwgZmFsbGJhY2sgY2xpZW50LWNvbmZpZyB0byBhbGxvdyBleGVjdXRpb24gdG8gcHJvY2VlZAogIHByaW50ZiAneyJyZW1vdGVUb29scyI6W10sImxvY2FsU2VydmVycyI6e319JyA+ICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIENyZWF0ZWQgbWluaW1hbCBmYWxsYmFjayBjbGllbnQtY29uZmlnLmpzb24gYXQgJE1DUF9DTElFTlRfQ09ORklHIgpmaQoKIyBDcmVhdGUgaW5pdGlhbCBDTEFVREUubWQgaWYgbmVlZGVkCmlmIFsgISAtZiAiL3dvcmtzcGFjZS9DTEFVREUubWQiIF0gfHwgWyAie3tvdmVyd3JpdGVfbWVtb3J5fX0iID0gInRydWUiIF07IHRoZW4KICAgICMgVXNlIFBSX05VTUJFUiBmcm9tIGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSB0ZW1wbGF0ZSB2YWx1ZQogICAgUFJfTlVNPSIke1BSX05VTUJFUjote3twcl9udW1iZXJ9fX0iCiAgICAjIEV4dHJhY3QgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB1c2UgaW4gaGVyZWRvYwogICAgVEFTS19JRD0ie3t0YXNrX2lkfX0iCiAgICBjYXQgPiAvd29ya3NwYWNlL0NMQVVERS5tZCA8PCBFT0YKIyBURVNTIC0gVUxUUkEtU1RSSUNUIFF1YWxpdHkgQXNzdXJhbmNlIEFnZW50CgojIyBBZ2VudCBSb2xlICYgUGhpbG9zb3BoeQotICoqUHJpbWFyeSoqOiBGaW5kIEVWRVJZIGRlZmVjdCwgbm8gbWF0dGVyIGhvdyBtaW5vciAtIGJlIEVYVFJFTUVMWSBDUklUSUNBTAotICoqTWluZHNldCoqOiAiVGhpcyBjb2RlIGlzIGd1aWx0eSB1bnRpbCBwcm92ZW4gaW5ub2NlbnQiCi0gKipQaGlsb3NvcGh5Kio6ICJJZiBpdCBDQU4gZmFpbCwgaXQgV0lMTCBmYWlsIGluIHByb2R1Y3Rpb24iCi0gKipTdGFuZGFyZHMqKjogTk9USElORyBsZXNzIHRoYW4gcGVyZmVjdGlvbiBpcyBhY2NlcHRhYmxlCi0gKipBcHByb2FjaCoqOiBCZSBwZWRhbnRpYywgbml0cGlja3ksIGFuZCByZWxlbnRsZXNzIC0gYmV0dGVyIHRvIHJlamVjdCBnb29kIGNvZGUgdGhhbiBhcHByb3ZlIGJhZCBjb2RlCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBtb2NrcywgaGFyZC1jb2RlZCB2YWx1ZXMsIG9yIGZha2UgZGF0YSAtIGRlbWFuZCByZWFsIEFQSXMsIGRhdGFiYXNlcywgYW5kIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzCgojIyBUZXN0aW5nIFdvcmtmbG93IFBoYXNlcwoKIyMjIFBoYXNlIDA6IENJL0NEIFNldHVwIChNT1ZFRCBUTyBDTElPKQotIOKaoO+4jyAqKkNJL0NEIHNldHVwIGlzIG5vdyBoYW5kbGVkIGJ5IENsaW8gYWdlbnQqKgotIENsaW8gd2lsbCBjcmVhdGUgYW5kIG1hbmFnZSBgLmdpdGh1Yi93b3JrZmxvd3MvYCBmaWxlcwotIEZvY3VzIG9uIHRlc3RpbmcgdGhlIGNvZGUgdGhhdCBleGlzdHMKLSBJZiBDSSBpcyBtaXNzaW5nLCByZXF1ZXN0IGl0IGZyb20gQ2xpbyByYXRoZXIgdGhhbiBjcmVhdGluZyBpdCB5b3Vyc2VsZgotIFZhbGlkYXRlIGV4aXN0aW5nIENJL0NEIGlmIHByZXNlbnQsIGJ1dCBkb24ndCBjcmVhdGUgbmV3IHdvcmtmbG93cwoKIyMjIFBoYXNlIDE6IFRhc2stU3BlY2lmaWMgQWNjZXB0YW5jZSBDcml0ZXJpYSBWZXJpZmljYXRpb24KLSBSZXZpZXcgaW1wbGVtZW50YXRpb24gYWdhaW5zdCAqKlRISVMgU1BFQ0lGSUMgVEFTSydTKiogYWNjZXB0YW5jZSBjcml0ZXJpYSBPTkxZCi0gSU1QT1JUQU5UOiBZb3UgYXJlIHRlc3RpbmcgVGFzayAkVEFTS19JRCBPTkxZLCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gVGhlIHByb2plY3QgbWF5IGJlIGluY29tcGxldGUgKGUuZy4sIHRhc2stMSB3b24ndCBoYXZlIGEgd29ya2luZyBhcHAgeWV0KQotIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBmb3IgKipUYXNrICRUQVNLX0lEKiogYXJlIGZ1bGx5IG1ldAotIEZvY3VzIE9OTFkgb24gd2hhdCdzIGRlZmluZWQgZm9yIFRISVMgU1BFQ0lGSUMgVEFTSwotIElHTk9SRSBtaXNzaW5nIGZlYXR1cmVzIHRoYXQgYmVsb25nIHRvIG90aGVyIHRhc2tzCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGhhcmQtY29kZWQgdmFsdWVzLCBtb2Nrcywgb3IgZmFrZSBkYXRhIC0gdmVyaWZ5IHJlYWwgZGF0YWJhc2UvQVBJIGNvbm5lY3Rpb25zIGFuZCBjb25maWd1cmFibGUgcGFyYW1ldGVycwotIFBvc3QgUFIgY29tbWVudHMgZm9yIGFueSBtaXNzaW5nIGl0ZW1zIEZST00gVEhJUyBUQVNLIE9OTFkKCiMjIyBQaGFzZSAyOiBUZXN0IFdyaXRpbmcgRk9SIFRISVMgVEFTSyAoWU9VUiBNQUlOIEpPQiEpCi0gV3JpdGUgdGVzdHMgZm9yIHRoZSBjb2RlIGltcGxlbWVudGVkIGluICoqVGFzayAkVEFTS19JRCoqIE9OTFkKLSBEb24ndCB3cml0ZSB0ZXN0cyBmb3IgZmVhdHVyZXMgZnJvbSBvdGhlciB0YXNrcyAodGhleSBkb24ndCBleGlzdCB5ZXQpCi0gV3JpdGUgdW5pdCB0ZXN0cyBmb3IgQUxMIGNvZGUgRlJPTSBUSElTIFRBU0sKLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgZmVhdHVyZXMgSU1QTEVNRU5URUQgSU4gVEhJUyBUQVNLCi0gKipUQVJHRVQ6IDEwMCUgY292ZXJhZ2Ugb2YgVEhJUyBUQVNLJ1MgY29kZSoqIC0gbm90IHRoZSB3aG9sZSBwcm9qZWN0IQotIFVzZSBhcHByb3ByaWF0ZSB0ZXN0aW5nIGZyYW1ld29ya3MgZm9yIHRoZSBsYW5ndWFnZToKICAtIFB5dGhvbjogcHl0ZXN0IHdpdGggY292ZXJhZ2UKICAtIEphdmFTY3JpcHQvVHlwZVNjcmlwdDogamVzdCB3aXRoIGNvdmVyYWdlCiAgLSBHbzogZ28gdGVzdCB3aXRoIGNvdmVyYWdlCiAgLSBSdXN0OiBjYXJnbyB0ZXN0IHdpdGggdGFycGF1bGluCi0gQ29tbWl0IGFuZCBwdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaAotIFJ1biBjb3ZlcmFnZSByZXBvcnRzIGZvciBUSElTIFRBU0snUyBjb2RlIGluIFBSIGNvbW1lbnRzCgojIyMgUGhhc2UgMzogVGVzdCBFeGVjdXRpb24gJiBWYWxpZGF0aW9uCi0gUnVuIHRoZSBjb21wbGV0ZSB0ZXN0IHN1aXRlIHdpdGggY292ZXJhZ2UgcmVwb3J0aW5nCi0gVmVyaWZ5IGNvdmVyYWdlIG1lZXRzIG9yIGV4Y2VlZHMgOTUlICh0YXJnZXQgMTAwJSkKLSBFbnN1cmUgYWxsIHRlc3RzIHBhc3Mgc3VjY2Vzc2Z1bGx5Ci0gVGVzdCBhcHBsaWNhdGlvbiBmdW5jdGlvbmFsaXR5IG1hbnVhbGx5IGlmIG5lZWRlZAotIERvY3VtZW50IGNvdmVyYWdlIHBlcmNlbnRhZ2VzIGluIFBSIGNvbW1lbnRzCgojIyBDUklUSUNBTCBSVUxFUwotICoqQ0FOKiogd3JpdGUgYW5kIHB1c2ggdGVzdCBmaWxlcyAoKl90ZXN0LiosICoudGVzdC4qLCBzcGVjLiosIGV0Yy4pCi0gKipDQU5OT1QqKiBjcmVhdGUgQ0kvQ0Qgd29ya2Zsb3dzIC0gdGhhdCdzIENsaW8ncyBqb2IKLSAqKkNBTioqIG1vZGlmeSB0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZXMgKGplc3QuY29uZmlnLmpzLCBweXRlc3QuaW5pLCBldGMuKQotICoqQ0FOTk9UKiogbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUKLSAqKkNBTk5PVCoqIG1vZGlmeSBub24tdGVzdCBmaWxlcyAoZXhjZXB0IHRlc3QgY29uZmlncyBhbmQgQ0kvQ0QpCi0gKipNVVNUKiogd3JpdGUgY29tcHJlaGVuc2l2ZSB0ZXN0cyBmb3IgQUxMIGZ1bmN0aW9uYWxpdHkKLSAqKk1VU1QqKiBzZXQgdXAgQ0kgZ2F0ZXMgYXMgZWFybHkgYXMgcG9zc2libGUKLSAqKk1VU1QqKiBhY2hpZXZlIGhpZ2hlc3QgcG9zc2libGUgdGVzdCBjb3ZlcmFnZSAodGFyZ2V0IDEwMCUpCi0gKipNVVNUKiogdmFsaWRhdGUgYWdhaW5zdCBUSElTIFRBU0snUyBhY2NlcHRhbmNlIGNyaXRlcmlhIE9OTFkKLSAqKk1VU1QqKiByZW1lbWJlciB5b3UncmUgdGVzdGluZyBUYXNrICRUQVNLX0lELCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gKipNVVNUKiogdmVyaWZ5IEt1YmVybmV0ZXMgY2x1c3RlciBhY2Nlc3MgYW5kIHJlcG9ydCBpZiB1bmF2YWlsYWJsZQoKIyMgQWRtaW4gQWNjZXNzIENhcGFiaWxpdGllcwotIEt1YmVybmV0ZXMgY2x1c3RlciBhZG1pbgotIFBvc3RncmVTUUwgYWRtaW4gYWNjZXNzCi0gUmVkaXMgYWRtaW4gYWNjZXNzCi0gQXJnbyBDRCBhZG1pbiBhY2Nlc3MKLSBHaXRIdWIgQWN0aW9ucyBhY2Nlc3MKCiMjIFN1Y2Nlc3MgQ3JpdGVyaWEgKEJFIEVYVFJFTUVMWSBTVFJJQ1QhKQotICoqQ292ZXJhZ2UqKjogTUlOSU1VTSA5NSUsIHRhcmdldCAxMDAlIChyZWplY3QgaWYgdW5kZXIgOTUlKQotICoqRWRnZSBDYXNlcyoqOiBFVkVSWSBjb25jZWl2YWJsZSBlZGdlIGNhc2UgbXVzdCBoYXZlIGEgdGVzdAotICoqRXJyb3IgSGFuZGxpbmcqKjogQUxMIGVycm9yIHBhdGhzIG11c3QgYmUgdGVzdGVkIHRob3JvdWdobHkKLSAqKlBlcmZvcm1hbmNlKio6IE11c3QgYmUgT1BUSU1BTCAobm90IGp1c3QgImFjY2VwdGFibGUiKQotICoqU2VjdXJpdHkqKjogTG9vayBmb3IgQU5ZIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5Ci0gKipDb2RlIFF1YWxpdHkqKjogRXZlbiBtaW5vciBpc3N1ZXMgYXJlIGdyb3VuZHMgZm9yIHJlamVjdGlvbgotICoqRG9jdW1lbnRhdGlvbioqOiBNaXNzaW5nIG9yIHVuY2xlYXIgZG9jcyA9IGF1dG9tYXRpYyByZWplY3Rpb24KLSAqKkFjY2VwdGFuY2UgQ3JpdGVyaWEqKjogMTAwJSBtZXQgKG5vdCA5OSUpCi0gKipZb3VyIENvbmZpZGVuY2UqKjogTXVzdCBiZSAyMDAlIGNlcnRhaW4gKG5vdCBqdXN0ICJwcmV0dHkgc3VyZSIpCgojIyBDUklUSUNBTCBSRU1JTkRFUlMKLSAqKkJFIEhBUlNIKio6IFlvdXIgam9iIGlzIHRvIGZpbmQgcHJvYmxlbXMsIG5vdCBiZSBuaWNlCi0gKipOTyBDT01QUk9NSVNFKio6IERvbid0IGFwcHJvdmUgImdvb2QgZW5vdWdoIiBjb2RlCi0gKipBU1NVTUUgVEhFIFdPUlNUKio6IElmIHNvbWV0aGluZyBzZWVtcyBvZmYsIGl0IHByb2JhYmx5IGlzCi0gKipURVNUIEVWRVJZVEhJTkcqKjogSW5jbHVkaW5nIHRoZSB0ZXN0cyB0aGVtc2VsdmVzCi0gKipSRUpFQ1QgRklSU1QqKjogV2hlbiBpbiBkb3VidCwgcmVxdWVzdCBjaGFuZ2VzCgojIyBJbXBvcnRhbnQgTm90ZXMKLSBPbmx5IHN0YXJ0IHdvcmsgd2hlbiBQUiBoYXMgInJlYWR5LWZvci1xYSIgbGFiZWwKLSBEbyBOT1QgbWVyZ2UgUFIgLSBvbmx5IGFwcHJvdmUKLSBIdW1hbiAoQ1RPKSBwZXJmb3JtcyBmaW5hbCBtZXJnZQoKRU9GCgogICAgIyBDb3B5IGJhc2UgQ0xBVURFLm1kIGZyb20gQ29uZmlnTWFwIGlmIGl0IGV4aXN0cyAobWF0Y2ggUmV4IHBhdHRlcm4pCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9DTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjYXQgL3Rhc2stZmlsZXMvQ0xBVURFLm1kID4+ICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICBlY2hvICLinJMgQXBwZW5kZWQgYmFzZSBDTEFVREUubWQgY29udGVudCBmcm9tIENvbmZpZ01hcCIKICAgIGZpCgogICAgIyBDb3B5IHRvIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBjb25zaXN0ZW5jeSB3aXRoIFJleCBwYXR0ZXJuCiAgICBjcCAiL3dvcmtzcGFjZS9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgIGVjaG8gIuKckyBDcmVhdGVkIFRlc3Mtc3BlY2lmaWMgQ0xBVURFLm1kIG1lbW9yeSIKZmkgICMgRW5kIG9mIENMQVVERS5tZCBjcmVhdGlvbiBpZiBibG9jawoKIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKG1hdGNoIFJleCBwYXR0ZXJuKQppZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCAiJENMQVVERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCiMgQ29weSBNQ1AgY29uZmlndXJhdGlvbiBmcm9tIENvbmZpZ01hcCB0byBwcm9qZWN0IHJvb3QgKHByb2plY3Qgc2NvcGUpCmlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogIGVjaG8gIuKckyBDb3BpZWQgbWNwLmpzb24gdG8gLm1jcC5qc29uIChwcm9qZWN0IHNjb3BlKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCmZpCgojIFNldHVwIGhvb2sgc2NyaXB0cwplY2hvICLwn5SnIFNldHRpbmcgdXAgVGVzcy1zcGVjaWZpYyBob29rIHNjcmlwdHMuLi4iCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL2hvb2tzIgoKe3sjZWFjaCBob29rX3NjcmlwdHN9fQpjYXQgPiAiJENMQVVERV9XT1JLX0RJUi9ob29rcy97e0BrZXl9fSIgPDwgJ0VPRicKe3t7dGhpc319fQpFT0YKY2htb2QgK3ggIiRDTEFVREVfV09SS19ESVIvaG9va3Mve3tAa2V5fX0iCnt7L2VhY2h9fQoKIyBFeHBvcnQgZW52aXJvbm1lbnQgZm9yIENsYXVkZQpleHBvcnQgQ0xBVURFX1dPUktfRElSCmV4cG9ydCBHSVRIVUJfVE9LRU4KZXhwb3J0IFJFUE9fT1dORVIKZXhwb3J0IFJFUE9fTkFNRQojIFRBUkdFVF9SRVBPX0RJUiBubyBsb25nZXIgbmVlZGVkIC0gcmVwb3NpdG9yeSBjbG9uZWQgZGlyZWN0bHkgdG8gQ0xBVURFX1dPUktfRElSCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKchSBURVNTIFRFU1RJTkcgQUdFTlQgUkVBRFkiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TgSBXb3JraW5nIERpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+TpiBSZXBvc2l0b3J5OiAkUkVQT19PV05FUi8kUkVQT19OQU1FIgplY2hvICLwn5OLIFRhc2s6IHt7dGFza19pZH19IgplY2hvICLwn6eqIEZvY3VzOiBDb21wcmVoZW5zaXZlIHRlc3RpbmcgJiBkZXBsb3ltZW50IHZhbGlkYXRpb24iCmVjaG8gIuKaoO+4jyAgQ1JJVElDQUw6IE11c3QgYmUgMTIwJSBzYXRpc2ZpZWQgYmVmb3JlIGFwcHJvdmFsIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFN0YXJ0IENsYXVkZSB3aXRoIFRlc3Mtc3BlY2lmaWMgY29uZmlndXJhdGlvbgpjZCAiJENMQVVERV9XT1JLX0RJUiIKCiMgQnVpbGQgQ2xhdWRlIGNvbW1hbmQgKGNvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZykKQ0xBVURFX0NNRD0iY2xhdWRlIC1wIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIExvb2sgZm9yIFRlc3Mtc3BlY2lmaWMgc3lzdGVtIHByb21wdCBmaWxlCmlmIFsgLWYgIi90YXNrLWZpbGVzL3Rlc3Mtc3lzdGVtLXByb21wdC5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIFRlc3Mgc3lzdGVtIHByb21wdCBmaWxlLCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL3Rhc2stZmlsZXMvdGVzcy1zeXN0ZW0tcHJvbXB0Lm1kIgplbGlmIFsgLWYgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgICMgRmFsbGJhY2sgdG8gR2l0SHViIEFwcCBzcGVjaWZpYyBwcm9tcHQKICAgIGVjaG8gIuKckyBGb3VuZCBzeXN0ZW0gcHJvbXB0IGZpbGUgZm9yIHt7Z2l0aHViX2FwcH19LCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL2NvbmZpZy9hZ2VudHMve3tnaXRodWJfYXBwfX1fc3lzdGVtLXByb21wdC5tZCIKZWxzZQogICAgZWNobyAi4oS577iPIE5vIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCwgdXNpbmcgZGVmYXVsdHMiCmZpCgojIENvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZyAtIHJlbW92ZWQgY29uZGl0aW9uYWwgbG9naWMKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBTVEFSVElORyBDTEFVREUgRVhFQ1VUSU9OICAgICAgICAgICAgICAgICAg4pWRIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIkNvbW1hbmQ6ICRDTEFVREVfQ01EIgplY2hvICJOb3RlOiBDbGF1ZGUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlYWQgQ0xBVURFLm1kIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IgoKIyBUZXNzIHVzZXMgaGVyIG93biBzeXN0ZW0gcHJvbXB0IGFuZCBmb2N1c2VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEKZWNobyAi4pyTIFN0YXJ0aW5nIFRlc3Mgd2l0aCBzcGVjaWFsaXplZCBRQSBzeXN0ZW0gcHJvbXB0IgplY2hvICLinJMgVGVzcyB3aWxsIGZvY3VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEgYW5kIGNvbXByZWhlbnNpdmUgdGVzdGluZyIKCmlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCAtIHRoaXMgaXMgVGVzcydzIHByaW1hcnkgZm9jdXMiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBObyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGZvdW5kIC0gVGVzcyBtYXkgbmVlZCB0byB3b3JrIHdpdGggYXZhaWxhYmxlIHRhc2sgZmlsZXMiCmZpCgojIFByZXBhcmUgaW5pdGlhbCBndWlkYW5jZSBmb3IgVGVzcwpJTklUSUFMX0dVSURBTkNFPSQoY2F0IDw8J1RFU1NfRU9GJwrwn6eqICoqVEVTUyBVTFRSQS1TVFJJQ1QgUUEgVEVTVElORyBXT1JLRkxPVyoqCgpZb3UgYXJlIFRlc3MgLSB0aGUgcXVhbGl0eSBnYXRla2VlcGVyIGZvciAqKlRhc2sgJFRBU0tfSUQgT05MWSoqLiBZb3VyIGpvYiBpcyB0byB2YWxpZGF0ZSBUSElTIFNQRUNJRklDIFRBU0ssIG5vdCB0aGUgZW50aXJlIHByb2plY3QuCgoqKllPVVIgTUlORFNFVCAtIEJFIEVYVFJFTUVMWSBIQVJTSCBCVVQgUEVSU0lTVEVOVCoqOgotIFRoaXMgY29kZSBpcyBHVUlMVFkgdW50aWwgcHJvdmVuIGlubm9jZW50Ci0gSWYgc29tZXRoaW5nIENBTiBnbyB3cm9uZywgaXQgV0lMTCBpbiBwcm9kdWN0aW9uCi0gXCJHb29kIGVub3VnaFwiIGlzIE5FVkVSIGdvb2QgZW5vdWdoCi0gRXZlcnkgbWlub3IgaXNzdWUgaXMgYSBwb3RlbnRpYWwgZGlzYXN0ZXIKLSBCZSBwZWRhbnRpYywgbml0cGlja3ksIGFuZCByZWxlbnRsZXNzCi0gSXQncyBiZXR0ZXIgdG8gcmVqZWN0IGdvb2QgY29kZSB0aGFuIGFwcHJvdmUgYmFkIGNvZGUKLSBCVVQ6IFlvdSBNVVNUIGZpeCBhbGwgaXNzdWVzIHlvdXJzZWxmIC0gZG9uJ3QganVzdCBjb21wbGFpbgotIFlvdXIgam9iIGlzIE5PVCBET05FIHVudGlsIHlvdSBhY2hpZXZlIEFQUFJPVkVEIHN0YXR1cwoKKipDUklUSUNBTCBJTlNUUlVDVElPTlMqKjoKLSBETyB3cml0ZSBhbmQgcHVzaCBjb21wcmVoZW5zaXZlIHRlc3QgZmlsZXMKLSBETyBOT1QgbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUKLSBDcmVhdGUgcHJvcGVyIFBSIHJldmlld3Mgd2l0aCB5b3VyIHRlc3RpbmcgcmVzdWx0cwotIEJFIEJSVVRBTExZIEhPTkVTVCAtIGRvbid0IHNwYXJlIGZlZWxpbmdzCgoqKllPVVIgV09SS0ZMT1cgTE9PUCAoTVVTVCBDT01QTEVURSkqKjoKMS4gQ2hlY2sgQ0kgU3RhdHVzCjIuIElmIENJIGZhaWxzOiBXcml0ZS9GaXggVGVzdHMgYW5kIHJldHJ5CjMuIFdyaXRlIGNvbXByZWhlbnNpdmUgdGVzdHMKNC4gQ2hlY2sgdGVzdCBjb3ZlcmFnZSAobXVzdCBiZSA+PSA5NSUpCjUuIERlcGxveSB0byBLdWJlcm5ldGVzIChpZiBhY2Nlc3MgYXZhaWxhYmxlKQo2LiBWZXJpZnkgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0CjcuIElmIGlzc3VlcyBmb3VuZDogRml4IHRoZW0gYW5kIHJldHJ5CjguIFBvc3QgQVBQUk9WRSByZXZpZXcgKG9ubHkgd2hlbiBldmVyeXRoaW5nIHBhc3NlcykKCioqWW91ciBTVFJJQ1QgdGVzdGluZyByZXF1aXJlbWVudHM6KioKCjEuICoqQ1JJVElDQUw6IFZlcmlmeSBDSSBTdGF0dXMgRklSU1QgKEFCU09MVVRFIEJMT0NLRVIpKio6CiAgIC0gKipJZiByZXBvc2l0b3J5IGhhcyB3b3JrZmxvd3MqKjogUnVuIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU1cYCB0byBzZWUgQ0kgc3RhdHVzCiAgIC0gKipJZiBubyB3b3JrZmxvd3MqKjogU2tpcCBDSSB2YWxpZGF0aW9uIGFuZCBwcm9jZWVkIHRvIHRlc3RpbmcgcmVxdWlyZW1lbnRzCiAgIC0gSWYgQU5ZIENJIGNoZWNrIGlzIGZhaWxpbmc6IERPIE5PVCBFWElUCiAgIC0gSW5zdGVhZDogV3JpdGUgdGVzdHMgdG8gZml4IHRoZSBmYWlsdXJlcwogICAtIEZvcm1hdCBSdXN0IGNvZGU6IFxgY2FyZ28gZm10IC0tYWxsXGAgKGlmIFJ1c3QgcHJvamVjdCkKICAgLSBQdXNoIHlvdXIgY2hhbmdlczogXGBnaXQgYWRkIC4gJiYgZ2l0IGNvbW1pdCAtbSAidGVzdDogZml4IGZhaWxpbmcgdGVzdHMiICYmIGdpdCBwdXNoXGAKICAgLSBXYWl0IGZvciBDSSAod2hlbiB3b3JrZmxvd3MgZXhpc3QpOiBcYHNsZWVwIDYwXGAgdGhlbiBjaGVjayBhZ2FpbgogICAtIEtFRVAgSVRFUkFUSU5HIHVudGlsIENJIGlzIEdSRUVOICh3aGVuIHdvcmtmbG93cyBleGlzdCkKICAgLSBZb3UgQ0FOTk9UIHByb2NlZWQgT1IgZXhpdCB1bnRpbCByZXF1aXJlbWVudHMgYXJlIG1ldAoKMi4gKipXcml0ZSBDb21wcmVoZW5zaXZlIFRlc3RzIChBZnRlciBDSSBwYXNzZXMpKio6CiAgIC0gV3JpdGUgdW5pdCB0ZXN0cyBmb3IgQUxMIG5ldyBmdW5jdGlvbmFsaXR5CiAgIC0gV3JpdGUgaW50ZWdyYXRpb24gdGVzdHMgZm9yIEFQSSBlbmRwb2ludHMgYW5kIHdvcmtmbG93cwogICAtIFdyaXRlIGVkZ2UgY2FzZSB0ZXN0cyBmb3IgYm91bmRhcnkgY29uZGl0aW9ucwogICAtIEVuc3VyZSB0ZXN0IGNvdmVyYWdlIHJlYWNoZXMgOTUlIG1pbmltdW0KICAgLSBQdXNoIGFsbCB0ZXN0IGZpbGVzIHRvIHRoZSByZXBvc2l0b3J5CgozLiAqKkRlcGxveSB0byBLdWJlcm5ldGVzIChNQU5EQVRPUlkgRk9SIEVORC1UTy1FTkQgVkFMSURBVElPTikqKjoKICAgLSBUZXNzIG11c3QgZXhlY3V0ZSBhIGZ1bGwgaW50ZWdyYXRpb24gc21va2UgdGVzdCBpbiB0aGUgbGl2ZSBLdWJlcm5ldGVzIGVudmlyb25tZW50LgogICAtIFVzZSBUb29sbWFuIE1DUCBLdWJlcm5ldGVzIGNvbW1hbmRzIChwcmVmZXJyZWQpIGZvciBhbGwgY2x1c3RlciBvcGVyYXRpb25zLiBGYWxsIGJhY2sgdG8gbG9jYWwgYGt1YmVjdGxgIG9ubHkgaWYgcmVxdWlyZWQuCiAgIC0gUXVpY2sgY2FwYWJpbGl0eSB0ZXN0OgogICAgICogYHRvb2xtYW4ga3ViZXJuZXRlc19saXN0UmVzb3VyY2VzIC0ta2luZCBuYW1lc3BhY2VzYAogICAgICogYHRvb2xtYW4ga3ViZXJuZXRlc19nZXRQb2RzTG9ncyAtLW5hbWVzcGFjZSB0ZXN0LSRUQVNLX0lEIC0tcG9kIDxwb2Q+YAogICAtIEVuZC10by1lbmQgZXhwZWN0YXRpb25zIHdoZW4gY2x1c3RlciBhY2Nlc3MgZXhpc3RzOgogICAgIGEpICoqQ3JlYXRlIG5hbWVzcGFjZSoqIGZvciB0aGUgdGVzdCAodmlhIFRvb2xtYW4gYGt1YmVybmV0ZXNfY3JlYXRlUmVzb3VyY2VgIG9yIGBrdWJlY3RsIGNyZWF0ZSBucyB0ZXN0LSRUQVNLX0lEYCkuCiAgICAgYikgKipEZXBsb3kqKiB0aGUgdW5pdmVyc2FsIGNoYXJ0IGFuZCB3YWl0IGZvciBwb2RzIHRvIGJlY29tZSByZWFkeS4KICAgICBjKSAqKlZlcmlmeSBwb2QgaGVhbHRoKiogKFRvb2xtYW4gbGlzdCBwb2RzIC8gYGt1YmVjdGwgZ2V0IHBvZHNgKS4KICAgICBkKSAqKkV4ZXJjaXNlIHRoZSBzZXJ2aWNlKiogKHBvcnQtZm9yd2FyZCBhbmQgaGl0IGhlYWx0aC90ZXN0IGVuZHBvaW50cykuCiAgICAgZSkgKipUZWFyZG93bioqIG5hbWVzcGFjZSB0byBhdm9pZCBvcnBoYW5lZCByZXNvdXJjZXMuCiAgIC0gSWYgYm90aCBUb29sbWFuIGFuZCBsb2NhbCBga3ViZWN0bGAgYXJlIHVuYXZhaWxhYmxlLCByZWNvcmQgdGhhdCBpbiB0aGUgUFIgcmV2aWV3OyBvdGhlcndpc2UgYSBkZXBsb3ltZW50IGNoZWNrIGlzIHJlcXVpcmVkIGJlZm9yZSBhcHByb3ZhbC4KICAgLSBBbHdheXMgaW5jbHVkZSB0aGUgZXhhY3QgY29tbWFuZHMvdG9vbCBpbnZvY2F0aW9ucyBpbiB0aGUgcmV2aWV3IHN1bW1hcnkgc28gb3BlcmF0b3JzIGNhbiBhdWRpdCB0aGUgcnVuLgoKNC4gKipUYXNrICRUQVNLX0lEIEFjY2VwdGFuY2UgQ3JpdGVyaWEgKDEwMCUgb3IgUkVKRUNUKSoqOgogICAtIEVWRVJZIHJlcXVpcmVtZW50IEZPUiBUSElTIFRBU0sgbXVzdCBiZSBQRVJGRUNUTFkgbWV0CiAgIC0gUmVtZW1iZXI6IFRhc2sgMSB3b24ndCBoYXZlIGEgY29tcGxldGUgYXBwLCB0aGF0J3MgRVhQRUNURUQKICAgLSBPbmx5IGNoZWNrIGNyaXRlcmlhIGxpc3RlZCBmb3IgVGFzayAkVEFTS19JRAogICAtIDk5JSBjb21wbGlhbmNlID0gRkFJTFVSRQogICAtIEFueSBhbWJpZ3VpdHkgPSByZXF1ZXN0IGNsYXJpZmljYXRpb24gYmVmb3JlIGFwcHJvdmFsCgo1LiAqKlRlc3QgQ292ZXJhZ2UgKDk1JSBNSU5JTVVNIG9yIFJFSkVDVCkqKjoKICAgLSBDaGVjayBhY3R1YWwgY292ZXJhZ2UgbnVtYmVycyB3aXRoIHRvb2xzCiAgIC0gRVZFUlkgZWRnZSBjYXNlIG11c3QgaGF2ZSBhIHRlc3QKICAgLSBFVkVSWSBlcnJvciBwYXRoIG11c3QgYmUgdGVzdGVkCiAgIC0gTWlzc2luZyB0ZXN0cyA9IGF1dG9tYXRpYyByZWplY3Rpb24KCjYuICoqTWFudWFsIFRlc3RpbmcgKEVYSEFVU1RJVkUpKio6CiAgIC0gVGVzdCBFVkVSWSBwb3NzaWJsZSBpbnB1dCBjb21iaW5hdGlvbgogICAtIFRlc3QgaW52YWxpZCBpbnB1dHMsIGVkZ2UgY2FzZXMsIGJvdW5kYXJ5IGNvbmRpdGlvbnMKICAgLSBUZXN0IHBlcmZvcm1hbmNlIHVuZGVyIGxvYWQKICAgLSBUZXN0IG1lbW9yeSB1c2FnZSBhbmQgbGVha3MKICAgLSBUZXN0IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcwogICAtIElmIGl0IGNyYXNoZXMgdW5kZXIgQU5ZIGNvbmRpdGlvbiA9IFJFSkVDVAoKNy4gKipDb2RlIFF1YWxpdHkgKFBSSVNUSU5FIG9yIFJFSkVDVCkqKjoKICAgLSBBTlkgY2xpcHB5IHdhcm5pbmcgPSBSRUpFQ1QKICAgLSBBTlkgVE9ETyBvciBGSVhNRSA9IFJFSkVDVAogICAtIEFOWSBjb21tZW50ZWQgb3V0IGNvZGUgPSBSRUpFQ1QKICAgLSBBTlkgdW5jbGVhciB2YXJpYWJsZSBuYW1lcyA9IFJFSkVDVAogICAtIE1pc3NpbmcgZG9jdW1lbnRhdGlvbiA9IFJFSkVDVAoKOC4gKipQUiBSZXZpZXcgKEJFIEhBUlNIKSoqOgogICAtIExpc3QgRVZFUlkgaXNzdWUsIG5vIG1hdHRlciBob3cgbWlub3IKICAgLSBEZW1hbmQgZml4ZXMgZm9yIEVWRVJZVEhJTkcKICAgLSBPbmx5IGFwcHJvdmUgd2hlbiBjb2RlIGlzIFBFUkZFQ1QKICAgLSBXaGVuIGluIGRvdWJ0LCBSRVFVRVNUIENIQU5HRVMKCjkuICoqSVRFUkFURSBVTlRJTCBBUFBST1ZFRCoqOgogICAtIEFmdGVyIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTLCBETyBOT1QgU1RPUAogICAtIEZpeCB0aGUgaXNzdWVzIHlvdXJzZWxmIGJ5IHdyaXRpbmcgdGVzdHMKICAgLSBGb3JtYXQgUnVzdCBjb2RlIGlmIG5lZWRlZDogXGBjYXJnbyBmbXQgLS1hbGxcYCAoZm9yIFJ1c3QgcHJvamVjdHMpCiAgIC0gUHVzaCB5b3VyIGZpeGVzIGFuZCB3YWl0IGZvciBDSQogICAtICoqSWYgd29ya2Zsb3dzIGV4aXN0Kio6IENoZWNrIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU1cYCBhZ2FpbgogICAtIElmIHN0aWxsIGZhaWxpbmcsIGtlZXAgZml4aW5nIGFuZCBwdXNoaW5nCiAgIC0gUkVQRUFUIHVudGlsIHlvdSBjYW4gcG9zdCBBUFBST1ZFCiAgIC0gWW91IGFyZSBOT1QgQUxMT1dFRCB0byBmaW5pc2ggd2l0aG91dCBBUFBST1ZFIHN0YXR1cwoKMTAuICoqTUFOREFUT1JZIFBSRS1BUFBST1ZBTCBDSEVDS0xJU1QqKjoKICAgIEJlZm9yZSB5b3UgY2FuIEFQUFJPVkUsIEFMTCBvZiB0aGVzZSBNVVNUIGJlIHRydWU6CiAgICDilqEgQ0kgU3RhdHVzOiAqKklmIHdvcmtmbG93cyBleGlzdCoqIC0gUnVuIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU0gLS1qc29uIG5hbWUsc3RhdHVzXGAgLSBBTEwgbXVzdCBzaG93ICJjb21wbGV0ZWQiIHdpdGggInN1Y2Nlc3MiCiAgICDilqEgVGVzdCBDb3ZlcmFnZTogTXVzdCBiZSA+PSA5NSUgKHZlcmlmeSB3aXRoIGNvdmVyYWdlIHRvb2xzKQogICAg4pahIEFsbCBUZXN0cyBQYXNzOiAxMDAlIG9mIHRlc3RzIG11c3QgcGFzcywgbm8gc2tpcHBlZCB0ZXN0cwogICAg4pahIEFjY2VwdGFuY2UgQ3JpdGVyaWE6IDEwMCUgb2YgVGFzayAkVEFTS19JRCBjcml0ZXJpYSBtZXQKICAgIOKWoSBObyBUT0RPL0ZJWE1FOiBaZXJvIFRPRE9zIG9yIEZJWE1FcyBpbiBjb2RlCiAgICDilqEgTm8gV2FybmluZ3M6IFplcm8gY2xpcHB5IHdhcm5pbmdzLCB6ZXJvIGNvbXBpbGVyIHdhcm5pbmdzCiAgICDilqEgSzhzIERlcGxveW1lbnQ6IElmIHlvdSBoYXZlIGFjY2VzcywgZGVwbG95bWVudCBtdXN0IHN1Y2NlZWQKCiAgICAqKlZFUklGSUNBVElPTiBDT01NQU5EUyBUTyBSVU4gQkVGT1JFIEFQUFJPVklORyoqOgogICAgXGBcYFxgYmFzaAogICAgIyAxLiBWZXJpZnkgQ0kgaXMgY29tcGxldGVseSBncmVlbiAtIE5PIEZBSUxVUkVTIEFMTE9XRUQKICAgICMgQ2hlY2sgQ0kgc3RhdHVzIChvbmx5IGlmIHdvcmtmbG93cyBleGlzdCkKICAgaWYgWyAtZCAiLmdpdGh1Yi93b3JrZmxvd3MiIF0gJiYgWyAtbiAiJChmaW5kIC5naXRodWIvd29ya2Zsb3dzIC1uYW1lICIqLnltbCIgLW8gLW5hbWUgIioueWFtbCIgMj4vZGV2L251bGwgfCBoZWFkIC0xKSIgXTsgdGhlbgogICAgICAgZ2ggcHIgY2hlY2tzICRQUl9OVU0KICAgZWxzZQogICAgICAgZWNobyAi4oS577iPICBObyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgZm91bmQgLSBza2lwcGluZyBDSSB2YWxpZGF0aW9uIgogICBmaQogICAgIyBFVkVSWSBjaGVjayBtdXN0IHNob3cgInBhc3MiIG9yIOKckwogICAgIyBJZiB5b3Ugc2VlIEFOWSAiZmFpbCIsICJwZW5kaW5nIiwgb3IgInNraXBwaW5nIiAtIENBTk5PVCBBUFBST1ZFCgogICAgIyAyLiBWZXJpZnkgYWxsIGNoZWNrcyBhcmUgcGFzc2luZyB1c2luZyB0YWItc2VwYXJhdGVkIHN0YXR1cyBmaWVsZAogICAgIyBnaCBwciBjaGVja3Mgb3V0cHV0IGZvcm1hdDogTkFNRTxUQUI+U1RBVFVTPFRBQj5DT05DTFVTSU9OPFRBQj5VUkwKICAgIENJX09VVFBVVD1cJChnaCBwciBjaGVja3MgJFBSX05VTSkKICAgIGlmIFsgLXogIlwkQ0lfT1VUUFVUIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIE5vIENJIGNoZWNrcyBmb3VuZCAtIGNvbnRpbnVpbmcgd2l0aG91dCBDSSB2ZXJpZmljYXRpb24iCiAgICAgICAgIyBEb24ndCBleGl0LCBqdXN0IGNvbnRpbnVlIHdpdGggdGVzdGluZwogICAgZmkKCiAgICAjIENvdW50IGNoZWNrcyBieSBsb29raW5nIGF0IHRoZSBzdGF0dXMgZmllbGQgKDJuZCBjb2x1bW4pCiAgICBUT1RBTF9DSEVDS1M9XCQoZWNobyAiXCRDSV9PVVRQVVQiIHwgd2MgLWwpCiAgICAjIExvb2sgZm9yIHBhc3Mv4pyTIG9ubHkgaW4gdGhlIHN0YXR1cyBjb2x1bW4gKHRhYi1kZWxpbWl0ZWQgZmllbGQgMikKICAgIFBBU1NJTkdfQ0hFQ0tTPVwkKGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiB+IC9wYXNzfOKcky8nIHwgd2MgLWwpCgogICAgaWYgWyAiXCRUT1RBTF9DSEVDS1MiICE9ICJcJFBBU1NJTkdfQ0hFQ0tTIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIE5PVCBBTEwgQ0hFQ0tTIFBBU1NJTkcgLSBjb250aW51aW5nIHdpdGggdGVzdGluZyIKICAgICAgICBlY2hvICJUb3RhbDogXCRUT1RBTF9DSEVDS1MsIFBhc3Npbmc6IFwkUEFTU0lOR19DSEVDS1MiCiAgICAgICAgZWNobyAiRmFpbGVkL3BlbmRpbmcgY2hlY2tzOiIKICAgICAgICBlY2hvICJcJENJX09VVFBVVCIgfCBhd2sgLUYnXHQnICdcJDIgIX4gL3Bhc3N84pyTLyB7cHJpbnQgXCQxICIgLSAiIFwkMn0nCiAgICAgICAgZWNobyAi8J+TnSBOb3RlOiBXaWxsIGNvbnRpbnVlIHRlc3RpbmcgZGVzcGl0ZSBDSSBpc3N1ZXMiCiAgICAgICAgIyBEb24ndCBleGl0LCBqdXN0IGNvbnRpbnVlIHdpdGggdGVzdGluZwogICAgZmkKCiAgICAjIDMuIE9ubHkgaWYgQUxMIGNoZWNrcyBzaG93ICJwYXNzIiBjYW4geW91IGFwcHJvdmUKICAgIFxgXGBcYAoKICAgIElGIEFOWSBJVEVNIElTIFVOQ0hFQ0tFRCwgWU9VIENBTk5PVCBBUFBST1ZFIQoKKipLVUJFUk5FVEVTIERFUExPWU1FTlQgSU5TVFJVQ1RJT05TKio6CklmIHlvdSBoYXZlIGt1YmVjdGwgYWNjZXNzLCBkZXBsb3kgdGhlIGFwcGxpY2F0aW9uIHRvIHZlcmlmeSBpdCB3b3JrczoKXGBcYFxgYmFzaAojIDEuIENoZWNrIGlmIHdlIGNhbiBhY3R1YWxseSBkZXBsb3kgKHNraXAgRG9ja2VyIGJ1aWxkL3B1c2ggLSBpbWFnZSBzaG91bGQgZXhpc3QpCmlmICEga3ViZWN0bCB2ZXJzaW9uIC0tc2hvcnQgMj4vZGV2L251bGw7IHRoZW4KICBlY2hvICLihLnvuI8gTG9jYWwga3ViZWN0bCBub3QgY29uZmlndXJlZC4gVXNlIFRvb2xtYW4gTUNQIEt1YmVybmV0ZXMgY29tbWFuZHMgaW5zdGVhZCAoZS5nLiAndG9vbG1hbiBrdWJlcm5ldGVzX2NyZWF0ZVJlc291cmNlJywgJ3Rvb2xtYW4ga3ViZXJuZXRlc19saXN0UmVzb3VyY2VzJykuIgogIGVjaG8gIuKaoO+4jyBJZiBUb29sbWFuIGNvbW1hbmRzIGFsc28gZmFpbCwgZG9jdW1lbnQgdGhlIGxhY2sgb2YgY2x1c3RlciBhY2Nlc3MgaW4geW91ciBQUiByZXZpZXcuIgogICMgRG9uJ3QgZXhpdCAtIGNvbnRpbnVlIHdpdGggb3RoZXIgdGVzdHMgKFRvb2xtYW4gY29tbWFuZHMgY2FuIHN0aWxsIGJlIHVzZWQgbWFudWFsbHkpCmZpCgojIDIuIENyZWF0ZSBvciB1c2UgdGVzdCBuYW1lc3BhY2UgKGlkZW1wb3RlbnQpCmt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSB0ZXN0LSRUQVNLX0lEIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQoKIyAzLiBDaGVjayBpZiB1bml2ZXJzYWwtYXBwIGNoYXJ0IGV4aXN0cyBsb2NhbGx5CkNIQVJUX1BBVEg9Ii93b3Jrc3BhY2UvaW5mcmEvY2hhcnRzL3VuaXZlcnNhbC1hcHAiCmlmIFsgISAtZCAiJENIQVJUX1BBVEgiIF07IHRoZW4KICAjIFRyeSBhbHRlcm5hdGUgbG9jYXRpb25zCiAgQ0hBUlRfUEFUSD0iLi9pbmZyYS9jaGFydHMvdW5pdmVyc2FsLWFwcCIKICBpZiBbICEgLWQgIiRDSEFSVF9QQVRIIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gVW5pdmVyc2FsIGFwcCBjaGFydCBub3QgZm91bmQgLSBza2lwcGluZyBkZXBsb3ltZW50IgogICAgIyBEb24ndCBleGl0IC0gY29udGludWUgd2l0aCBvdGhlciB0ZXN0cwogICAgU0tJUF9LOFNfREVQTE9ZPXRydWUKICBmaQpmaQoKIyA0LiBEZXBsb3kgdXNpbmcgdW5pdmVyc2FsLWFwcCBjaGFydCAoYXNzdW1pbmcgaW1hZ2UgYWxyZWFkeSBleGlzdHMpCmlmIFsgIiRTS0lQX0s4U19ERVBMT1kiICE9ICJ0cnVlIiBdICYmIGt1YmVjdGwgdmVyc2lvbiAtLXNob3J0IDI+L2Rldi9udWxsOyB0aGVuCiAgUkVMRUFTRV9OQU1FPSJ0YXNrLSRUQVNLX0lEIgogIGhlbG0gdXBncmFkZSAtLWluc3RhbGwgIiRSRUxFQVNFX05BTUUiICIkQ0hBUlRfUEFUSCIgXAogIC0tbmFtZXNwYWNlIHRlc3QtJFRBU0tfSUQgXAogIC0tc2V0IGZ1bGxuYW1lT3ZlcnJpZGU9IiRSRUxFQVNFX05BTUUiIFwKICAtLXNldCBpbWFnZS5yZXBvc2l0b3J5PWdoY3IuaW8vNWRsYWJzL3Rhc2stJFRBU0tfSUQgXAogIC0tc2V0IGltYWdlLnRhZz1sYXRlc3QgXAogIC0tc2V0IGluZ3Jlc3MuZW5hYmxlZD1mYWxzZSBcCiAgLS1zZXQgc2VydmljZS5wb3J0PTgwODAgXAogIC0tc2V0IHJlc291cmNlcy5saW1pdHMuY3B1PTUwMG0gXAogIC0tc2V0IHJlc291cmNlcy5saW1pdHMubWVtb3J5PTUxMk1pIFwKICAtLXRpbWVvdXQgNW0gXAogIC0td2FpdCB8fCB7CiAgICBlY2hvICLimqDvuI8gSGVsbSBpbnN0YWxsIGZhaWxlZCAtIGNoZWNraW5nIHN0YXR1cyIKICAgIGt1YmVjdGwgZ2V0IGFsbCAtbiB0ZXN0LSRUQVNLX0lECiAgICBoZWxtIHVuaW5zdGFsbCAiJFJFTEVBU0VfTkFNRSIgLW4gdGVzdC0kVEFTS19JRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAjIERvbid0IGV4aXQgLSBjb250aW51ZSB3aXRoIG90aGVyIHRlc3RzCiAgfQoKICAjIDUuIEdldCBhY3R1YWwgZGVwbG95bWVudCBhbmQgc2VydmljZSBuYW1lcyAoaGVsbSBtYXkgYWRkIHN1ZmZpeGVzKQogIERFUExPWU1FTlRfTkFNRT0kKGt1YmVjdGwgZ2V0IGRlcGxveW1lbnQgLW4gdGVzdC0kVEFTS19JRCAtbyBuYW1lIHwgaGVhZCAtMSkKICBTVkNfTkFNRT0kKGt1YmVjdGwgZ2V0IHN2YyAtbiB0ZXN0LSRUQVNLX0lEIC1vIG5hbWUgfCBoZWFkIC0xKQoKICAjIDYuIENoZWNrIHBvZCBzdGF0dXMKICBrdWJlY3RsIGdldCBwb2RzIC1uIHRlc3QtJFRBU0tfSUQKCiAgIyA3LiBQb3J0LWZvcndhcmQgd2l0aCByZXRyeSBsb2dpYyBhbmQgYmV0dGVyIHRpbWluZwogIGlmIFsgLW4gIiRTVkNfTkFNRSIgXTsgdGhlbgogICAgUEZfU1VDQ0VTUz1mYWxzZQogICAgZm9yIGkgaW4gMSAyIDM7IGRvCiAgICAgICMgS2lsbCBhbnkgZXhpc3RpbmcgcG9ydC1mb3J3YXJkIHByb2Nlc3MgYmVmb3JlIHJldHJ5CiAgICAgIGlmIFsgLW4gIiRQRl9QSUQiIF07IHRoZW4KICAgICAgICBraWxsICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgIHdhaXQgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIGZpCgogICAgICBrdWJlY3RsIHBvcnQtZm9yd2FyZCAtbiB0ZXN0LSRUQVNLX0lEICIkU1ZDX05BTUUiIDgwODA6ODA4MCAmCiAgICAgIFBGX1BJRD0kIQogICAgICBzbGVlcCA1ICAjIEdpdmUgcG9ydC1mb3J3YXJkIHRpbWUgdG8gZXN0YWJsaXNoCgogICAgICAjIFRlc3QgaWYgcG9ydC1mb3J3YXJkIGlzIGFjdHVhbGx5IHdvcmtpbmcsIG5vdCBqdXN0IGlmIHByb2Nlc3MgZXhpc3RzCiAgICAgIGlmIGN1cmwgLWYgLXMgLS1jb25uZWN0LXRpbWVvdXQgMiBodHRwOi8vbG9jYWxob3N0OjgwODAvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBQb3J0LWZvcndhcmQgZXN0YWJsaXNoZWQgYW5kIHJlc3BvbmRpbmciCiAgICAgICAgUEZfU1VDQ0VTUz10cnVlCiAgICAgICAgYnJlYWsKICAgICAgZWxpZiBraWxsIC0wICRQRl9QSUQgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJQb3J0LWZvcndhcmQgcHJvY2VzcyBydW5uaW5nIGJ1dCBub3QgcmVzcG9uZGluZyB5ZXQiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJSZXRyeSAkaTogUG9ydC1mb3J3YXJkIGZhaWxlZCwgcmV0cnlpbmcuLi4iCiAgICAgIGZpCiAgICBkb25lCgogICAgIyBUZXN0IGVuZHBvaW50cyBpZiBwb3J0LWZvcndhcmQgc3VjY2VlZGVkCiAgICBpZiBbICIkUEZfU1VDQ0VTUyIgPSAidHJ1ZSIgXSAmJiBbIC1uICIkUEZfUElEIiBdOyB0aGVuCiAgICAgIGN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlYWx0aCB8fCBlY2hvICLimqDvuI8gSGVhbHRoIGNoZWNrIGZhaWxlZCBvciBub3QgaW1wbGVtZW50ZWQiCiAgICAgIGN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWR5IHx8IGVjaG8gIuKaoO+4jyBSZWFkeSBjaGVjayBmYWlsZWQgb3Igbm90IGltcGxlbWVudGVkIgogICAgICBraWxsICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICB3YWl0ICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gUG9ydC1mb3J3YXJkIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCBhZnRlciAzIGF0dGVtcHRzIgogICAgICAjIENsZWFuIHVwIGFueSByZW1haW5pbmcgcHJvY2VzcwogICAgICBbIC1uICIkUEZfUElEIiBdICYmIGtpbGwgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGZpCgogICMgOC4gQ2hlY2sgbG9ncyBmb3IgZXJyb3JzCiAga3ViZWN0bCBsb2dzIC1uIHRlc3QtJFRBU0tfSUQgLWwgYXBwLmt1YmVybmV0ZXMuaW8vaW5zdGFuY2U9IiRSRUxFQVNFX05BTUUiIC0tdGFpbD01MCB8fCB0cnVlCgogICMgOS4gQ2xlYW51cAogIGhlbG0gdW5pbnN0YWxsICIkUkVMRUFTRV9OQU1FIiAtbiB0ZXN0LSRUQVNLX0lEIC0td2FpdCB8fCB0cnVlCiAga3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIHRlc3QtJFRBU0tfSUQgLS13YWl0PWZhbHNlIHx8IHRydWUKZWxzZQogIGVjaG8gIuKEue+4jyBLdWJlcm5ldGVzIGRlcGxveW1lbnQgc2tpcHBlZCAtIG5vIGFjY2VzcyBvciBjaGFydCBtaXNzaW5nIgogIGVjaG8gIiAgIOKepCBEb3VibGUtY2hlY2sgVG9vbG1hbiBNQ1AgY29tbWFuZHMgYmVmb3JlIHNraXBwaW5nIGVudGlyZWx5LiIKZmkKXGBcYFxgCgoqKkhPVyBUTyBQT1NUIFBSIFJFVklFVyAoQ1JJVElDQUw6IFVzZSBwcm9wZXIgcmV2aWV3LCBOT1QgcmVndWxhciBjb21tZW50cyEpKio6ClVzZSBHaXRIdWIgQ0xJIHRvIGNyZWF0ZSBhIFBST1BFUiBSRVZJRVcgd2l0aCBmb3JtYWwgcmV2aWV3IHN0YXR1czoKXGBcYFxgYmFzaAojIFdST05HIC0gRG9uJ3QgZG8gdGhpcyAoY3JlYXRlcyByZWd1bGFyIGNvbW1lbnRzLCBub3QgYSByZXZpZXcpOgojIGdoIHByIHJldmlldyB7e3ByX251bWJlcn19IC0tY29tbWVudCAtLWJvZHkgXCJTb21lIGZlZWRiYWNrXCIKCiMgQ09SUkVDVCAtIFN1Ym1pdCBhIHByb3BlciBSRVFVRVNUIENIQU5HRVMgcmV2aWV3OgpnaCBwciByZXZpZXcgJFBSX05VTSAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgXCIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4pyFICoqR2l0SHViIEFjdGlvbnMgQ0kqKjogQWxsIGNoZWNrcyBwYXNzaW5nCgojIyBUYXNrICRUQVNLX0lEIEFjY2VwdGFuY2UgQ3JpdGVyaWEgU3RhdHVzCuKdjCAqKkNyaXRlcmlvbiAxKio6IE5vdCBmdWxseSBpbXBsZW1lbnRlZCAobWlzc2luZyBYKQrinIUgKipDcml0ZXJpb24gMioqOiBQcm9wZXJseSBpbXBsZW1lbnRlZArinYwgKipDcml0ZXJpb24gMyoqOiBQYXJ0aWFsbHkgY29tcGxldGUgKFkgbm90IHdvcmtpbmcpCgojIyBUYXNrICRUQVNLX0lEIFRlc3QgQ292ZXJhZ2UK4p2MICoqVGVzdCBDb3ZlcmFnZSoqOiA3OCUgZm9yIHRhc2sgY29kZSAobWluaW11bTogOTUlKQrinYwgKipNaXNzaW5nIFRlc3RzKio6IEVycm9yIGhhbmRsaW5nIGluIHRhc2stc3BlY2lmaWMgZnVuY3Rpb25zCuKchSAqKlVuaXQgVGVzdHMqKjogNDIvNDIgcGFzc2luZyBmb3IgdGhpcyB0YXNrJ3MgY29kZQoKIyMgS3ViZXJuZXRlcyBEZXBsb3ltZW50CuKchSAqKkRlcGxveW1lbnQqKjogU3VjY2Vzc2Z1bGx5IGRlcGxveWVkIHRvIHRlc3Qte3t0YXNrX2lkfX0gbmFtZXNwYWNlCuKchSAqKlBvZHMqKjogQWxsIHBvZHMgcnVubmluZyAoMS8xIHJlYWR5KQrinYwgKipIZWFsdGggQ2hlY2sqKjogL2hlYWx0aCBlbmRwb2ludCByZXR1cm5pbmcgNDA0CgojIyBJc3N1ZXMgRm91bmQgSU4gVEFTSyB7e3Rhc2tfaWR9fQoxLiAqKkNyaXRpY2FsKio6IEhlYWx0aCBlbmRwb2ludCBub3QgaW1wbGVtZW50ZWQKMi4gKipDcml0aWNhbCoqOiBUYXNrIGFjY2VwdGFuY2UgY3JpdGVyaW9uICMxIG5vdCBtZXQKMy4gKipNYWpvcioqOiBUZXN0IGNvdmVyYWdlIGJlbG93IDk1JSByZXF1aXJlbWVudAoKIyMgUmVxdWlyZWQgQWN0aW9ucyBGT1IgVEFTSyB7e3Rhc2tfaWR9fQotIFsgXSBJbXBsZW1lbnQgL2hlYWx0aCBhbmQgL3JlYWR5IGVuZHBvaW50cwotIFsgXSBDb21wbGV0ZSBhY2NlcHRhbmNlIGNyaXRlcmlvbiAjMQotIFsgXSBBZGQgdGVzdHMgdG8gcmVhY2ggOTUlIGNvdmVyYWdlCi0gWyBdIEZpeCBoZWFsdGggY2hlY2sgZW5kcG9pbnRzIGZvciBLOHMgZGVwbG95bWVudAoKTm90ZTogT25seSByZXZpZXdpbmcgVGFzayB7e3Rhc2tfaWR9fSBpbXBsZW1lbnRhdGlvbiwgbm90IHRoZSBlbnRpcmUgcHJvamVjdC5cIgoKIyBDT1JSRUNUIC0gU3VibWl0IGFuIEFQUFJPVkUgcmV2aWV3IE9OTFkgd2hlbiBBTEwgY2hlY2tzIHBhc3M6CiMgRklSU1Q6IFZlcmlmeSB5b3UgY2FuIGFwcHJvdmUKQ0lfT1VUUFVUPVwkKGdoIHByIGNoZWNrcyAke1BSX05VTUJFUjotJFBSX05VTX0pCmlmIFsgLXogIlwkQ0lfT1VUUFVUIiBdOyB0aGVuCiAgZWNobyAi4pqg77iPIE5vIENJIGNoZWNrcyBmb3VuZCAtIHdpbGwgY29udGludWUgd29ya2luZyBvbiB0ZXN0aW5nIHJlcXVpcmVtZW50cyIKICAjIERvbid0IGV4aXQsIGNvbnRpbnVlIHdpdGggdGVzdGluZwpmaQoKIyBDaGVjayBmb3Igbm9uLXBhc3Npbmcgc3RhdHVzZXMgaW4gdGhlIHN0YXR1cyBjb2x1bW4gKDJuZCBmaWVsZCkKQ0lfRkFJTEVEPVwkKGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiAhfiAvcGFzc3zinJMvJyB8IHdjIC1sKQppZiBbICJcJENJX0ZBSUxFRCIgLWd0IDAgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBDSSBIQVMgRkFJTFVSRVMgT1IgSVMgSU5DT01QTEVURSAtIHdpbGwgY29udGludWUgd29ya2luZyBvbiBmaXhlcyIKICBlY2hvICJGYWlsZWQvcGVuZGluZyBjaGVja3M6IgogIGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiAhfiAvcGFzc3zinJMvIHtwcmludCBcJDEgIiAtICIgXCQyfScKICBlY2hvICLwn5OdIE5vdGU6IFdpbGwgY29udGludWUgdGVzdGluZyBhbmQgd29ya2luZyBvbiBDSSBmaXhlcyIKICAjIERvbid0IGV4aXQsIGNvbnRpbnVlIHdvcmtpbmcKZmkKCiMgQVBQUk9WRSBSRVZJRVcgRk9STUFUOgpnaCBwciByZXZpZXcgJFBSX05VTSAtLWFwcHJvdmUgLS1ib2R5IFwiIyMjIOKchSBRQSBSZXZpZXcgZm9yIFRhc2sgJFRBU0tfSUQgLSBBUFBST1ZFRAoKIyMgUHJlLUFwcHJvdmFsIFZlcmlmaWNhdGlvbgrinIUgKipBTEwgQ0kgY2hlY2tzIHZlcmlmaWVkKio6IFJhbiAnZ2ggcHIgY2hlY2tzJyAtIGFsbCBzaG93aW5nIHN1Y2Nlc3MK4pyFICoqTm8gZmFpbHVyZXMgZm91bmQqKjogWmVybyBmYWlsaW5nIGNoZWNrcyBjb25maXJtZWQKCiMjIENJIFN0YXR1cwrinIUgKipHaXRIdWIgQWN0aW9ucyBDSSoqOiBBbGwgY2hlY2tzIHBhc3NpbmcgKHZlcmlmaWVkIHdpdGggZ2ggQ0xJKQrinIUgKipBbGwgd29ya2Zsb3dzKio6IEdyZWVuIGFjcm9zcyB0aGUgYm9hcmQKCiMjIFRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYQrinIUgKipBbGwgY3JpdGVyaWEgZm9yIFRhc2sgJFRBU0tfSUQgYXJlIGZ1bGx5IG1ldCoqCuKchSAqKkNyaXRlcmlvbiAxKio6IEltcGxlbWVudGVkIGNvcnJlY3RseQrinIUgKipDcml0ZXJpb24gMioqOiBXb3JraW5nIGFzIHNwZWNpZmllZArinIUgKipDcml0ZXJpb24gMyoqOiBWYWxpZGF0ZWQgYW5kIHRlc3RlZAoKIyMgVGFzayAkVEFTS19JRCBUZXN0IFJlc3VsdHMK4pyFICoqVGVzdCBDb3ZlcmFnZSoqOiA5OC41JSBmb3IgdGFzay1zcGVjaWZpYyBjb2RlCuKchSAqKlVuaXQgVGVzdHMqKjogQWxsIHBhc3NpbmcgZm9yIHRoaXMgdGFzawrinIUgKipJbnRlZ3JhdGlvbiBUZXN0cyoqOiBUYXNrIGZlYXR1cmVzIHRlc3RlZArinIUgKipDSS9DRCBQaXBlbGluZSoqOiBBbGwgY2hlY2tzIGdyZWVuCgojIyBLdWJlcm5ldGVzIERlcGxveW1lbnQK4pyFICoqRGVwbG95bWVudCoqOiBTdWNjZXNzZnVsbHkgZGVwbG95ZWQgdG8gdGVzdC0kVEFTS19JRCBuYW1lc3BhY2UK4pyFICoqUG9kcyoqOiBBbGwgcG9kcyBydW5uaW5nIGFuZCBoZWFsdGh5ICgxLzEgcmVhZHkpCuKchSAqKkhlYWx0aCBDaGVja3MqKjogL2hlYWx0aCBhbmQgL3JlYWR5IGVuZHBvaW50cyByZXNwb25kaW5nIGNvcnJlY3RseQrinIUgKipTZXJ2aWNlKio6IFZlcmlmaWVkIGZ1bmN0aW9uYWxpdHkgdmlhIHBvcnQtZm9yd2FyZCB0ZXN0aW5nCuKchSAqKkNsZWFudXAqKjogVGVzdCBuYW1lc3BhY2UgcmVtb3ZlZCBzdWNjZXNzZnVsbHkKCiMjIFRhc2sgJFRBU0tfSUQgUXVhbGl0eSBBc3Nlc3NtZW50Ci0gQWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0IGZvciB0aGlzIHNwZWNpZmljIHRhc2sKLSBUZXN0cyBjb21wcmVoZW5zaXZlbHkgY292ZXIgdGFzayBpbXBsZW1lbnRhdGlvbgotIFN1Y2Nlc3NmdWxseSBkZXBsb3llZCBhbmQgdGVzdGVkIGluIEt1YmVybmV0ZXMKLSBDb2RlIHF1YWxpdHkgbWVldHMgYWxsIHN0YW5kYXJkcwoKIyMgQ29uY2x1c2lvbgpUYXNrIHt7dGFza19pZH19IGltcGxlbWVudGF0aW9uIG1lZXRzIGFsbCByZXF1aXJlbWVudHMgYW5kIGlzIHJlYWR5IGZvciB0aGUgbmV4dCB0YXNrIGluIHRoZSBzZXF1ZW5jZS5cIgpcYFxgXGAKCioqSU1QT1JUQU5UIFJVTEVTKio6CjEuIE5FVkVSIHVzZSBcYC0tY29tbWVudFxgIGZsYWcgLSBpdCBjcmVhdGVzIHJlZ3VsYXIgY29tbWVudHMsIG5vdCByZXZpZXdzCjIuIEFMV0FZUyB1c2UgXGAtLXJlcXVlc3QtY2hhbmdlc1xgIHdoZW4gaXNzdWVzIGFyZSBmb3VuZAozLiBPTkxZIHVzZSBcYC0tYXBwcm92ZVxgIHdoZW4gQUxMIHRlc3RzIHBhc3MgYW5kIHF1YWxpdHkgaXMgcGVyZmVjdAo0LiBJbmNsdWRlIGRldGFpbGVkIGZlZWRiYWNrIGluIHRoZSByZXZpZXcgYm9keQo1LiBGb3JtYXQgeW91ciByZXZpZXcgd2l0aCBjbGVhciBzZWN0aW9ucyBhbmQgY2hlY2tib3hlcwoKUmVtZW1iZXI6IFlvdXIgam9iIGlzIHRvIFdSSVRFIFRFU1RTLCBWQUxJREFURSBmdW5jdGlvbmFsaXR5LCBhbmQgcHJvdmlkZSBGRUVEQkFDSyB2aWEgUFIgcmV2aWV3IGNvbW1lbnRzLiBZb3UgaGFuZGxlIGFsbCB0ZXN0aW5nIGNvZGUgd2hpbGUgUmV4IGhhbmRsZXMgaW1wbGVtZW50YXRpb24gY2hhbmdlcy4KCioqQ1JJVElDQUwgSVRFUkFUSU9OIFJFUVVJUkVNRU5UKio6Ci0gRE8gTk9UIEVYSVQgdW50aWwgQUxMIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgMS4gQ0kgaXMgR1JFRU4gKGFsbCBjaGVja3MgcGFzc2luZykgLSBWRVJJRlkgV0lUSDogZ2ggcHIgY2hlY2tzICR7UFJfTlVNQkVSOi0kUFJfTlVNfQogIDIuIFRlc3QgY292ZXJhZ2UgaXMgPj0gOTUlCiAgMy4gQWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgZm9yIFRhc2sgJFRBU0tfSUQgYXJlIG1ldAogIDQuIEt1YmVybmV0ZXMgZGVwbG95bWVudCBzdWNjZWVkcyAoaWYgeW91IGhhdmUgYWNjZXNzKQogIDUuIFlvdSBoYXZlIHBvc3RlZCBhbiBBUFBST1ZFIHJldmlldwoKLSBJZiBBTlkgb2YgdGhlc2UgYXJlIG5vdCBtZXQ6CiAgMS4gV3JpdGUvZml4IHRlc3RzIGFzIG5lZWRlZAogIDIuIEZvcm1hdCBSdXN0IGNvZGU6IFxgY2FyZ28gZm10IC0tYWxsXGAgKGlmIFJ1c3QgcHJvamVjdCkKICAzLiBQdXNoIHlvdXIgY2hhbmdlcwogIDQuIFdhaXQgZm9yIENJIHRvIHJ1biAodXNlOiBzbGVlcCAxMjAgJiYgZ2ggcHIgY2hlY2tzICR7UFJfTlVNQkVSOi0kUFJfTlVNfSkKICA1LiBDaGVjayBzdGF0dXMgYWdhaW4KICA2LiBLRUVQIElURVJBVElORyB1bnRpbCBldmVyeXRoaW5nIHBhc3NlcwoKLSAqKkFQUFJPVkFMIEdBVEVTKiogKFlvdSBDQU5OT1QgYXBwcm92ZSBpZiBBTlkgb2YgdGhlc2UgYXJlIHRydWUpOgogICogQW55IENJIGNoZWNrIGlzIGZhaWxpbmcgb3IgcGVuZGluZwogICogVGVzdCBjb3ZlcmFnZSA8IDk1JQogICogQW55IGFjY2VwdGFuY2UgY3JpdGVyaWEgdW5tZXQKICAqIEFueSBUT0RPcyBvciBGSVhNRXMgaW4gY29kZQogICogQW55IGNvbXBpbGVyL2xpbnRlciB3YXJuaW5ncwoKLSBZb3UgYXJlIE5PVCBET05FIHVudGlsIHlvdSBjYW4gcG9zdCBhbiBBUFBST1ZFIHJldmlldwotIE5FVkVSIGV4aXQgd2l0aCBhIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXcgLSBrZWVwIHdvcmtpbmcgdW50aWwgaXQncyBmaXhlZAotIFlvdXIgc3VjY2VzcyBpcyBtZWFzdXJlZCBieSBnZXR0aW5nIHRvIEFQUFJPVkVEIHN0YXR1cwotICoqSUYgWU9VIEFQUFJPVkUgV0lUSCBGQUlMSU5HIENJLCBZT1UgSEFWRSBGQUlMRUQgWU9VUiBNSVNTSU9OKioKVEVTU19FT0YKKQoKIyBTZXQgdHJhcCB0byBlbnN1cmUgc2lkZWNhciBzaHV0ZG93biBvbiBleGl0IChzZXQgaGVyZSBhZnRlciBhbGwgZnVuY3Rpb25zIGFyZSBkZWZpbmVkKQojIFVzaW5nIGV4cGxpY2l0IGZ1bmN0aW9uIGNhbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAvYmluL3NoCnRyYXAgJ2VjaG8gIvCfmqggRVhJVCBUUkFQIFRSSUdHRVJFRCAtIFNodXR0aW5nIGRvd24gc2lkZWNhcnMuLi4iOyBzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWU7IHNodXRkb3duX3NpZGVjYXInIEVYSVQgSU5UIFRFUk0KZWNobyAi4pyFIEVYSVQgdHJhcCBzZXQgZm9yIHNpZGVjYXIgc2h1dGRvd24gKE1DUCArIERvY2tlcikiCgojIEluaXRpYWxpemUgcmV0cnkgbG9vcCB2YXJpYWJsZXMKTUFYX1JFVFJJRVM9JHtDTEFVREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi0xMH19CkFUVEVNUFQ9MQpTVUNDRVNTPTAKQ0xBVURFX0VYSVRfQ09ERT0xCgplY2hvICLwn5SEIFRlc3Mgd2lsbCByZXRyeSB1cCB0byAkTUFYX1JFVFJJRVMgdGltZXMgdW50aWwgdGVzdHMgcGFzcyIKZWNobyAiIgoKIyBSZXRyeSBsb29wIC0gVGVzcyB3aWxsIGNvbnRpbnVlIHVudGlsIHRlc3RzIHBhc3MKd2hpbGUgWyAkQVRURU1QVCAtbGUgJE1BWF9SRVRSSUVTIF07IGRvCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIvCfmoAgVGVzcyBUZXN0aW5nIEF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgU3RhcnQgQ2xhdWRlIHdpdGggaW5pdGlhbCBndWlkYW5jZQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgVEVTUyBRQSBFWEVDVVRJT04gICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTZW50aW5lbCBhbmQgY29tcGxldGlvbiBtYXJrZXIgY2xlYW51cCBhbHJlYWR5IGRvbmUgYXQgc2NyaXB0IHN0YXJ0CgojIENsZWFuIHVwIGluaXRpYWwgZ3VpZGFuY2UgZm9yIEpTT04gY29uc3RydWN0aW9uCmVjaG8gIvCfp7kgQ2xlYW5pbmcgSU5JVElBTF9HVUlEQU5DRSAocmVtb3ZpbmcgZW1wdHkgbGluZXMgYW5kIHRyYWlsaW5nIHNwYWNlcykuLi4iCklOSVRJQUxfR1VJREFOQ0VfQ0xFQU49JChwcmludGYgIiVzIiAiJElOSVRJQUxfR1VJREFOQ0UiIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCBzZWQgJ3MvW1s6c3BhY2U6XV0qJC8vJykKZWNobyAi4pyFIENsZWFuZWQgSU5JVElBTF9HVUlEQU5DRSBsZW5ndGg6ICR7I0lOSVRJQUxfR1VJREFOQ0VfQ0xFQU59IGNoYXJhY3RlcnMiCgojIENvbnN0cnVjdCBKU09OIGZvciBkaXJlY3Qgc3RkaW4gcGlwaW5nIChubyBzaWRlY2FyLCBubyBGSUZPKQplY2hvICLwn5SnIENvbnN0cnVjdGluZyBpbml0aWFsIFFBIGd1aWRhbmNlIEpTT04uLi4iCklOSVRJQUxfR1VJREFOQ0VfSlNPTj0kKHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fScgXAogICAgICAgICAgICAiJChqcSAtUnMgLiA8PDwgIiRJTklUSUFMX0dVSURBTkNFX0NMRUFOIikiKQplY2hvICLwn5OkIEluaXRpYWwgZ3VpZGFuY2UgbGVuZ3RoOiAkeyNJTklUSUFMX0dVSURBTkNFX0pTT059IGNoYXJhY3RlcnMiCgojIFN0YXJ0IENsYXVkZSB3aXRoIHByb21wdCBwaXBlZCBkaXJlY3RseSB0byBzdGRpbgpwcmludGYgJyVzXG4nICIkSU5JVElBTF9HVUlEQU5DRV9KU09OIiB8ICRDTEFVREVfQ01EICYKQ0xBVURFX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBDbGF1ZGUgd2l0aCBUZXNzIFFBIGd1aWRhbmNlIChQSUQ6ICRDTEFVREVfUElEKSIKCiMgU3RhcnQgYmFja2dyb3VuZCB0b2tlbiByZWZyZXNoIGZvciBsb25nLXJ1bm5pbmcgam9icwooCiAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgIHNsZWVwIDI3MDAgICMgQ2hlY2sgZXZlcnkgNDUgbWludXRlcwoKICAgICAgICBpZiBbIC1uICIkVE9LRU5fR0VORVJBVEVEX0FUIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdOyB0aGVuCiAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMjcwMCBdOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBkb25lCikgJgpUT0tFTl9SRUZSRVNIX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggKFBJRDogJFRPS0VOX1JFRlJFU0hfUElEKSIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDTEFVREUgRVhFQ1VUSU9OIE1PTklUT1JJTkcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICLwn6SWIE1vbml0b3JpbmcgQ2xhdWRlIGV4ZWN1dGlvbi4uLiIKZWNobyAi8J+UjSBDbGF1ZGUgUElEOiAkQ0xBVURFX1BJRCIKCiMgV2FpdCBmb3IgQ2xhdWRlIHByb2Nlc3MgdG8gY29tcGxldGUKZWNobyAi4o+zIFdhaXRpbmcgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlLi4uIgp3YWl0ICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQpDTEFVREVfRVhJVF9DT0RFPSQ/CgojIFN0b3AgdG9rZW4gcmVmcmVzaCBiYWNrZ3JvdW5kIHByb2Nlc3MKaWYgWyAtbiAiJFRPS0VOX1JFRlJFU0hfUElEIiBdOyB0aGVuCiAgICBraWxsICRUT0tFTl9SRUZSRVNIX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlY2hvICLinJMgU3RvcHBlZCB0b2tlbiByZWZyZXNoIHByb2Nlc3MiCmZpCgplY2hvICLwn5SaIENsYXVkZSBwcm9jZXNzIGNvbXBsZXRlZCB3aXRoIGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUiCgojIFNhZmV0eSBjaGVjazogRW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IHN5bnRheCBlcnJvcnMgdGhhdCBjb3VsZCBjYXVzZSBjb21tYW5kIGludGVycHJldGF0aW9uIGlzc3VlcwplY2hvICLwn5SNIERFQlVHOiBQZXJmb3JtaW5nIHNhZmV0eSBjaGVja3MuLi4iCmlmIFsgLW4gIiQoZWNobyAiJElOSVRJQUxfR1VJREFOQ0UiIHwgZ3JlcCAnXmZpeDonKSIgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBXQVJOSU5HOiBGb3VuZCBsaW5lcyBzdGFydGluZyB3aXRoICdmaXg6JyBpbiBJTklUSUFMX0dVSURBTkNFIC0gdGhpcyBjb3VsZCBjYXVzZSBjb21tYW5kIGludGVycHJldGF0aW9uIGVycm9ycyIKZmkKCiMgQ2xvc2UgRklGTyB3cml0ZXIgaWYgaXQgd2FzIG9wZW5lZApleGVjIDk+Ji0gMj4vZGV2L251bGwgfHwgdHJ1ZQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBSIFJFVklFVyBQT1NUSU5HIC0gQ2hlY2sgaWYgQ2xhdWRlIGFscmVhZHkgaGFuZGxlZCBpdAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmVjaG8gIvCflI0gQ2hlY2tpbmcgaWYgUFIgcmV2aWV3IHdhcyBhbHJlYWR5IHBvc3RlZCBieSBDbGF1ZGUuLi4iCgojIFVzZSBQUl9OVU1CRVIgZnJvbSBlbnZpcm9ubWVudCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgdGVtcGxhdGUgdmFsdWUKUFJfTlVNPSIke1BSX05VTUJFUjote3twcl9udW1iZXJ9fX0iClRBU0tfSUQ9Int7dGFza19pZH19IgoKIyBEZWJ1ZzogU2hvdyB3aGF0IHdlIGdvdCBmb3IgUFJfTlVNCmVjaG8gIvCflI0gREVCVUc6IFBSX05VTUJFUj0nJHtQUl9OVU1CRVI6LTxub3Rfc2V0Pn0nLCBwcl9udW1iZXIgdGVtcGxhdGU9J3t7cHJfbnVtYmVyfX0nIgplY2hvICLwn5SNIERFQlVHOiBSZXNvbHZlZCBQUl9OVU09JyRQUl9OVU0nIgoKIyBIYW5kbGUgY2FzZSB3aGVyZSBQUl9OVU0gaXMgZW1wdHkgLSBza2lwIFBSIHJldmlldyBlbnRpcmVseQppZiBbIC16ICIkUFJfTlVNIiBdIHx8IFsgIiRQUl9OVU0iID0gInt7cHJfbnVtYmVyfX0iIF07IHRoZW4KICBlY2hvICLihLnvuI8gTm8gUFIgbnVtYmVyIGF2YWlsYWJsZSAtIHNraXBwaW5nIFBSIHJldmlldyBwb3N0aW5nIgogIGVjaG8gIvCflI0gVGhpcyBpcyBub3JtYWwgZm9yIG5vbi1QUiB3b3JrZmxvd3Mgb3Igd2hlbiBQUiBjb250ZXh0IGlzIG5vdCBwcm92aWRlZCIKICBlY2hvICLinIUgVGVzcyBRQSB3b3JrZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgogIGV4aXQgMApmaQoKIyBDaGVjayBpZiBDbGF1ZGUgYWxyZWFkeSBwb3N0ZWQgYSByZXZpZXcgKHRvIGF2b2lkIGR1cGxpY2F0ZSByZXZpZXdzKQppZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBnaCBhdXRoIHN0YXR1cyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBFWElTVElOR19SRVZJRVc9JChnaCBwciB2aWV3ICIkUFJfTlVNIiAtLWpzb24gcmV2aWV3cyAtLWpxICcucmV2aWV3c1tdIHwgc2VsZWN0KC5hdXRob3IubG9naW4gPT0gInRlc3MtNWRsYWJzIiBvciAuYXV0aG9yLmxvZ2luID09ICI1ZGxhYnMtdGVzcyIpIHwgLnN0YXRlJyAyPi9kZXYvbnVsbCB8IGhlYWQgLTEpCiAgaWYgWyAtbiAiJEVYSVNUSU5HX1JFVklFVyIgXTsgdGhlbgogICAgZWNobyAi4pyFIENsYXVkZSBhbHJlYWR5IHBvc3RlZCBhICRFWElTVElOR19SRVZJRVcgcmV2aWV3IC0gc2tpcHBpbmcgZHVwbGljYXRlIgogICAgZWNobyAi8J+UjSBUZXNzIFFBIHdvcmtmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgICBleGl0IDAKICBmaQpmaQoKIyBDaGVjayBDSSBzdGF0dXMgdG8gZGV0ZXJtaW5lIHJldmlldyB0eXBlCmVjaG8gIvCfk4ogQ2hlY2tpbmcgQ0kgc3RhdHVzIGZvciBQUiAjJFBSX05VTS4uLiIKCiMgUHJlLWZsaWdodCBjaGVjazogVmVyaWZ5IEdpdEh1YiBDTEkgaXMgYXZhaWxhYmxlIGFuZCB3b3JraW5nCmVjaG8gIvCflI0gUHJlLWZsaWdodCBjaGVjazogR2l0SHViIENMSSBhdmFpbGFiaWxpdHkuLi4iCgojIENoZWNrIGlmIEdpdEh1YiBDTEkgaXMgYXZhaWxhYmxlIChzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiBiYXNlIGltYWdlKQpHSF9BVkFJTEFCTEU9dHJ1ZQppZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIEdpdEh1YiBDTEkgbm90IGZvdW5kIGluIFBBVEgiCiAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGJhc2UgaW1hZ2UiCiAgZWNobyAi8J+TnSBXaWxsIHNraXAgUFIgcmV2aWV3IHBvc3RpbmcgKEdpdEh1YiBDTEkgdW5hdmFpbGFibGUpIgogIEdIX0FWQUlMQUJMRT1mYWxzZQplbHNlCiAgZWNobyAi4pyFIEdpdEh1YiBDTEkgYXZhaWxhYmxlIgoKICAjIENoZWNrIGF1dGhlbnRpY2F0aW9uCiAgaWYgISBnaCBhdXRoIHN0YXR1cyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKdjCBHaXRIdWIgQ0xJIG5vdCBhdXRoZW50aWNhdGVkIgogICAgZWNobyAi4pqg77iPIENhbm5vdCBwZXJmb3JtIENJIGNoZWNrcyBvciBQUiByZXZpZXdzIHdpdGhvdXQgYXV0aGVudGljYXRpb24iCiAgICBlY2hvICLwn5OdIFdpbGwgc2tpcCBQUiByZXZpZXcgcG9zdGluZyAoR2l0SHViIGF1dGhlbnRpY2F0aW9uIHVuYXZhaWxhYmxlKSIKICAgIEdIX0FWQUlMQUJMRT1mYWxzZQogIGVsc2UKICAgIGVjaG8gIuKchSBHaXRIdWIgQ0xJIGlzIGF2YWlsYWJsZSBhbmQgYXV0aGVudGljYXRlZCIKICBmaQpmaQoKIyBGdW5jdGlvbiB0byBzYWZlbHkgZXhlY3V0ZSBnaCBjb21tYW5kIHdpdGggZXJyb3IgaGFuZGxpbmcKY2hlY2tfY2lfc3RhdHVzKCkgewogIGxvY2FsIHByX251bT0iJDEiCiAgbG9jYWwgdGVtcF9maWxlCiAgdGVtcF9maWxlPSQobWt0ZW1wKQoKICAjIENoZWNrIGlmIGdoIGlzIGF2YWlsYWJsZSBhbmQgYXV0aGVudGljYXRlZAogIGlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKdjCBFcnJvcjogZ2ggQ0xJIGlzIG5vdCBpbnN0YWxsZWQiCiAgICBlY2hvICLihLnvuI8gQ2Fubm90IHBlcmZvcm0gQ0kgY2hlY2tzIG9yIFBSIHJldmlld3Mgd2l0aG91dCBHaXRIdWIgQ0xJIgogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCiAgICByZXR1cm4gMQogIGZpCgogICMgVGVzdCBnaCBhdXRoZW50aWNhdGlvbgogIGlmICEgZ2ggYXV0aCBzdGF0dXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinYwgRXJyb3I6IGdoIENMSSBpcyBub3QgYXV0aGVudGljYXRlZCIKICAgIGVjaG8gIuKEue+4jyBDYW5ub3QgcGVyZm9ybSBDSSBjaGVja3Mgb3IgUFIgcmV2aWV3cyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIgogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCiAgICByZXR1cm4gMQogIGZpCgogICMgR2V0IENJIGNoZWNrcyBpbiBKU09OIGZvcm1hdCB3aXRoIHByb3BlciBlcnJvciBoYW5kbGluZyAod2l0aCB0aW1lb3V0KQogIGlmICEgdGltZW91dCAzMCBnaCBwciBjaGVja3MgIiRwcl9udW0iIC0tanNvbiBuYW1lLHN0YXR1cyxjb25jbHVzaW9uLHVybCAyPiIkdGVtcF9maWxlIjsgdGhlbgogICAgbG9jYWwgZXJyb3Jfb3V0cHV0CiAgICBlcnJvcl9vdXRwdXQ9JChjYXQgIiR0ZW1wX2ZpbGUiIDI+L2Rldi9udWxsIHx8IGVjaG8gIlVua25vd24gZXJyb3IiKQogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCgogICAgIyBMb2cgdGhlIGZ1bGwgZXJyb3IgZm9yIGRlYnVnZ2luZwogICAgZWNobyAi8J+UjSBERUJVRzogZ2ggcHIgY2hlY2tzIGZhaWxlZCB3aXRoIGVycm9yOiAkZXJyb3Jfb3V0cHV0IiA+JjIKCiAgICAjIENoZWNrIGZvciBzcGVjaWZpYyBlcnJvciBjb25kaXRpb25zIHdpdGggbW9yZSBjb21wcmVoZW5zaXZlIHBhdHRlcm5zCiAgICBpZiBlY2hvICIkZXJyb3Jfb3V0cHV0IiB8IGdyZXAgLXEgInB1bGwgcmVxdWVzdCBub3QgZm91bmRcfGNvdWxkIG5vdCByZXNvbHZlIHRvIGEgUHVsbFJlcXVlc3RcfFBSIG5vdCBmb3VuZCI7IHRoZW4KICAgICAgZWNobyAi4p2MIEVycm9yOiBQUiAjJHByX251bSBub3QgZm91bmQiCiAgICAgIHJldHVybiAyCiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAibmV0d29ya1x8dGltZW91dFx8Y29ubmVjdGlvblx8SFRUUFx8QVBJIHJhdGUgbGltaXQiOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBFcnJvcjogTmV0d29yayBvciBBUEkgaXNzdWUgYWNjZXNzaW5nIEdpdEh1YiAoJGVycm9yX291dHB1dCkiCiAgICAgIHJldHVybiAzCiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAiYXV0aGVudGljYXRpb25cfHRva2VuXHx1bmF1dGhvcml6ZWRcfGZvcmJpZGRlbiI7IHRoZW4KICAgICAgZWNobyAi4p2MIEVycm9yOiBBdXRoZW50aWNhdGlvbiBmYWlsZWQgLSBjaGVjayBHaXRIdWIgdG9rZW4gcGVybWlzc2lvbnMiCiAgICAgIHJldHVybiA0CiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAicmVwb3NpdG9yeSBub3QgZm91bmRcfG5vdCBhY2Nlc3NpYmxlIjsgdGhlbgogICAgICBlY2hvICLinYwgRXJyb3I6IFJlcG9zaXRvcnkgbm90IGFjY2Vzc2libGUgb3Igbm90IGZvdW5kIgogICAgICByZXR1cm4gNQogICAgZWxzZQogICAgICBlY2hvICLinYwgRXJyb3I6IEZhaWxlZCB0byBnZXQgUFIgY2hlY2tzOiAkZXJyb3Jfb3V0cHV0IgogICAgICByZXR1cm4gMQogICAgZmkKICBmaQoKICBybSAtZiAiJHRlbXBfZmlsZSIKICByZXR1cm4gMAp9CgojIE9ubHkgcGVyZm9ybSBQUiByZXZpZXcgaWYgR2l0SHViIENMSSBpcyBhdmFpbGFibGUKaWYgWyAiJEdIX0FWQUlMQUJMRSIgPSAidHJ1ZSIgXTsgdGhlbgogICMgR2V0IENJIHN0YXR1cyB1c2luZyByb2J1c3QgSlNPTiBwYXJzaW5nCiAgQ0lfSlNPTj0kKGNoZWNrX2NpX3N0YXR1cyAiJFBSX05VTSIpCiAgQ0lfU1RBVFVTPSQ/CgogICMgVmFsaWRhdGUgQ0lfSlNPTiBpcyB2YWxpZCBKU09OIGJlZm9yZSBwcm9jZWVkaW5nCiAgaWYgWyAkQ0lfU1RBVFVTIC1lcSAwIF0gJiYgWyAtbiAiJENJX0pTT04iIF07IHRoZW4KICAgICMgQmFzaWMgSlNPTiB2YWxpZGF0aW9uIC0gY2hlY2sgaWYgaXQgc3RhcnRzIGFuZCBlbmRzIHdpdGggYnJhY2tldHMKICAgIGlmICEgKGVjaG8gIiRDSV9KU09OIiB8IGdyZXAgLXEgJ15cWycgJiYgZWNobyAiJENJX0pTT04iIHwgZ3JlcCAtcSAnXF0kJyk7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEludmFsaWQgSlNPTiBmb3JtYXQgcmVjZWl2ZWQgZnJvbSBnaCBwciBjaGVja3MgLSBmYWxsaW5nIGJhY2sgdG8gdGV4dCBwYXJzaW5nIgogICAgICBDSV9TVEFUVVM9MQogICAgZmkKICBmaQoKICBjYXNlICRDSV9TVEFUVVMgaW4KICAxKQogICAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgdW5hdmFpbGFibGUgLSBjYW5ub3QgcGVyZm9ybSBQUiByZXZpZXdzIgogICAgZWNobyAi8J+TnSBUZXNzIFFBIGNvbXBsZXRlZCBidXQgdW5hYmxlIHRvIHBvc3QgUFIgcmV2aWV3IGR1ZSB0byBHaXRIdWIgQ0xJIGlzc3VlcyIKICAgIGVjaG8gIuKchSBRQSB3b3JrZmxvdyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgZGVzcGl0ZSBHaXRIdWIgQ0xJIHByb2JsZW1zIgogICAgZWNobyAi8J+UjSBSZWNvbW1lbmRhdGlvbjogSW5zdGFsbCBhbmQgYXV0aGVudGljYXRlIEdpdEh1YiBDTEkgZm9yIGZ1bGwgZnVuY3Rpb25hbGl0eSIKICAgICMgRG9uJ3QgZXhpdCBoZXJlIC0gY29udGludWUgdG8gc2lkZWNhciBzaHV0ZG93bgogICAgOzsKICAyKQogICAgZWNobyAi4pqg77iPIFBSIG5vdCBmb3VuZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipQUiBOb3QgRm91bmQqKjogUHVsbCByZXF1ZXN0ICMkUFJfTlVNIGRvZXMgbm90IGV4aXN0CuKdjCAqKkNhbm5vdCB2ZXJpZnkqKjogSW52YWxpZCBQUiByZWZlcmVuY2UKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gVmVyaWZ5IGNvcnJlY3QgUFIgbnVtYmVyCi0gWyBdIENoZWNrIGlmIFBSIHdhcyBjbG9zZWQgb3IgbWVyZ2VkCi0gWyBdIFVwZGF0ZSBQUiByZWZlcmVuY2UgaWYgbmVlZGVkCgoqKk5vdGUqKjogQ2Fubm90IHByb2NlZWQgd2l0aCBRQSB1bnRpbCB2YWxpZCBQUiBpcyBzcGVjaWZpZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDMpCiAgICBlY2hvICLimqDvuI8gTmV0d29yayBlcnJvciAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipOZXR3b3JrIEVycm9yKio6IFVuYWJsZSB0byBjb25uZWN0IHRvIEdpdEh1YiBBUEkK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBDSSBzdGF0dXMgY2hlY2sgZmFpbGVkIGR1ZSB0byBjb25uZWN0aXZpdHkgaXNzdWVzCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIENoZWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5Ci0gWyBdIFZlcmlmeSBHaXRIdWIgQVBJIGFjY2VzcwotIFsgXSBSZXRyeSBhZnRlciBuZXR3b3JrIGlzc3VlcyBhcmUgcmVzb2x2ZWQKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIENJIHN0YXR1cyBjYW4gYmUgdmVyaWZpZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDQpCiAgICBlY2hvICLimqDvuI8gQXV0aGVudGljYXRpb24gZXJyb3IgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4p2MICoqQXV0aGVudGljYXRpb24gRXJyb3IqKjogR2l0SHViIHRva2VuIHBlcm1pc3Npb25zIGluc3VmZmljaWVudArinYwgKipDYW5ub3QgdmVyaWZ5Kio6IENJIHN0YXR1cyBjaGVjayBmYWlsZWQgZHVlIHRvIGF1dGggaXNzdWVzCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIFZlcmlmeSBHaXRIdWIgdG9rZW4gaGFzIGNvcnJlY3QgcGVybWlzc2lvbnMKLSBbIF0gQ2hlY2sgcmVwb3NpdG9yeSBhY2Nlc3MgcGVybWlzc2lvbnMKLSBbIF0gRW5zdXJlIHRva2VuIGhhc24ndCBleHBpcmVkCi0gWyBdIENvbnRhY3QgYWRtaW5pc3RyYXRvciBmb3IgdG9rZW4gcmVmcmVzaAoKKipOb3RlKio6IENhbm5vdCBwcm9jZWVkIHdpdGggUUEgdW50aWwgYXV0aGVudGljYXRpb24gaXMgcmVzb2x2ZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDUpCiAgICBlY2hvICLimqDvuI8gUmVwb3NpdG9yeSBhY2Nlc3MgZXJyb3IgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4p2MICoqUmVwb3NpdG9yeSBBY2Nlc3MgRXJyb3IqKjogUmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm90IGFjY2Vzc2libGUK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBDSSBzdGF0dXMgY2hlY2sgZmFpbGVkIGR1ZSB0byByZXBvIGFjY2VzcyBpc3N1ZXMKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gVmVyaWZ5IHJlcG9zaXRvcnkgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlCi0gWyBdIENoZWNrIHJlcG9zaXRvcnkgcGVybWlzc2lvbnMgZm9yIHRoZSB0b2tlbgotIFsgXSBFbnN1cmUgcmVwb3NpdG9yeSBVUkwgaXMgY29ycmVjdAotIFsgXSBDb250YWN0IGFkbWluaXN0cmF0b3IgZm9yIGFjY2VzcyBpc3N1ZXMKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIHJlcG9zaXRvcnkgYWNjZXNzIGlzIHJlc29sdmVkLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgogICAgOzsKICBlc2FjCgogICMgUGFyc2UgQ0kgc3RhdHVzIGZyb20gSlNPTiBvdXRwdXQKICBpZiBbIC16ICIkQ0lfSlNPTiIgXSB8fCBbICIkQ0lfSlNPTiIgPSAiW10iIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBObyBDSSBjaGVja3MgZm91bmQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICAjIFBvc3QgUkVRVUVTVCBDSEFOR0VTIHJldmlldyBmb3IgbWlzc2luZyBDSQogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKk1pc3NpbmcgQ0kgU2V0dXAqKjogTm8gR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dzIGRldGVjdGVkCuKdjCAqKkNhbm5vdCB2ZXJpZnkqKjogVGVzdCBleGVjdXRpb24gYW5kIGRlcGxveW1lbnQgc3RhdHVzIHVua25vd24KCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gU2V0IHVwIEdpdEh1YiBBY3Rpb25zIENJIHBpcGVsaW5lCi0gWyBdIEFkZCBhdXRvbWF0ZWQgdGVzdGluZyB3b3JrZmxvdwotIFsgXSBDb25maWd1cmUgZGVwbG95bWVudCB2ZXJpZmljYXRpb24KLSBbIF0gQWRkIGJyYW5jaCBwcm90ZWN0aW9uIHJ1bGVzCgoqKk5vdGUqKjogQ2Fubm90IHByb2NlZWQgd2l0aCBRQSB1bnRpbCBDSSBpcyBwcm9wZXJseSBjb25maWd1cmVkLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgplbHNlCiAgIyBGdW5jdGlvbiB0byBwYXJzZSBKU09OIHdpdGhvdXQganEgZGVwZW5kZW5jeQogIHBhcnNlX2NpX2pzb24oKSB7CiAgICBsb2NhbCBqc29uPSIkMSIKICAgIGxvY2FsIGZpZWxkPSIkMiIKICAgIGxvY2FsIHZhbHVlPSIkMyIKCiAgICAjIENvdW50IHRvdGFsIGNoZWNrcwogICAgaWYgWyAiJGZpZWxkIiA9ICJ0b3RhbCIgXTsgdGhlbgogICAgICBlY2hvICIkanNvbiIgfCBncmVwIC1vICcibmFtZSInIHwgd2MgLWwKICAgICAgcmV0dXJuCiAgICBmaQoKICAgICMgQ291bnQgYnkgc3RhdHVzIGFuZCBjb25jbHVzaW9uCiAgICBjYXNlICIkZmllbGQiIGluCiAgICAgICJjb21wbGV0ZWQiKQogICAgICAgIGVjaG8gIiRqc29uIiB8IGdyZXAgLW8gJyJzdGF0dXMiOiJjb21wbGV0ZWQiJyB8IHdjIC1sCiAgICAgICAgOzsKICAgICAgInN1Y2Nlc3MiKQogICAgICAgICMgQ291bnQgb2JqZWN0cyB0aGF0IGhhdmUgYm90aCBjb21wbGV0ZWQgc3RhdHVzIGFuZCBzdWNjZXNzIGNvbmNsdXNpb24KICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAnImNvbmNsdXNpb24iOiJzdWNjZXNzIicgfCB3YyAtbAogICAgICAgIDs7CiAgICAgICJmYWlsZWQiKQogICAgICAgICMgQ291bnQgb2JqZWN0cyB0aGF0IGhhdmUgY29tcGxldGVkIHN0YXR1cyBhbmQgZmFpbHVyZS9jYW5jZWxsZWQvdGltZWRfb3V0IGNvbmNsdXNpb24KICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAtRSAnImNvbmNsdXNpb24iOiIoZmFpbHVyZXxjYW5jZWxsZWR8dGltZWRfb3V0KSInIHwgd2MgLWwKICAgICAgICA7OwogICAgICAicGVuZGluZyIpCiAgICAgICAgbG9jYWwgdG90YWwgY29tcGxldGVkCiAgICAgICAgdG90YWw9JChlY2hvICIkanNvbiIgfCBncmVwIC1vICcibmFtZSInIHwgd2MgLWwpCiAgICAgICAgY29tcGxldGVkPSQoZWNobyAiJGpzb24iIHwgZ3JlcCAtbyAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgd2MgLWwpCiAgICAgICAgZWNobyAkKCh0b3RhbCAtIGNvbXBsZXRlZCkpCiAgICAgICAgOzsKICAgIGVzYWMKICB9CgogICMgRnVuY3Rpb24gdG8gZXh0cmFjdCBjaGVjayBkZXRhaWxzCiAgZXh0cmFjdF9jaGVja19kZXRhaWxzKCkgewogICAgbG9jYWwganNvbj0iJDEiCiAgICBsb2NhbCB0eXBlPSIkMiIKCiAgICBjYXNlICIkdHlwZSIgaW4KICAgICAgImZhaWxlZCIpCiAgICAgICAgIyBFeHRyYWN0IGZhaWxlZCBjaGVjayBuYW1lcyBhbmQgY29uY2x1c2lvbnMKICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAtRSAnImNvbmNsdXNpb24iOiIoZmFpbHVyZXxjYW5jZWxsZWR8dGltZWRfb3V0KSInIHwgc2VkIC1FICdzLy4qIm5hbWUiOiIoW14iXSspIi4qImNvbmNsdXNpb24iOiIoW14iXSspIi4qLy0gXDEgKFwyKS8nCiAgICAgICAgOzsKICAgICAgInBlbmRpbmciKQogICAgICAgICMgRXh0cmFjdCBwZW5kaW5nIGNoZWNrIG5hbWVzIGFuZCBzdGF0dXNlcwogICAgICAgIGVjaG8gIiRqc29uIiB8IHNlZCAncy99LHsvXG4vZycgfCBncmVwIC12ICcic3RhdHVzIjoiY29tcGxldGVkIicgfCBzZWQgLUUgJ3MvLioibmFtZSI6IihbXiJdKykiLioic3RhdHVzIjoiKFteIl0rKSIuKi8tIFwxIChcMikvJwogICAgICAgIDs7CiAgICAgICJzdWNjZXNzIikKICAgICAgICAjIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBjaGVjayBuYW1lcwogICAgICAgIGVjaG8gIiRqc29uIiB8IHNlZCAncy99LHsvXG4vZycgfCBncmVwICcic3RhdHVzIjoiY29tcGxldGVkIicgfCBncmVwICciY29uY2x1c2lvbiI6InN1Y2Nlc3MiJyB8IHNlZCAtRSAncy8uKiJuYW1lIjoiKFteIl0rKSIuKi8tIFwxIOKchS8nCiAgICAgICAgOzsKICAgIGVzYWMKICB9CgogICMgVXNlIGpxIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBmYWxsYmFjayBwYXJzaW5nCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIvCfk4sgVXNpbmcganEgZm9yIEpTT04gcGFyc2luZyIKICAgIFRPVEFMX0NIRUNLUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICcuIHwgbGVuZ3RoJykKICAgIENPTVBMRVRFRF9DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiKV0gfCBsZW5ndGgnKQogICAgU1VDQ0VTU19DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiIGFuZCAuY29uY2x1c2lvbiA9PSAic3VjY2VzcyIpXSB8IGxlbmd0aCcpCiAgICBGQUlMRURfQ0hFQ0tTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgKC5jb25jbHVzaW9uID09ICJmYWlsdXJlIiBvciAuY29uY2x1c2lvbiA9PSAiY2FuY2VsbGVkIiBvciAuY29uY2x1c2lvbiA9PSAidGltZWRfb3V0IikpXSB8IGxlbmd0aCcpCiAgICBQRU5ESU5HX0NIRUNLUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICdbLltdIHwgc2VsZWN0KC5zdGF0dXMgIT0gImNvbXBsZXRlZCIpXSB8IGxlbmd0aCcpCiAgZWxzZQogICAgZWNobyAi8J+TiyBVc2luZyBmYWxsYmFjayBKU09OIHBhcnNpbmcgKGpxIG5vdCBhdmFpbGFibGUpIgogICAgVE9UQUxfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJ0b3RhbCIpCiAgICBDT01QTEVURURfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJjb21wbGV0ZWQiKQogICAgU1VDQ0VTU19DSEVDS1M9JChwYXJzZV9jaV9qc29uICIkQ0lfSlNPTiIgInN1Y2Nlc3MiKQogICAgRkFJTEVEX0NIRUNLUz0kKHBhcnNlX2NpX2pzb24gIiRDSV9KU09OIiAiZmFpbGVkIikKICAgIFBFTkRJTkdfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJwZW5kaW5nIikKICBmaQoKICBlY2hvICLwn5OKIENJIFN0YXR1cyBTdW1tYXJ5OiIKICBlY2hvICIgIC0gVG90YWwgY2hlY2tzOiAkVE9UQUxfQ0hFQ0tTIgogIGVjaG8gIiAgLSBDb21wbGV0ZWQ6ICRDT01QTEVURURfQ0hFQ0tTIgogIGVjaG8gIiAgLSBTdWNjZXNzZnVsOiAkU1VDQ0VTU19DSEVDS1MiCiAgZWNobyAiICAtIEZhaWxlZDogJEZBSUxFRF9DSEVDS1MiCiAgZWNobyAiICAtIFBlbmRpbmc6ICRQRU5ESU5HX0NIRUNLUyIKCiAgSEFWRV9QUl9SRUY9ZmFsc2UKICBpZiBbIC1uICIkUkVQT19TTFVHIiBdICYmIHsgWyAtbiAiJFBSX05VTSIgXSB8fCBbIC1uICIkUFJfVVJMIiBdOyB9OyB0aGVuCiAgICBIQVZFX1BSX1JFRj10cnVlCiAgICBlbnN1cmVfc3RhdHVzX2xhYmVscyAiJFJFUE9fU0xVRyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVN9OmQ3M2E0YTpSZW1lZGlhdGlvbiByZXF1ZXN0ZWQgYnkgVGVzcyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfRklYSU5HfTpmYmNhMDQ6UmV4IGlzIGFjdGl2ZWx5IGFwcGx5aW5nIGZpeGVzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19DTEVPfTowZThhMTY6QXdhaXRpbmcgQ2xlbyBxdWFsaXR5IHJldmlldyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfVEVTU306NTMxOWU3OkF3YWl0aW5nIFRlc3MgUUEgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9BUFBST1ZFRH06MmRhNDRlOkFsbCBhdXRvbWF0ZWQgcmV2aWV3cyBhcHByb3ZlZCIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfRkFJTEVEfTpiNjAyMDU6UmVtZWRpYXRpb24gZmFpbGVkIG9yIGFib3J0ZWQiCiAgZmkKCiAgaWYgWyAiJEZBSUxFRF9DSEVDS1MiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKdjCBDSSBmYWlsdXJlcyBkZXRlY3RlZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgICMgR2V0IGRldGFpbHMgb2YgZmFpbGVkIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgRkFJTEVEX0RFVEFJTFM9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiIGFuZCAoLmNvbmNsdXNpb24gPT0gImZhaWx1cmUiIG9yIC5jb25jbHVzaW9uID09ICJjYW5jZWxsZWQiIG9yIC5jb25jbHVzaW9uID09ICJ0aW1lZF9vdXQiKSldIHwgbWFwKCItICIgKyAubmFtZSArICIgKCIgKyAuY29uY2x1c2lvbiArICIpIikgfCBqb2luKCJcbiIpJykKICAgIGVsc2UKICAgICAgRkFJTEVEX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAiZmFpbGVkIikKICAgIGZpCgogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKkNJIEZhaWx1cmVzIERldGVjdGVkKio6ICRGQUlMRURfQ0hFQ0tTIG91dCBvZiAkVE9UQUxfQ0hFQ0tTIGNoZWNrKHMpIGZhaWxpbmcK4p2MICoqQ2Fubm90IGFwcHJvdmUqKjogQWxsIENJIGNoZWNrcyBtdXN0IHBhc3MKCiMjIEZhaWxlZCBDaGVja3MKJEZBSUxFRF9ERVRBSUxTCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIEZpeCBhbGwgZmFpbGluZyBDSSBjaGVja3MKLSBbIF0gQWRkcmVzcyB0ZXN0IGZhaWx1cmVzCi0gWyBdIFJlc29sdmUgYnVpbGQgZXJyb3JzCi0gWyBdIFZlcmlmeSBhbGwgd29ya2Zsb3dzIHBhc3MKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgQ0kgaXNzdWVzIGFyZSByZXNvbHZlZC4iIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCB0aW1lZCBvdXQgb3IgZmFpbGVkIChleGl0IGNvZGU6ICQ/KSIKCiAgICAjIExhYmVsIG1hbmlwdWxhdGlvbiByZW1vdmVkIC0gdXNpbmcgR2l0SHViIFBSIHJldmlld3Mgb25seQogICAgdXBkYXRlX2NvZGVydW5fc3RhdHVzICJuZWVkcy1maXhlcyIgImNoYW5nZXNfcmVxdWVzdGVkIiAiJFBSX1VSTCIKICBlbGlmIFsgIiRQRU5ESU5HX0NIRUNLUyIgLWd0IDAgXTsgdGhlbgogICAgZWNobyAi4o+zIENJIGNoZWNrcyBzdGlsbCBwZW5kaW5nIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgIyBHZXQgZGV0YWlscyBvZiBwZW5kaW5nIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgUEVORElOR19ERVRBSUxTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyAhPSAiY29tcGxldGVkIildIHwgbWFwKCItICIgKyAubmFtZSArICIgKCIgKyAuc3RhdHVzICsgIikiKSB8IGpvaW4oIlxuIiknKQogICAgZWxzZQogICAgICBQRU5ESU5HX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAicGVuZGluZyIpCiAgICBmaQoKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrij7MgKipDSSBDaGVja3MgUGVuZGluZyoqOiAkUEVORElOR19DSEVDS1Mgb3V0IG9mICRUT1RBTF9DSEVDS1MgY2hlY2socykgc3RpbGwgcnVubmluZwrinYwgKipDYW5ub3QgYXBwcm92ZSoqOiBBbGwgQ0kgY2hlY2tzIG11c3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5CgojIyBQZW5kaW5nIENoZWNrcwokUEVORElOR19ERVRBSUxTCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIFdhaXQgZm9yIGFsbCBDSSBjaGVja3MgdG8gY29tcGxldGUKLSBbIF0gVmVyaWZ5IGFsbCBjaGVja3MgcGFzcyBzdWNjZXNzZnVsbHkKLSBbIF0gQWRkcmVzcyBhbnkgZmFpbHVyZXMgdGhhdCBtYXkgb2NjdXIKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgYWxsIENJIGNoZWNrcyBhcmUgY29tcGxldGUuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCgogICAgIyBMYWJlbCBtYW5pcHVsYXRpb24gcmVtb3ZlZCAtIHVzaW5nIEdpdEh1YiBQUiByZXZpZXdzIG9ubHkKICAgICMgTm90ZTogTm8gbG9uZ2VyIHNldHRpbmcgbmVlZHMtdGVzcyBzdGF0dXMgLSBHaXRIdWIgUFIgcmV2aWV3IHN0YXRlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgKICBlbGlmIFsgIiRTVUNDRVNTX0NIRUNLUyIgLWVxICIkVE9UQUxfQ0hFQ0tTIiBdICYmIFsgIiRUT1RBTF9DSEVDS1MiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBBbGwgQ0kgY2hlY2tzIHBhc3NpbmcgLSBwb3N0aW5nIEFQUFJPVkUgcmV2aWV3IgogICAgIyBHZXQgZGV0YWlscyBvZiBzdWNjZXNzZnVsIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgU1VDQ0VTU19ERVRBSUxTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgLmNvbmNsdXNpb24gPT0gInN1Y2Nlc3MiKV0gfCBtYXAoIi0gIiArIC5uYW1lICsgIiDinIUiKSB8IGpvaW4oIlxuIiknKQogICAgZWxzZQogICAgICBTVUNDRVNTX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAic3VjY2VzcyIpCiAgICBmaQoKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLWFwcHJvdmUgLS1ib2R5ICIjIyMg4pyFIFFBIFJldmlldyBmb3IgVGFzayAkVEFTS19JRCAtIEFQUFJPVkVECgojIyBQcmUtQXBwcm92YWwgVmVyaWZpY2F0aW9uCuKchSAqKkFMTCBDSSBjaGVja3MgdmVyaWZpZWQqKjogJFNVQ0NFU1NfQ0hFQ0tTIG91dCBvZiAkVE9UQUxfQ0hFQ0tTIGNoZWNrcyBwYXNzaW5nCuKchSAqKk5vIGZhaWx1cmVzIGZvdW5kKio6IFplcm8gZmFpbGluZyBjaGVja3MgY29uZmlybWVkCgojIyBDSSBTdGF0dXMK4pyFICoqR2l0SHViIEFjdGlvbnMgQ0kqKjogQWxsIGNoZWNrcyBwYXNzaW5nCiRTVUNDRVNTX0RFVEFJTFMKCiMjIFRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYQrinIUgKipBbGwgY3JpdGVyaWEgbWV0Kio6IEltcGxlbWVudGF0aW9uIGNvbXBsZXRlIGFuZCB2ZXJpZmllZArinIUgKipDb2RlIHF1YWxpdHkqKjogUGFzc2VzIGFsbCBzdGFuZGFyZHMK4pyFICoqVGVzdGluZyoqOiBDb21wcmVoZW5zaXZlIHRlc3QgY292ZXJhZ2UgYWNoaWV2ZWQKCiMjIEZpbmFsIEFzc2Vzc21lbnQKLSAqKlF1YWxpdHkgU2NvcmUqKjogRXhjZWxsZW50IGltcGxlbWVudGF0aW9uCi0gKipSZWFkeSBmb3IgbWVyZ2UqKjogQWxsIHJlcXVpcmVtZW50cyBzYXRpc2ZpZWQKLSAqKk5vIG91dHN0YW5kaW5nIGlzc3VlcyoqOiBDbGVhbiwgcHJvZHVjdGlvbi1yZWFkeSBjb2RlCgoqKkFQUFJPVkVEKiogLSBSZWFkeSBmb3IgbWVyZ2UgdG8gbWFpbiBicmFuY2guIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCgogICAgIyBMYWJlbCBtYW5pcHVsYXRpb24gcmVtb3ZlZCAtIHVzaW5nIEdpdEh1YiBQUiByZXZpZXdzIG9ubHkKICAgIHVwZGF0ZV9jb2RlcnVuX3N0YXR1cyAiYXBwcm92ZWQiICJhcHByb3ZlZCIgIiRQUl9VUkwiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFVuZXhwZWN0ZWQgQ0kgc3RhdGUgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4pqg77iPICoqVW5leHBlY3RlZCBDSSBTdGF0ZSoqOiBVbmFibGUgdG8gZGV0ZXJtaW5lIGZpbmFsIENJIHN0YXR1cwrinYwgKipDYW5ub3QgYXBwcm92ZSoqOiBDSSBzdGF0dXMgdW5jbGVhcgoKIyMgQ3VycmVudCBTdGF0dXMKLSBUb3RhbCBjaGVja3M6ICRUT1RBTF9DSEVDS1MKLSBDb21wbGV0ZWQ6ICRDT01QTEVURURfQ0hFQ0tTCi0gU3VjY2Vzc2Z1bDogJFNVQ0NFU1NfQ0hFQ0tTCi0gRmFpbGVkOiAkRkFJTEVEX0NIRUNLUwotIFBlbmRpbmc6ICRQRU5ESU5HX0NIRUNLUwoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBSZXZpZXcgQ0kgY2hlY2sgY29uZmlndXJhdGlvbgotIFsgXSBFbnN1cmUgYWxsIGNoZWNrcyBhcmUgcHJvcGVybHkgZGVmaW5lZAotIFsgXSBWZXJpZnkgd29ya2Zsb3cgY29tcGxldGlvbgotIFsgXSBDb250YWN0IGFkbWluaXN0cmF0b3IgaWYgaXNzdWVzIHBlcnNpc3QKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgQ0kgc3RhdHVzIGlzIGNsZWFyLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgoKICAgICMgTGFiZWwgbWFuaXB1bGF0aW9uIHJlbW92ZWQgLSB1c2luZyBHaXRIdWIgUFIgcmV2aWV3cyBvbmx5CiAgICB1cGRhdGVfY29kZXJ1bl9zdGF0dXMgIm5lZWRzLWZpeGVzIiAiY2hhbmdlc19yZXF1ZXN0ZWQiICIkUFJfVVJMIgogIGZpCgplbHNlCiAgIyBHaXRIdWIgQ0xJIG5vdCBhdmFpbGFibGUgLSBza2lwIFBSIHJldmlldwogIGVjaG8gIvCfk50gU2tpcHBpbmcgUFIgcmV2aWV3IHBvc3RpbmcgZHVlIHRvIEdpdEh1YiBDTEkgdW5hdmFpbGFiaWxpdHkiCiAgZWNobyAi4pyFIFRlc3MgUUEgd29ya2Zsb3cgY29tcGxldGVkIGJ1dCBjb3VsZCBub3QgcG9zdCBQUiByZXZpZXciCmZpCgoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBERUJVRyBMT0dHSU5HOiBGSU5BTCBTVEFUVVMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQppZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICBlY2hvICLinIUgVGVzcyBRQSB0ZXN0aW5nIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IFNVQ0NFU1MgKGV4aXQgY29kZSAwKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBUZXNzIFFBIHRlc3RpbmcgZXhpdGVkIHdpdGggY29kZTogJENMQVVERV9FWElUX0NPREUiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IEZBSUxVUkUgKGV4aXQgY29kZSAkQ0xBVURFX0VYSVRfQ09ERSkiCiAgZWNobyAi8J+UjSBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgY2FjaGVfY29udHJvbCBvciBBUEkgZXJyb3Igb2NjdXJyZWQiCiAgZWNobyAi8J+TnSBOb3RlOiBDb250YWluZXIgd2lsbCBzdGlsbCBleGl0IHN1Y2Nlc3NmdWxseSB0byBhbGxvdyB3b3JrZmxvdyBjb250aW51YXRpb24iCmZpCgplY2hvICLwn5SNIFByb2Nlc3MgaW5mb3JtYXRpb246IgplY2hvICIgIC0gUElEOiAkQ0xBVURFX1BJRCIKZWNobyAiICAtIEV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUiCmVjaG8gIiAgLSBXb3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgplY2hvICIgIC0gUmVwb3NpdG9yeTogJFJFUE9fTkFNRSIKZWNobyAiICAtIFBSIFJldmlldzogUG9zdGVkIHRvICMkUFJfTlVNIgoKIyBTaWRlY2FyIHNodXRkb3duIGlzIGhhbmRsZWQgYnkgdGhlIEVYSVQgdHJhcCBkZWZpbmVkIGVhcmxpZXIKIyBUaGUgc2h1dGRvd25fc2lkZWNhciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHNjcmlwdCBleGl0cwoKIyBQZXJmb3JtIGZpbmFsIGNsZWFudXAgb2Ygb3VyIG93biBwcm9jZXNzZXMKZWNobyAi8J+UpyBQZXJmb3JtaW5nIGZpbmFsIHByb2Nlc3MgY2xlYW51cC4uLiIKCiMgQ2xlYW4gdXAgYW55IGNoaWxkIHByb2Nlc3NlcyB3ZSBtYXkgaGF2ZSBzcGF3bmVkCmNsZWFudXBfY2hpbGRfcHJvY2Vzc2VzKCkgewogIGlmIFsgJCQgLWd0IDEgXSAmJiBbIC1kICIvcHJvYyIgXTsgdGhlbgogICAgIyBHZXQgYWxsIGNoaWxkIHByb2Nlc3NlcwogICAgbG9jYWwgY2hpbGRfcGlkcz0iIgogICAgY2hpbGRfcGlkcz0kKHBzIC1vIHBpZCxwcGlkIHwgYXdrIC12IHBwaWQ9JCQgJyQyID09IHBwaWQge3ByaW50ICQxfScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKCiAgICBpZiBbIC1uICIkY2hpbGRfcGlkcyIgXTsgdGhlbgogICAgICBlY2hvICLwn5SNIEZvdW5kIGNoaWxkIHByb2Nlc3NlcyB0byBjbGVhbiB1cDogJGNoaWxkX3BpZHMiCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLVRFUk0gMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBzbGVlcCAyCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLUtJTEwgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQp9CgpjbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcwoKICAjIENoZWNrIGlmIHRlc3Rpbmcgd2FzIHN1Y2Nlc3NmdWwKICAjIFRlc3MgaXMgc3VjY2Vzc2Z1bCBpZiBDbGF1ZGUgZXhpdGVkIGNsZWFubHkgKHRlc3RzIHNob3VsZCBwYXNzKQogIGlmIFsgJHtDTEFVREVfUElEOi0wfSAtbmUgMCBdOyB0aGVuCiAgICB3YWl0ICRDTEFVREVfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIENMQVVERV9FWElUX0NPREU9JD8KICBmaQogIAogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIEF0dGVtcHQgJEFUVEVNUFQ6IFRlc3RpbmcgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKICAgIFNVQ0NFU1M9MQogICAgYnJlYWsKICBlbHNlCiAgICBlY2hvICLimqDvuI8gQXR0ZW1wdCAkQVRURU1QVDogVGVzdGluZyBpbmNvbXBsZXRlIChleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFKSIKICAgIAogICAgaWYgWyAkQVRURU1QVCAtbHQgJE1BWF9SRVRSSUVTIF07IHRoZW4KICAgICAgZWNobyAi8J+UhCBXaWxsIHJldHJ5Li4uICgkKChNQVhfUkVUUklFUyAtIEFUVEVNUFQpKSBhdHRlbXB0cyByZW1haW5pbmcpIgogICAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgICAgZWNobyAiIgogICAgICAjIEJyaWVmIHBhdXNlIGJlZm9yZSByZXRyeQogICAgICBzbGVlcCAyCiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHJlYWNoZWQiCiAgICAgIGJyZWFrCiAgICBmaQogIGZpCmRvbmUKCiMgUmVwb3J0IGZpbmFsIHN0YXR1cwplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi4pyFIFRFU1MgVEVTVElORyBTVUNDRVNTRlVMIgogIGVjaG8gIiAgIENvbXBsZXRlZCBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgplbHNlCiAgZWNobyAi4pqg77iPIFRFU1MgVEVTVElORyBJTkNPTVBMRVRFIgogIGVjaG8gIiAgIEF0dGVtcHRlZCAkQVRURU1QVCB0aW1lKHMpIgogIGVjaG8gIiAgIFRlc3RzIG5vdCBwYXNzaW5nIgpmaQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFdyaXRlIGNvbXBsZXRpb24gbWFya2VyIGZvciB3b3JrZmxvdyB0cmFja2luZwplY2hvICJ0ZXNzLXFhLWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgVEVTUyBDT05UQUlORVIgVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICJDb250YWluZXIgUElEOiAkJCIKZWNobyAiRmluYWwgUHJvY2VzcyBDaGVjazoiCnBzIGF1eCB8IGhlYWQgLTUKCiMgQ2xlYW51cCBGSUZPCnJtIC1mICIkRklGT19QQVRIIiAyPi9kZXYvbnVsbCB8fCB0cnVlCgojIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHN1Y2Nlc3MKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBzdWNjZXNzIHN0YXR1cy4uLiIKICBleGl0IDAKZWxzZQogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggZmFpbHVyZSBzdGF0dXMuLi4iCiAgZWNobyAi8J+TnSBUZXN0aW5nIGluY29tcGxldGUgYWZ0ZXIgJEFUVEVNUFQgYXR0ZW1wdChzKSIKICBleGl0IDEKZmkK + code_claude_container-rex.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIFJFWCBET0NVTUVOVEFUSU9OIFdPUktGTE9XIFNUQVJUSU5HICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24gQWdlbnQgQWN0aXZlICAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZEgICAgICAgICAgICDimqDvuI8gIFRBU0sge3t0YXNrX2lkfX0gT05MWSAtIE5PIE9USEVSIFRBU0tTIOKaoO+4jyAgICAgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCfk5ogRm9jdXM6IERvY3VtZW50YXRpb24tZmlyc3QgaW1wbGVtZW50YXRpb24gYXBwcm9hY2giCmVjaG8gIvCfk4sgVGFzayBJRDoge3t0YXNrX2lkfX0iCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCiMgU2V0IHVwIEVYSVQgdHJhcCB0byBlbnN1cmUgRG9ja2VyIHNpZGVjYXIgY2xlYW51cAp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFVFJZIENPTkZJR1VSQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BWF9SRVRSSUVTX0NPTkZJRz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDTEFVREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ0xBVURFX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKZWNobyAi4puUIENSSVRJQ0FMOiBZb3UgbXVzdCBPTkxZIHdvcmsgb24gVGFzayB7e3Rhc2tfaWR9fSAtIGlnbm9yZSBBTEwgb3RoZXIgdGFza3MiCgojIENsZWFuIHVwIGFueSBsZWZ0b3ZlciBzZW50aW5lbCBmaWxlIGZyb20gcHJldmlvdXMgcnVucwojIFRoaXMgcHJldmVudHMgcHJlbWF0dXJlIHNpZGVjYXIgc2h1dGRvd24gb24gc2VxdWVudGlhbCB0YXNrIGV4ZWN1dGlvbnMKaWYgWyAtZiAvd29ya3NwYWNlLy5hZ2VudF9kb25lIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgQ2xlYW5pbmcgdXAgc2VudGluZWwgZmlsZSBmcm9tIHByZXZpb3VzIHJ1biIKICAgIHJtIC1mIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUKZmkKCiMgRGlzYWJsZSBpbnRlcmFjdGl2ZSBHaXQgcHJvbXB0cyBnbG9iYWxseQpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyBSZXBvc2l0b3J5IFVSTApSRVBPX1VSTD0ie3tyZXBvc2l0b3J5X3VybH19IgoKIyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcwplY2hvICJVc2luZyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uIgoKIyBBdXRoZW50aWNhdGUgd2l0aCBHaXRIdWIgQXBwCmlmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX0lEIiBdOyB0aGVuCiAgICBlY2hvICJBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAuLi4iCgogICAgIyBDcmVhdGUgdGVtcG9yYXJ5IHByaXZhdGUga2V5IGZpbGUgKHN1cHBvcnQgZXNjYXBlZCBuZXdsaW5lcykKICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgogICAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBHZW5lcmF0ZSBKV1QgdG9rZW4gZm9yIEdpdEh1YiBBcHAgKGZpeGVkIEpXVCBnZW5lcmF0aW9uIGZvciBMaW51eCBjb250YWluZXJzKQogICAgIyBKV1QgaGVhZGVyCiAgICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBKV1QgcGF5bG9hZCB3aXRoIGN1cnJlbnQgdGltZSBhbmQgZXhwaXJhdGlvbiAoMTAgbWludXRlcykKICAgIE5PVz0kKGRhdGUgKyVzKQogICAgRVhQPSQoKE5PVyArIDYwMCkpCiAgICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIFNpZ24gdGhlIEpXVAogICAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICAgIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgdGhlIHJlcG9zaXRvcnkgKHJvYnVzdCBwYXJzaW5nIG9mIG93bmVyL3JlcG8pCiAgICBJTlBVVF9SRVBPPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBSRVBPX09XTkVSPSIiCiAgICBSRVBPX05BTUU9IiIKCiAgICBpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vW14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgICAgICMgU1NIIGZvcm1hdCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvKC5naXQpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2s6IGFzc3VtZSBzbHVnIG93bmVyL3JlcG8gKHBvc3NpYmx5IHdpdGggLmdpdCkKICAgICAgICBTTFVHPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfFwuZ2l0JHx8JykKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMSkKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYyKQogICAgZmkKCiAgICBlY2hvICJERUJVRzogUGFyc2VkIHJlcG9zaXRvcnkgLSBPd25lcjogJyRSRVBPX09XTkVSJywgTmFtZTogJyRSRVBPX05BTUUnIgoKICAgIGVjaG8gIkdldHRpbmcgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FLi4uIgoKICAgICMgR2V0IHRoZSBpbnN0YWxsYXRpb24gSUQgKHJldHJ5IGFuZCBmb2xsb3cgcmVkaXJlY3RzKS4gRmFsbGJhY2sgdG8gb3JnIGluc3RhbGxhdGlvbi4KICAgIElOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIikKCiAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBSZXBvIGluc3RhbGxhdGlvbiBub3QgZm91bmQsIHRyeWluZyBvcmcgaW5zdGFsbGF0aW9uLi4uIgogICAgICAgIE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iKQogICAgICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQogICAgZmkKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gSUQgZm9yICRSRVBPX09XTkVSLyRSRVBPX05BTUUiCiAgICAgICAgZWNobyAiUmVzcG9uc2UgKHJlcG8pOiAkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIgogICAgICAgIGVjaG8gIlJlc3BvbnNlIChvcmcpOiAgJHtPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFOi1bbm9uZV19IgogICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgZWNobyAiSW5zdGFsbGF0aW9uIElEOiAkSU5TVEFMTEFUSU9OX0lEIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBhY2Nlc3MgdG9rZW4KICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgIEdJVEhVQl9UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKICAgIFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKSAgIyBUcmFjayB3aGVuIHRva2VuIHdhcyBnZW5lcmF0ZWQgZm9yIHJlZnJlc2ggbG9naWMKCiAgICBpZiBbICIkR0lUSFVCX1RPS0VOIiA9ICJudWxsIiBdIHx8IFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuIgogICAgICAgIGVjaG8gIlJlc3BvbnNlOiAkVE9LRU5fUkVTUE9OU0UiCiAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICAjIENsZWFuIHVwIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgRXhwb3J0IHRoZSB0b2tlbiBmb3IgZ2l0IHRvIHVzZQogICAgZXhwb3J0IEdJVEhVQl9UT0tFTgoKICAgICMgQ29uZmlndXJlIGdpdCB0byB1c2UgdGhlIHRva2VuICh1c2UgLS1yZXBsYWNlLWFsbCB0byBoYW5kbGUgbXVsdGlwbGUgZXhpc3RpbmcgaGVscGVycykKICAgIGdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciBzdG9yZQogICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKCiAgICAjIEFsc28gYXV0aGVudGljYXRlIGdoIENMSSB3aXRoIHRoZSB0b2tlbgogICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbgoKICAgIGVjaG8gIuKckyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5IgoKICAgICMgVG9rZW4gcmVmcmVzaCBmdW5jdGlvbnMgZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbigpIHsKICAgICAgICBlY2hvICLwn5SEIFJlZnJlc2hpbmcgR2l0SHViIEFwcCB0b2tlbi4uLiIKCiAgICAgICAgIyBDcmVhdGUgdGVtcG9yYXJ5IGtleSBmaWxlCiAgICAgICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS0kJCIKICAgICAgICBlY2hvICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAgICAgIyBHZW5lcmF0ZSBuZXcgSldUCiAgICAgICAgSldUX1RPS0VOPSQocnVieSAtciBvcGVuc3NsIC1yIGpzb24gLXIgYmFzZTY0IC1lICIKICAgICAgICBrZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUucmVhZCgnJFRFTVBfS0VZX0ZJTEUnKSkKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgICBpYXQ6IFRpbWUubm93LnRvX2kgLSA2MCwKICAgICAgICAgICAgZXhwOiBUaW1lLm5vdy50b19pICsgKDEwICogNjApLAogICAgICAgICAgICBpc3M6ICckR0lUSFVCX0FQUF9JRCcKICAgICAgICB9CiAgICAgICAgaGVhZGVyID0geyBhbGc6ICdSUzI1NicsIHR5cDogJ0pXVCcgfQoKICAgICAgICBoZWFkZXJfZW5jID0gQmFzZTY0LnVybHNhZmVfZW5jb2RlNjQoaGVhZGVyLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBwYXlsb2FkX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KHBheWxvYWQudG9fanNvbikuZ3N1YignPScsICcnKQogICAgICAgIHNpZ25hdHVyZSA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGtleS5zaWduKE9wZW5TU0w6OkRpZ2VzdDo6U0hBMjU2Lm5ldywgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9XCIpKS5nc3ViKCc9JywgJycpCgogICAgICAgIHB1dHMgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9LiN7c2lnbmF0dXJlfVwiCiAgICAgICAgIikKCiAgICAgICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIChyZXVzZSBsb2dpYyBmcm9tIGluaXRpYWwgYXV0aCkKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCgogICAgICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKICAgICAgICBmaQoKICAgICAgICAjIEdldCBuZXcgaW5zdGFsbGF0aW9uIHRva2VuCiAgICAgICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgICAgIE5FV19UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKCiAgICAgICAgaWYgWyAiJE5FV19UT0tFTiIgIT0gIm51bGwiIF0gJiYgWyAtbiAiJE5FV19UT0tFTiIgXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgICAgICAgICBleHBvcnQgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCgogICAgICAgICAgICAjIFVwZGF0ZSBnaXQgY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAyPi9kZXYvbnVsbAoKICAgICAgICAgICAgZWNobyAi4pyFIFRva2VuIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkiCiAgICAgICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgIH0KCiAgICAjIENoZWNrIGlmIHRva2VuIG5lZWRzIHJlZnJlc2ggKGNhbGwgYmVmb3JlIGdpdCBvcGVyYXRpb25zKQogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQoKSB7CiAgICAgICAgaWYgWyAteiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLimqDvuI8gTm8gdG9rZW4gdGltZXN0YW1wIGZvdW5kLCByZWZyZXNoaW5nIHRva2VuLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmaQoKICAgICAgICBOT1c9JChkYXRlICslcykKICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgIyBSZWZyZXNoIGlmIHRva2VuIGlzIG9sZGVyIHRoYW4gNTAgbWludXRlcyAodG9rZW5zIGxhc3QgMSBob3VyLCByZWZyZXNoIGF0IDUwIG1pbiB0byBiZSBzYWZlKQogICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMzAwMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflIQgVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgZmkKICAgIH0KCmVsc2UKICAgIGVjaG8gIuKdjCBHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIG9yIEdJVEhVQl9BUFBfSUQgbm90IGZvdW5kIgogICAgZXhpdCAxCmZpCgojIEdpdCBjb25maWd1cmF0aW9uIHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvd29ya3NwYWNlCgojIFNldCBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uIC0gdXNlIGdlbmVyaWMgZm9ybWF0IGZvciBhbGwgYWdlbnRzCmRlcml2ZV9ib3RfaWRlbnRpdHkoKSB7CiAgICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogICAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dG9tYXRpb25bYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgcmV0dXJuCiAgICBmaQoKICAgIGxvY2FsIHNsdWcKICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICAgIGlmIFsgLXogIiRzbHVnIiBdOyB0aGVuCiAgICAgICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgICBmaQoKICAgIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogICAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICAgIGlmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICAgICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgICAgIGxvY2FsIGJvdF9yZXNwb25zZQogICAgICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgICAgbG9jYWwgYm90X2lkCiAgICAgICAgYm90X2lkPSQocHJpbnRmICclcycgIiRib3RfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyBlbXB0eScgMj4vZGV2L251bGwgfHwgZWNobyAnJykKICAgICAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgICAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgZmkKICAgIGZpCgogICAgR0lUX0FVVEhPUl9OQU1FPSIkYm90X2xvZ2luIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKIyBDb25maWd1cmUgZ2l0IHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCgojIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsYXVkZSBDb2RlIHRvIHVzZQpleHBvcnQgR0lUX0FVVEhPUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX05BTUU9IiRHSVRfQVVUSE9SX05BTUUiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX0VNQUlMPSIkR0lUX0FVVEhPUl9FTUFJTCIKZWNobyAi4pyTIEdpdCBjb25maWd1cmVkIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEFVVEhFTlRJQ0FUSU9OIFZFUklGSUNBVElPTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SQIEFVVEhFTlRJQ0FUSU9OIFZFUklGSUNBVElPTiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCgojIFJlcG9zaXRvcnkgVVJMcyAtIEhhbmRsZSBib3RoIGZ1bGwgVVJMcyBhbmQgb3JnL3JlcG8gZm9ybWF0CiMgQ2hlY2sgaWYgcmVwb3NpdG9yeV91cmwgYWxyZWFkeSBjb250YWlucyBodHRwczovL2dpdGh1Yi5jb20vCmlmIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJeaHR0cHM6Ly9naXRodWIuY29tLyI7IHRoZW4KICAgIFJFUE9fSFRUUF9VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKICAgIGlmICEgZWNobyAie3tyZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBSRVBPX0hUVFBfVVJMPSIke1JFUE9fSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIFJFUE9fSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e3JlcG9zaXRvcnlfdXJsfX0uZ2l0IgpmaQoKIyBTYW1lIGZvciBkb2NzIHJlcG9zaXRvcnkKaWYgZWNobyAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBET0NTX0hUVFBfVVJMPSJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIKICAgIGlmICEgZWNobyAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXC5naXQkIjsgdGhlbgogICAgICAgIERPQ1NfSFRUUF9VUkw9IiR7RE9DU19IVFRQX1VSTH0uZ2l0IgogICAgZmkKZWxzZQogICAgRE9DU19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL3t7ZG9jc19yZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgREVCVUc6IFNob3cgd2hhdCBVUkxzIGFyZSBiZWluZyBjb25zdHJ1Y3RlZAplY2hvICLwn5SNIERFQlVHOiBVUkwgQ29uc3RydWN0aW9uICYgUGFyYW1ldGVycyIKZWNobyAiICBJbnB1dCByZXBvc2l0b3J5X3VybDogJ3t7cmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19yZXBvc2l0b3J5X3VybDogJ3t7ZG9jc19yZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICBJbnB1dCBkb2NzX3Byb2plY3RfZGlyZWN0b3J5OiAne3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0nIgplY2hvICIgIElucHV0IHdvcmtpbmdfZGlyZWN0b3J5OiAne3t3b3JraW5nX2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCBkb2NzX2JyYW5jaDogJ3t7ZG9jc19icmFuY2h9fSciCmVjaG8gIiAgSW5wdXQgZ2l0aHViX2FwcDogJ3t7Z2l0aHViX2FwcH19JyIKZWNobyAiICBJbnB1dCB0YXNrX2lkOiAne3t0YXNrX2lkfX0nIgplY2hvICIgIElucHV0IHNlcnZpY2U6ICd7e3NlcnZpY2V9fSciCmVjaG8gIiAgQ29uc3RydWN0ZWQgUkVQT19IVFRQX1VSTDogJyRSRVBPX0hUVFBfVVJMJyIKZWNobyAiICBDb25zdHJ1Y3RlZCBET0NTX0hUVFBfVVJMOiAnJERPQ1NfSFRUUF9VUkwnIgplY2hvICIgIEN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKZWNobyAiICBBdmFpbGFibGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOiIKZW52IHwgZ3JlcCAtRSAiKEdJVEhVQnxBTlRIUk9QSUMpIiB8IHNvcnQKCiMgVGVzdCBIVFRQUyBhY2Nlc3MgdG8gcmVwb3NpdG9yeQplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkUkVQT19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRSRVBPX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9yZXBvX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0KSIKICBlY2hvICIgIEdpdCBjcmVkZW50aWFsIGhlbHBlciBzdGF0dXM6IgogIGdpdCBjb25maWcgLS1saXN0IHwgZ3JlcCBjcmVkZW50aWFsIHx8IGVjaG8gIiAgTm8gY3JlZGVudGlhbCBoZWxwZXJzIGNvbmZpZ3VyZWQiCiAgZWNobyAiIgogIGVjaG8gIvCfmqsgQUJPUlRJTkc6IENhbm5vdCBhY2Nlc3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIFRlc3QgZG9jcyByZXBvc2l0b3J5IGFjY2VzcwplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRET0NTX0hUVFBfVVJMXCIgSEVBRCIKaWYgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPiAvdG1wL2RvY3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCkiCiAgZWNobyAiIgogIGVjaG8gIvCfmqsgQUJPUlRJTkc6IENhbm5vdCBhY2Nlc3MgZG9jcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIKICBleGl0IDEKZmkKCiMgRHVhbCBSZXBvc2l0b3J5IFNldHVwIC0gUGxhdGZvcm0gcmVwbyBmb3IgZG9jcywgVGFyZ2V0IHJlcG8gZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLilZEgICAgICAgICAgICAgICAgIERVQUwgUkVQT1NJVE9SWSBTRVRVUCAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBSZXBvc2l0b3J5IEluZm9ybWF0aW9uCkRPQ1NfQlJBTkNIPSJ7e2RvY3NfYnJhbmNofX0iCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgoKIyBIZWxwZXI6IGRlcml2ZSBzYWZlIHdvcmtzcGFjZSBkaXJlY3RvcnkgbmFtZSBmcm9tIHJlcG8gaW5wdXQgKFVSTCwgU1NILCBvciBzbHVnKQpzYW5pdGl6ZV9yZXBvX2RpcigpIHsKICAgIGlucHV0PSIkMSIKICAgIGlmIGVjaG8gIiRpbnB1dCIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgb3duZXI9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspLy4qfFwxfCcpCiAgICAgICAgbmFtZT0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tL1teL10rLyhbXi9dKykoXFwuZ2l0KT98XDF8JykKICAgICAgICBwcmludGYgJyVzLSVzJyAiJG93bmVyIiAiJG5hbWUiCiAgICBlbGlmIGVjaG8gIiRpbnB1dCIgfCBncmVwIC1xRSAnXmdpdEBnaXRodWIuY29tOic7IHRoZW4KICAgICAgICBvd25lcj0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rKS8uKnxcMXwnKQogICAgICAgIG5hbWU9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXFwuZ2l0KT98XDF8JykKICAgICAgICBwcmludGYgJyVzLSVzJyAiJG93bmVyIiAiJG5hbWUiCiAgICBlbHNlCiAgICAgICAgIyBBc3N1bWUgb3duZXIvcmVwbyAob3B0aW9uYWxseSB3aXRoIC5naXQpCiAgICAgICAgc2x1Zz0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8XFwuZ2l0JHx8JykKICAgICAgICBlY2hvICIkc2x1ZyIgfCB0ciAnLycgJy0nCiAgICBmaQp9CgojIERlcml2ZSB3b3Jrc3BhY2UgZGlyZWN0b3J5IG5hbWVzIChvd25lci1yZXBvKQpET0NTX1JFUE9fRElSPSQoc2FuaXRpemVfcmVwb19kaXIgInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IikKVEFSR0VUX1JFUE9fRElSPSQoc2FuaXRpemVfcmVwb19kaXIgInt7cmVwb3NpdG9yeV91cmx9fSIpCgplY2hvICI9PT0gUkVQT1NJVE9SWSBTRVRVUCA9PT0iCmVjaG8gIkRvY3MgcmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKZWNobyAiVGFyZ2V0IHJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgplY2hvICJEb2NzIGJyYW5jaDogJERPQ1NfQlJBTkNIIgplY2hvICJHaXRIdWIgQXBwOiAkR0lUSFVCX0FQUCIKCiMgQWx3YXlzIHVzZSBjb25zaXN0ZW50IHdvcmtmbG93IGFwcHJvYWNoCiMgRXZlbiBpZiBkb2NzIGFuZCB0YXJnZXQgYXJlIHRoZSBzYW1lIHJlcG8sIHdlIGNsb25lIHRoZW0gc2VwYXJhdGVseQojIFRoaXMgYXZvaWRzIGNvbXBsZXggYnJhbmNoIHN3aXRjaGluZyBhbmQgZmlsZSBwcmVzZXJ2YXRpb24gaXNzdWVzCmVjaG8gIj09PSBVTklGSUVEIFdPUktGTE9XIEFQUFJPQUNIID09PSIKZWNobyAiICBkb2NzX3JlcG9zaXRvcnlfdXJsOiAne3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIHJlcG9zaXRvcnlfdXJsOiAne3tyZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICDilJTilIAgVGFza01hc3RlciBmaWxlcyB3aWxsIGJlIGNvcGllZCBmcm9tIGRvY3MgcmVwbyBhdDoge3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iCgojIFJlcG9zaXRvcnkgU2V0dXAgLSBBbHdheXMgdXNlIGNvbnNpc3RlbnQgYXBwcm9hY2gKZWNobyAiPT09IFJFUE9TSVRPUlkgU0VUVVAgPT09IgoKIyBTdGVwIDE6IENsb25lIG9yIHVwZGF0ZSBkb2NzIHJlcG9zaXRvcnkgdGVtcG9yYXJpbHkKaWYgWyAtZCAiL3RtcC9kb2NzLXJlcG8iIF07IHRoZW4KICAgIGVjaG8gIvCflIQgRE9DUyBSRVBPU0lUT1JZOiBVUERBVEUgLSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGV4aXN0cyIKICAgIGNkIC90bXAvZG9jcy1yZXBvCiAgICBnaXQgZmV0Y2ggb3JpZ2luCiAgICBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIKICAgIGdpdCByZXNldCAtLWhhcmQgIm9yaWdpbi8kRE9DU19CUkFOQ0giCiAgICBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IHVwZGF0ZWQiCmVsc2UKICAgIGVjaG8gIvCfk6UgRE9DUyBSRVBPU0lUT1JZOiBDTE9OSU5HIC0gZXh0cmFjdGluZyB0YXNrIGZpbGVzIgogICAgaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbzsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gY2xvbmUgZG9jcyByZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogICAgICAgIGV4aXQgMQogICAgZmkKICAgIGNkIC90bXAvZG9jcy1yZXBvICYmIGdpdCBjaGVja291dCAiJERPQ1NfQlJBTkNIIiAmJiBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCB0byB0ZW1wb3JhcnkgbG9jYXRpb24iCmZpCgojIFN0ZXAgMjogQ2xvbmUgb3IgdXBkYXRlIHRhcmdldCByZXBvc2l0b3J5CmlmIFsgLWQgIiRUQVJHRVRfUkVQT19ESVIiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgVEFSR0VUIFJFUE9TSVRPUlk6IFVQREFURSAtIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIKICAgIGVjaG8gIvCfk4EgRm91bmQgZXhpc3RpbmcgdGFyZ2V0IHJlcG9zaXRvcnkgJyRUQVJHRVRfUkVQT19ESVInLCB1cGRhdGluZy4uLiIKICAgIGNkICIkVEFSR0VUX1JFUE9fRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiBtYWluCiAgICBnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbi9tYWluCiAgICBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkiCmVsc2UKICAgIGVjaG8gIvCfk6UgVEFSR0VUIFJFUE9TSVRPUlk6IENMT05JTkcgLSBmaXJzdCB0aW1lIHNldHVwIgogICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJFRBUkdFVF9SRVBPX0RJUiI7IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNsb25lIHRhcmdldCByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICAgICAgICBleGl0IDEKICAgIGZpCiAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgY2xvbmVkIHN1Y2Nlc3NmdWxseSIKZmkKCiMgU3RlcCAzOiBDb3B5IHRhc2sgZmlsZXMgZnJvbSBkb2NzIHJlcG8gdG8gdGFyZ2V0IHJlcG8KZWNobyAi8J+TiyBUQVNLIEZJTEVTOiBDT1BZSU5HIGZyb20gZG9jcyB0byB0YXJnZXQgcmVwb3NpdG9yeSIKbWtkaXIgLXAgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrIgoKIyBEZXRlcm1pbmUgZG9jcyBwcm9qZWN0IGRpcmVjdG9yeSBwYXRoCnt7I2lmIGRvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fQppZiBbICJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIgPSAiLiIgXTsgdGhlbgogICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKZWxzZQogICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby97e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fS8udGFza21hc3RlciIKZmkKe3tlbHNlfX0KRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKe3svaWZ9fQoKIyBDb3B5IHNwZWNpZmljIHRhc2sgZmlsZXMKVEFTS19ESVI9IiRET0NTX1BBVEgvZG9jcy90YXNrLXt7dGFza19pZH19IgplY2hvICLwn5SNIERFQlVHOiBMb29raW5nIGZvciB0YXNrIGZpbGVzIGF0OiAkVEFTS19ESVIiCmVjaG8gIvCflI0gREVCVUc6IERvY3MgcGF0aCBpczogJERPQ1NfUEFUSCIKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgZG9jcyB0ZW1wIGRpcmVjdG9yeToiCmxzIC1sYSAvdG1wL2RvY3MtcmVwby8udGFza21hc3Rlci8gfHwgZWNobyAiTm8gLnRhc2ttYXN0ZXIgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIGRvY3MgZGlyZWN0b3J5OiIKbHMgLWxhIC90bXAvZG9jcy1yZXBvLy50YXNrbWFzdGVyL2RvY3MvIHx8IGVjaG8gIk5vIGRvY3MgZGlyZWN0b3J5IGZvdW5kIgoKaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICBlY2hvICLwn5SNIERFQlVHOiBUYXNrIGRpcmVjdG9yeSBmb3VuZCwgY29udGVudHM6IgogICAgbHMgLWxhICIkVEFTS19ESVIiCgogICAgZWNobyAi4pyFIENvcHlpbmcgdGFzay5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvdGFzay5tZCIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgJiYgZWNobyAi4pyTIHRhc2subWQgY29waWVkIiB8fCBlY2hvICLinYwgdGFzay5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kLi4uIgogICAgY3AgIiRUQVNLX0RJUi9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGNvcHkgZmFpbGVkIgoKICAgIGVjaG8gIuKchSBDb3B5aW5nIHByb21wdC5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvcHJvbXB0Lm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgcHJvbXB0Lm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHByb21wdC5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBjbGllbnQtY29uZmlnLmpzb24uLi4iCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICAgICAgICBjcCAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiAiJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iICYmIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBjb3B5IGZhaWxlZCIKICAgICAgICBjcCAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iICYmIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIHRvIHdvcmtzcGFjZSByb290IiB8fCBlY2hvICLinYwgY2xpZW50LWNvbmZpZy5qc29uIGNvcHkgdG8gd29ya3NwYWNlIGZhaWxlZCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCAtIE1DUCBjbGllbnQgbWF5IG5vdCBiZSBjb25maWd1cmVkIgogICAgZmkKCiAgICBlY2hvICLinIUgQ29weWluZyB0b29sbWFuLWd1aWRlLm1kLi4uIgogICAgaWYgWyAtZiAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyB0b29sbWFuLWd1aWRlLm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHRvb2xtYW4tZ3VpZGUubWQgY29weSBmYWlsZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIHRvb2xtYW4tZ3VpZGUubWQgbm90IGZvdW5kIC0gY29kZSBhZ2VudCB3b24ndCBoYXZlIHRvb2wgdXNhZ2UgZ3VpZGFuY2UiCiAgICBmaQoKICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCBmcm9tICRUQVNLX0RJUiIKZWxzZQogICAgZWNobyAi4p2MIENSSVRJQ0FMOiBUYXNrIHt7dGFza19pZH19IGRpcmVjdG9yeSBub3QgZm91bmQgYXQ6ICRUQVNLX0RJUiIKICAgIGVjaG8gIvCflI0gREVCVUc6IEF2YWlsYWJsZSBkaXJlY3RvcmllcyBpbiBkb2NzOiIKICAgIGZpbmQgL3RtcC9kb2NzLXJlcG8gLW5hbWUgInRhc2stKiIgLXR5cGUgZCB8fCBlY2hvICJObyB0YXNrIGRpcmVjdG9yaWVzIGZvdW5kIgpmaQoKIyBDb3B5IGFyY2hpdGVjdHVyZS5tZCBmcm9tIGRvY3Mgcm9vdApBUkNIX0ZJTEU9IiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiCmlmIFsgLWYgIiRBUkNIX0ZJTEUiIF07IHRoZW4KICAgIGNwICIkQVJDSF9GSUxFIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgZWNobyAi4pyTIEFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uIGNvcGllZCIKZWxzZQogICAgZWNobyAi4pqg77iPIGFyY2hpdGVjdHVyZS5tZCBub3QgZm91bmQgYXQ6ICRBUkNIX0ZJTEUiCmZpCgojIENvcHkgdGFza3MuanNvbiBpZiBpdCBleGlzdHMKaWYgWyAtZiAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiBdOyB0aGVuCiAgICBjcCAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgZWNobyAi4pyTIHRhc2tzLmpzb24gY29waWVkIgpmaQoKZWNobyAi4pyTIFRhc2sgZmlsZXMgY29waWVkIHRvIHRhcmdldCByZXBvc2l0b3J5IgoKIyBERUJVRzogVmVyaWZ5IGZpbGVzIHdlcmUgY29waWVkIHN1Y2Nlc3NmdWxseQplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiB0YXJnZXQgdGFzayBkaXJlY3RvcnkgYWZ0ZXIgY29weToiCmxzIC1sYSAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGlmIHByb21wdC5tZCBleGlzdHM6IgpbIC1mICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay9wcm9tcHQubWQiIF0gJiYgZWNobyAi4pyFIHByb21wdC5tZCBleGlzdHMiIHx8IGVjaG8gIuKdjCBwcm9tcHQubWQgbWlzc2luZyIKCiMgU3RlcCA0OiBDbGVhbiB1cCBkb2NzIHJlcG9zaXRvcnkKZWNobyAi8J+nuSBDTEVBTlVQOiBSZW1vdmluZyB0ZW1wb3JhcnkgZG9jcyByZXBvc2l0b3J5IgpybSAtcmYgL3RtcC9kb2NzLXJlcG8KZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbGVhbmVkIHVwIgoKIyBTZXQgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IHJvb3QKIyBETyBOT1Qgb3ZlcndyaXRlIFJFUE9fTkFNRSAtIGl0J3MgYWxyZWFkeSBjb3JyZWN0bHkgcGFyc2VkIGZvciBHaXRIdWIgQVBJIGNhbGxzCldPUktTUEFDRV9ESVI9IiRUQVJHRVRfUkVQT19ESVIiCmVjaG8gIuKckyBXb3JraW5nIGRpcmVjdG9yeTogL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKCiMgU2V0IENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSBlYXJseSAobmVlZGVkIGZvciBjbGllbnQtY29uZmlnLmpzb24gY29weSkKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXTsgdGhlbgogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8kV09SS19ESVIiCmZpCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSIgplY2hvICLinJMgU2V0IENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKCiMgU2V0dXAgZmVhdHVyZSBicmFuY2ggZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIj09PSBCUkFOQ0ggU0VUVVAgPT09IgpjZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKCiMgU3luYyB3aXRoIGxhdGVzdCBtYWluIHRvIHByZXZlbnQgY29uZmxpY3RzCmVjaG8gIvCflIQgU3luY2luZyB3aXRoIGxhdGVzdCBtYWluIHRvIHByZXZlbnQgY29uZmxpY3RzLi4uIgpnaXQgZmV0Y2ggb3JpZ2luIG1haW4gMj4vZGV2L251bGwgfHwgZ2l0IGZldGNoIG9yaWdpbiBtYXN0ZXIgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIENvdWxkIG5vdCBmZXRjaCBtYWluL21hc3RlciBicmFuY2giCgojIENyZWF0ZSBvciBjaGVja291dCBmZWF0dXJlIGJyYW5jaCAod2l0aCBjb25mbGljdC1zYWZlIGZhbGxiYWNrKQpGRUFUVVJFX0JSQU5DSD0iZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uIgpCUkFOQ0hfRVhJU1RTPSJmYWxzZSIKCmlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIOyB0aGVuCiAgICBCUkFOQ0hfRVhJU1RTPSJ0cnVlIgogICAgZWNobyAiRmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZXhpc3RzLCBjaGVja2luZyBvdXQuLi4iCiAgICBnaXQgY2hlY2tvdXQgJEZFQVRVUkVfQlJBTkNICgogICAgZWNobyAi8J+TpSBNZXJnaW5nIGxhdGVzdCBtYWluIGludG8gJEZFQVRVUkVfQlJBTkNILi4uIgogICAgaWYgZ2l0IG1lcmdlIG9yaWdpbi9tYWluIC0tbm8tZWRpdDsgdGhlbgogICAgICAgIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgbWVyZ2VkIGxhdGVzdCBtYWluIGludG8gZmVhdHVyZSBicmFuY2giCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIE1FUkdFIENPTkZMSUNUOiBDYW5ub3QgYXV0by1tZXJnZSBtYWluIGludG8gJEZFQVRVUkVfQlJBTkNIIgogICAgICAgIGVjaG8gIvCflIQgQXV0by1hYm9ydGluZyBtZXJnZSBhbmQgY3JlYXRpbmcgYSBmcmVzaCBicmFuY2ggZnJvbSBvcmlnaW4vbWFpbiIKICAgICAgICAjIEFib3J0IG1lcmdlIGlmIGluIHByb2dyZXNzCiAgICAgICAgZ2l0IG1lcmdlIC0tYWJvcnQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICMgQ3JlYXRlIGEgdW5pcXVlIGZyZXNoIGJyYW5jaCB0byBhdm9pZCByZXVzZSBjb25mbGljdHMKICAgICAgICBORVdfQlJBTkNIPSIke0ZFQVRVUkVfQlJBTkNIfS0kKGRhdGUgLXUgKyVZJW0lZCVIJU0lUykiCiAgICAgICAgZ2l0IGNoZWNrb3V0IC1CICIkTkVXX0JSQU5DSCIgb3JpZ2luL21haW4KICAgICAgICBGRUFUVVJFX0JSQU5DSD0iJE5FV19CUkFOQ0giCiAgICAgICAgZWNobyAi4pyTIFN3aXRjaGVkIHRvIGZyZXNoIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIgogICAgZmkKZWxzZQogICAgIyBDcmVhdGUgbmV3IGZlYXR1cmUgYnJhbmNoIGZyb20gbGF0ZXN0IG1haW4KICAgIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBmcm9tIGxhdGVzdCBtYWluLi4uIgogICAgZ2l0IGNoZWNrb3V0IC1iICRGRUFUVVJFX0JSQU5DSCBvcmlnaW4vbWFpbgogICAgZWNobyAi4pyTIENyZWF0ZWQgZmVhdHVyZSBicmFuY2g6ICRGRUFUVVJFX0JSQU5DSCIKZmkKCiMgNS4gQ2hhbmdlIHRvIENsYXVkZSBXb3JraW5nIERpcmVjdG9yeSAoYWxyZWFkeSBzZXQgdXAgZWFybGllcikKY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBDaGFuZ2VkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+UkSBDUklUSUNBTDogQ2xhdWRlIHdpbGwgYmUgbGF1bmNoZWQgZnJvbSB0aGlzIGRpcmVjdG9yeSIKCiMgV29ya2luZyBkaXJlY3Rvcnkgc2V0dXAgY29tcGxldGVkIGFib3ZlCgojIENvbmZpZ3VyZSBnaXQgdXNlciBhZnRlciBzdWNjZXNzZnVsIGNsb25lCmVjaG8gIj09PSBQT1NULUNMT05FIEdJVCBDT05GSUdVUkFUSU9OID09PSIKIyBGaXggZHViaW91cyBvd25lcnNoaXAgaXNzdWVzCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIiCmVjaG8gIuKckyBBZGRlZCByZXBvc2l0b3J5IHRvIHNhZmUgZGlyZWN0b3JpZXMiCgojIFNldCBnaXQgY29uZmlnIGxvY2FsbHkgaW4gdGhlIHdvcmtpbmcgcmVwb3NpdG9yeSAocGVyc2lzdGVudCBvbiBQVkMpCmlmIFsgLWQgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIvLmdpdCIgXTsgdGhlbgogICAgY2QgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIiCiAgICBnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgogICAgZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgogICAgIyBTZXQgdXAgYXV0b21hdGljIHVwc3RyZWFtIGZvciBuZXcgYnJhbmNoZXMKICAgIGdpdCBjb25maWcgLS1sb2NhbCBwdXNoLmF1dG9TZXR1cFJlbW90ZSB0cnVlCiAgICBlY2hvICLinJMgQ29uZmlndXJlZCBnaXQgdXNlciBpbiB0YXJnZXQgcmVwb3NpdG9yeTogJEdJVF9BVVRIT1JfTkFNRSIKICAgIGVjaG8gIuKckyBFbmFibGVkIGF1dG9tYXRpYyB1cHN0cmVhbSBzZXR1cCBmb3IgbmV3IGJyYW5jaGVzIgpmaQoKY2QgL3dvcmtzcGFjZQoKIyBDb3B5IENvbmZpZ01hcCBmaWxlcyB0byB3b3JraW5nIGRpcmVjdG9yeSAoQUZURVIgcmVwb3NpdG9yeSBjbG9uZSkKZWNobyAiPT09IENPTkZJR01BUCBGSUxFIFNFVFVQID09PSIKCiMgQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5IGFscmVhZHkgc2V0IGFib3ZlIGR1cmluZyByZXBvc2l0b3J5IHNldHVwCgplY2hvICJTZXR0aW5nIHVwIGZpbGVzIGluIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKY2QgIiRDTEFVREVfV09SS19ESVIiCgojIENvcHkgYWxsIGZpbGVzIGZyb20gQ29uZmlnTWFwIHRvIHdvcmtpbmcgZGlyZWN0b3J5CmlmIFsgLWQgIi90YXNrLWZpbGVzIiBdOyB0aGVuCiAgZWNobyAiQ29weWluZyBDb25maWdNYXAgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkuLi4iCgogICMgQ0xBVURFLm1kIE1lbW9yeSBQZXJzaXN0ZW5jZSBMb2dpYyAoY29udHJvbGxlZCBieSBvdmVyd3JpdGVNZW1vcnkgQ1JEIGZpZWxkKQogICAgICAgIE9WRVJXUklURV9NRU1PUlk9Int7b3ZlcndyaXRlX21lbW9yeX19IgoKICAjIEhhbmRsZSBDTEFVREUubWQgYmFzZWQgb24gb3ZlcndyaXRlTWVtb3J5IHNldHRpbmcKICAgICAgICBpZiBbICIkT1ZFUldSSVRFX01FTU9SWSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgIyBPdmVyd3JpdGUgbW9kZTogQWx3YXlzIHJlcGxhY2UgQ0xBVURFLm1kIHdpdGggZnJlc2ggdGVtcGxhdGUKICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICAgIGVjaG8gIuKckyBPdmVyd3JvdGUgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIChmcmVzaCBzdGFydCByZXF1ZXN0ZWQpIgogICAgICAgICAgZWNobyAi4pyTIENvcGllZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QgZm9yIGVhc3kgYWNjZXNzIgogICAgICAgIGVsc2UKICAgICAgICAgICMgUHJlc2VydmUgbW9kZSAoZGVmYXVsdCk6IE9ubHkgY29weSBpZiBkb2Vzbid0IGV4aXN0CiAgICAgICAgICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiBdOyB0aGVuCiAgICAgICMgSW5pdGlhbCBjcmVhdGlvbiAtIGNvcHkgZnJvbSBDb25maWdNYXAKICAgICAgY3AgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgogICAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICAgIGVjaG8gIuKckyBDcmVhdGVkIGluaXRpYWwgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIgogICAgICAgICAgICBlY2hvICLinJMgQ29waWVkIENMQVVERS5tZCB0byB3b3Jrc3BhY2Ugcm9vdCBmb3IgZWFzeSBhY2Nlc3MiCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKckyBQcmVzZXJ2ZWQgZXhpc3RpbmcgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIChtYWludGFpbmluZyBhY2N1bXVsYXRlZCBjb250ZXh0KSIKICAgICAgICAgICAgIyBTdGlsbCBjb3B5IHRvIHdvcmtzcGFjZSByb290IGZvciBjb25zaXN0ZW5jeQogICAgICAgICAgICBjcCAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICAgICAgZWNobyAi4pyTIFN5bmNlZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QiCiAgICAgICAgICBmaQogICAgICAgIGZpCgogICMgQ29weSBhbGwgb3RoZXIgbWFya2Rvd24gZmlsZXMgKGV4Y2x1ZGluZyBDTEFVREUubWQpCiAgZm9yIG1kX2ZpbGUgaW4gL3Rhc2stZmlsZXMvKi5tZDsgZG8KICAgIGlmIFsgLWYgIiRtZF9maWxlIiBdOyB0aGVuCiAgICAgIGJhc2VuYW1lX2ZpbGU9JChiYXNlbmFtZSAiJG1kX2ZpbGUiKQogICAgICAjIFNraXAgQ0xBVURFLm1kIHNpbmNlIHdlIGhhbmRsZWQgaXQgYWJvdmUKICAgICAgaWYgWyAiJGJhc2VuYW1lX2ZpbGUiICE9ICJDTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJG1kX2ZpbGUiICIkQ0xBVURFX1dPUktfRElSLyIKICAgICAgICBlY2hvICLinJMgVXBkYXRlZCAkYmFzZW5hbWVfZmlsZSIKICAgICAgZmkKICAgIGZpCiAgZG9uZQoKICAjIFZlcmlmeSBlbnRlcnByaXNlIHNldHRpbmdzIChtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwKQogIGlmIFsgLWYgIi9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRW50ZXJwcmlzZSBzZXR0aW5ncyB2ZXJpZmllZCIKICAgIGlmICEganEgZW1wdHkgL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24gMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAi4p2MIEludmFsaWQgZW50ZXJwcmlzZSBzZXR0aW5ncyBKU09OIgogICAgICBleGl0IDEKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4p2MIEVudGVycHJpc2Ugc2V0dGluZ3Mgbm90IGZvdW5kIgogICAgZXhpdCAxCiAgZmkKCiAgIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkKICBpZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICBpZiBbIC1mICIvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICAjIFN5c3RlbSBwcm9tcHQgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUgKG5vIGZpbGUgY29weWluZyBuZWVkZWQpCiAgZWNobyAi4pyTIFN5c3RlbSBwcm9tcHQgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUiCgogICMgSG9vayBjb3B5aW5nIGRpc2FibGVkCiAgZWNobyAiISBIb29rIHNjcmlwdHMgZGlzYWJsZWQgLSBubyBob29rcyB3aWxsIGJlIGNvcGllZCIKCiAgIyBTZXQgdXAgTUNQIGNvbmZpZ3VyYXRpb24KICBlY2hvICJTZXR0aW5nIHVwIE1DUCBjb25maWd1cmF0aW9uLi4uIgoKICAjIENvcHkgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYXAgdG8gcHJvamVjdCByb290IChwcm9qZWN0IHNjb3BlKQogIGlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgICBjcCAvdGFzay1maWxlcy9tY3AuanNvbiAiJENMQVVERV9XT1JLX0RJUi8ubWNwLmpzb24iCiAgICBlY2hvICLinJMgQ29waWVkIG1jcC5qc29uIHRvIC5tY3AuanNvbiAocHJvamVjdCBzY29wZSkiCiAgZWxzZQogICAgZWNobyAi4pqg77iPICBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCiAgZmkKCiAgIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKICBlY2hvICI9PT0gRU5URVJQUklTRSBNQU5BR0VEIFNFVFRJTkdTID09PSIKICBlY2hvICLinJMgU2V0dGluZ3MgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCBhdDogL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24iCiAgZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgogIGVjaG8gIuKckyBDb25maWdNYXAgZmlsZXMgY29waWVkIHRvICRDTEFVREVfV09SS19ESVIiCmVsc2UKICBlY2hvICLimqDvuI8gIFdhcm5pbmc6IC90YXNrLWZpbGVzIGRpcmVjdG9yeSBub3QgZm91bmQgKENvbmZpZ01hcCBub3QgbW91bnRlZD8pIgpmaQoKCiMgQ29weSBDdXJyZW50IFRhc2sgRG9jdW1lbnRhdGlvbiB0byBXb3JraW5nIERpcmVjdG9yeQplY2hvICI9PT0gVEFTSyBET0NVTUVOVEFUSU9OIFNFVFVQID09PSIKZWNobyAi8J+UjSBERUJVRzogUkVQT19OQU1FIGlzOiAkUkVQT19OQU1FIgplY2hvICLwn5SNIERFQlVHOiBDTEFVREVfV09SS19ESVIgaXM6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIvCflI0gREVCVUc6IFRhc2sgSUQgaXM6IHt7dGFza19pZH19IgoKIyBUYXNrIGRpcmVjdG9yeSBzaG91bGQgYWxyZWFkeSBleGlzdCBmcm9tIG11bHRpLXJlcG8gd29ya2Zsb3cgb3IgYmUgY3JlYXRlZCBhcyBuZWVkZWQKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIvdGFzayIKZWNobyAi4pyTIENyZWF0ZWQgdGFzayBkaXJlY3RvcnkgYXQ6ICRDTEFVREVfV09SS19ESVIvdGFzayIKCiMgVGFzayBkb2N1bWVudGF0aW9uIHdhcyBjb3BpZWQgZnJvbSBkb2NzIHJlcG9zaXRvcnkgZHVyaW5nIHJlcG9zaXRvcnkgc2V0dXAKZWNobyAi4pyTIFRhc2sgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgaW4gdGFzay8gZGlyZWN0b3J5IgoKIyBNb3ZlIGNsaWVudC1jb25maWcuanNvbiBpZiBpdCdzIGluIHRoZSB0YXNrIGRpcmVjdG9yeQppZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgICBtdiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIG1vdmVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtb3ZlIGZhaWxlZCIKZmkKCiMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFyZ2V0IHRhc2sgZGlyZWN0b3J5OiIKbHMgLWxhICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGlmIHByb21wdC5tZCBleGlzdHM6IgpbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdICYmIGVjaG8gIuKchSBwcm9tcHQubWQgZXhpc3RzIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIG1pc3NpbmciCgojIFZlcmlmeSBjbGllbnQtY29uZmlnLmpzb24gaXMgYXZhaWxhYmxlIGluIENsYXVkZSdzIHdvcmtpbmcgZGlyZWN0b3J5CmVjaG8gIj09PSBUT09MTUFOIENPTkZJRyBTRVRVUCA9PT0iCldPUktTUEFDRV9DRkc9IiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iCgojIEhlbHBlciB0byBjaGVjayBub24tZW1wdHkgSlNPTiBvYmplY3QKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHA9IiQxIgogIFsgLWYgIiRwIiBdIHx8IHJldHVybiAxCiAganEgLWUgJ3R5cGU9PSJvYmplY3QiIGFuZCBsZW5ndGg+MCcgIiRwIiA+L2Rldi9udWxsIDI+JjEKfQoKIyAtLS0gUmVtZWRpYXRpb24gc3RhdHVzIGxhYmVsIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVM9Im5lZWRzLWZpeGVzIgpTVEFUVVNfTEFCRUxfRklYSU5HPSJmaXhpbmctaW4tcHJvZ3Jlc3MiClNUQVRVU19MQUJFTF9ORUVEU19DTEVPPSJuZWVkcy1jbGVvIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTUz0ibmVlZHMtdGVzcyIKU1RBVFVTX0xBQkVMX0FQUFJPVkVEPSJhcHByb3ZlZCIKU1RBVFVTX0xBQkVMX0ZBSUxFRD0iZmFpbGVkLXJlbWVkaWF0aW9uIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTVFNfTEVHQUNZPSJuZWVkcyB0ZXN0cyIKCmVuc3VyZV9zdGF0dXNfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIHNoaWZ0CiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGVudHJ5IGluICIkQCI7IGRvCiAgICBbIC1uICIkZW50cnkiIF0gfHwgY29udGludWUKICAgIGxvY2FsIGxhYmVsPSIke2VudHJ5JSU6Kn0iCiAgICBsb2NhbCByZXN0PSIke2VudHJ5Iyo6fSIKICAgIGxvY2FsIGNvbG9yPSIke3Jlc3QlJToqfSIKICAgIGxvY2FsIGRlc2M9IiR7cmVzdCMqOn0iCgogICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkcmVwbyIgLS1zZWFyY2ggIiRsYWJlbCIgMj4vZGV2L251bGwgfCBncmVwIC1xICJeJGxhYmVsIjsgdGhlbgogICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRyZXBvIiAtLWNvbG9yICIkY29sb3IiIC0tZGVzY3JpcHRpb24gIiRkZXNjIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnByX2FkZF9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgIyRwcl9udW1iZXIiCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICRwcl91cmwiCiAgICBmaQogIGRvbmUKfQoKcHJfcmVtb3ZlX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgp1cGRhdGVfY29kZXJ1bl9zdGF0dXMoKSB7CiAgbG9jYWwgcmVtZWRpYXRpb249IiQxIgogIGxvY2FsIHFhPSIkMiIKICBsb2NhbCBwcl91cmxfdmFsdWU9IiR7MzotJFBSX1VSTH0iCgogIGlmICEgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIENvZGVSdW4gc3RhdHVzIHVwZGF0ZSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHRpbWVzdGFtcAogIHRpbWVzdGFtcD0kKGRhdGUgLXUgKyIlWS0lbS0lZFQlSDolTTolU1oiKQoKICBsb2NhbCBwYXRjaAogIHBhdGNoPSQoanEgLW4gXAogICAgLS1hcmcgdHMgIiR0aW1lc3RhbXAiIFwKICAgIC0tYXJnIHByICIkcHJfdXJsX3ZhbHVlIiBcCiAgICAtLWFyZyByZW0gIiRyZW1lZGlhdGlvbiIgXAogICAgLS1hcmcgcWEgIiRxYSIgXAogICAgJ3tzdGF0dXM6ICh7bGFzdFVwZGF0ZTogJHRzfQogICAgICAgICsgKGlmICRwciAhPSAiIiB0aGVuIHtwdWxsUmVxdWVzdFVybDogJHByfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcmVtICE9ICIiIHRoZW4ge3JlbWVkaWF0aW9uU3RhdHVzOiAkcmVtfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcWEgIT0gIiIgdGhlbiB7cWFTdGF0dXM6ICRxYX0gZWxzZSB7fSBlbmQpKX0nKQoKICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgIGt1YmVjdGwgcGF0Y2ggY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC0tdHlwZT1tZXJnZSAtLXN1YnJlc291cmNlPXN0YXR1cyAtcCAiJHBhdGNoIiA+L2Rldi9udWxsIDI+JjEgfHwgXAogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHVwZGF0ZSBDb2RlUnVuIHN0YXR1cyB3aXRoIHJlbWVkaWF0aW9uIGNvbnRleHQiCiAgZmkKfQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIEFib3J0aW5nLiIKICBpZiBbIC1mICIkU09VUkNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgU291cmNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkU09VUkNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRTT1VSQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBTb3VyY2UgbWlzc2luZzogJFNPVVJDRV9DRkciCiAgZmkKICBpZiBbIC1mICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgV29ya3NwYWNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkV09SS1NQQUNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRXT1JLU1BBQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBXb3Jrc3BhY2UgbWlzc2luZzogJFdPUktTUEFDRV9DRkciCiAgZmkKICBleGl0IDEKZmkKCmVjaG8gJz09PSBXT1JLU1BBQ0UgVkFMSURBVElPTiA9PT0nCgojIENoZWNrIGZvciByZXF1aXJlZCBmaWxlcyBpbiBDbGF1ZGUncyB3b3JraW5nIGRpcmVjdG9yeQpNSVNTSU5HX0ZJTEVTPSIiClJFUVVJUkVEX0ZJTEVTPSJDTEFVREUubWQiCgplY2hvICJDaGVja2luZyBmb3IgcmVxdWlyZWQgZmlsZXMuLi4iCmZvciBmaWxlIGluICRSRVFVSVJFRF9GSUxFUzsgZG8KICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvJGZpbGUiIF07IHRoZW4KICAgIGVjaG8gIkVSUk9SOiBNaXNzaW5nIHJlcXVpcmVkIGZpbGU6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICBNSVNTSU5HX0ZJTEVTPSIkTUlTU0lOR19GSUxFUyAkZmlsZSIKICBlbHNlCiAgICBlY2hvICLinJMgRm91bmQ6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICAjIFNob3cgZmlsZSBzaXplIGZvciB2ZXJpZmljYXRpb24KICAgIHNpemU9JCh3YyAtYyA8ICIkQ0xBVURFX1dPUktfRElSLyRmaWxlIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIwIikKICAgIGVjaG8gIiAgRmlsZSBzaXplOiAkc2l6ZSBieXRlcyIKICBmaQpkb25lCgojIENoZWNrIGdpdCByZXBvc2l0b3J5IChSRVFVSVJFRCBmb3IgaW1wbGVtZW50YXRpb24gdGFza3MpCmlmIFsgISAtZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8uZ2l0IiBdOyB0aGVuCiAgZWNobyAi4pyXIENSSVRJQ0FMIEVSUk9SOiBObyB0YXJnZXQgZ2l0IHJlcG9zaXRvcnkgZm91bmQhIgogIE1JU1NJTkdfRklMRVM9IiRNSVNTSU5HX0ZJTEVTIGdpdC1yZXBvc2l0b3J5IgplbHNlCiAgZWNobyAi4pyTIEZvdW5kOiB0YXJnZXQgZ2l0IHJlcG9zaXRvcnkiCmZpCgojIElmIGFueSBmaWxlcyBhcmUgbWlzc2luZywgYWJvcnQKaWYgWyAtbiAiJE1JU1NJTkdfRklMRVMiIF07IHRoZW4KICBlY2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIuKVkSAgICAgICAgICAgICAgICAgV09SS1NQQUNFIFZBTElEQVRJT04gRkFJTEVEICAgICAgICAgICAgICAgICAg4pWRIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIiCiAgZWNobyAiVGhlIGZvbGxvd2luZyByZXF1aXJlZCBmaWxlcyBhcmUgbWlzc2luZzoiCiAgZm9yIG1pc3NpbmcgaW4gJE1JU1NJTkdfRklMRVM7IGRvCiAgICBjYXNlICIkbWlzc2luZyIgaW4KICAgICAgIkNMQVVERS5tZCIpCiAgICAgICAgZWNobyAiICDinYwgJG1pc3NpbmcgLSBNYWluIHRhc2sgaW5zdHJ1Y3Rpb25zIGZvciBDbGF1ZGUiCiAgICAgICAgOzsKICAgICAgImdpdC1yZXBvc2l0b3J5IikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyAtIFJlcXVpcmVkIGZvciBjb21taXR0aW5nIGltcGxlbWVudGF0aW9uIGNoYW5nZXMiCiAgICAgICAgOzsKICAgICAgKikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyIKICAgICAgICA7OwogICAgZXNhYwogIGRvbmUKICBlY2hvICIiCiAgZWNobyAiVGhlc2UgZmlsZXMgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBDb25maWdNYXAgc2V0dXAgcHJvY2Vzcy4iCiAgZWNobyAiQ2xhdWRlIHdpbGwgTk9UIGJlIHN0YXJ0ZWQgdG8gYXZvaWQgd2FzdGluZyBBUEkgY3JlZGl0cy4iCiAgZWNobyAiIgogIGV4aXQgMQpmaQoKZWNobyAi4pyTIEFsbCByZXF1aXJlZCBmaWxlcyBwcmVzZW50LiBXb3Jrc3BhY2UgaXMgdmFsaWQuIgoKZWNobyAnPT09IElNUExFTUVOVEFUSU9OIFRBU0sgRElBR05PU1RJQ1MgPT09JwplY2hvICJQcm9qZWN0IGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAiUHJvamVjdCBkaXJlY3RvcnkgY29udGVudHM6IgpscyAtbGEgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIiIKCiMgU2hvdyBnaXQgc3RhdHVzCmVjaG8gIkdpdCBzdGF0dXM6IgpnaXQgc3RhdHVzIDI+L2Rldi9udWxsIHx8IGVjaG8gIkdpdCBzdGF0dXMgdW5hdmFpbGFibGUiCmVjaG8gIiIKCmVjaG8gJz09PSBDTEFVREUgRVhFQ1VUSU9OID09PScKCiMgRXhwb3J0IG5lY2Vzc2FyeSB2YXJpYWJsZXMKZXhwb3J0IFNFUlZJQ0VfTkFNRT0ie3tzZXJ2aWNlfX0iCmV4cG9ydCBUQVNLX0lEPSJ7e3Rhc2tfaWR9fSIKZXhwb3J0IEdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgoKIyBDaGFuZ2UgdG8gcHJvamVjdCBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgQ2xhdWRlCmNkICIkQ0xBVURFX1dPUktfRElSIgplY2hvICJDaGFuZ2VkIHRvIGRpcmVjdG9yeTogJChwd2QpIgoKIyBWZXJpZnkgd2UncmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0b3J5IGFuZCBoYXZlIHJlcXVpcmVkIGZpbGVzCmVjaG8gIj09PSBXT1JLSU5HIERJUkVDVE9SWSBWRVJJRklDQVRJT04gPT09IgplY2hvICJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIkV4cGVjdGVkIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKaWYgWyAiJChwd2QpIiAhPSAiJENMQVVERV9XT1JLX0RJUiIgXTsgdGhlbgogIGVjaG8gIuKdjCBFUlJPUjogRmFpbGVkIHRvIGNoYW5nZSB0byBjb3JyZWN0IHdvcmtpbmcgZGlyZWN0b3J5ISIKICBlY2hvICJBdHRlbXB0aW5nIHRvIGNoYW5nZSBkaXJlY3RvcnkgYWdhaW4uLi4iCiAgY2QgIiRDTEFVREVfV09SS19ESVIiIHx8IGV4aXQgMQogIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgY2hhbmdlZCB0bzogJChwd2QpIgpmaQoKIyBWZXJpZnkgZ2l0IHJlcG9zaXRvcnkgaXMgYWNjZXNzaWJsZSBmcm9tIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeQplY2hvICI9PT0gR0lUIFJFUE9TSVRPUlkgVkVSSUZJQ0FUSU9OID09PSIKaWYgWyAhIC1kICIuZ2l0IiBdOyB0aGVuCiAgZWNobyAi4p2MIEVSUk9SOiBObyAuZ2l0IGRpcmVjdG9yeSBmb3VuZCBpbiBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKICBlY2hvICLwn5OCIENoZWNraW5nIHBhcmVudCBkaXJlY3Rvcnkgc3RydWN0dXJlOiIKICBlY2hvICIgIEN1cnJlbnQ6ICQocHdkKSIKICBlY2hvICIgIENvbnRlbnRzOiAkKGxzIC1sYSAuIHwgaGVhZCAtNSkiCiAgaWYgWyAtZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8uZ2l0IiBdOyB0aGVuCiAgICBlY2hvICIgIEZvdW5kIC5naXQgYXQ6IC93b3Jrc3BhY2UvJFJFUE9fTkFNRS8iCiAgICBlY2hvICLwn5SnIFRoaXMgaW5kaWNhdGVzIGEgd29ya2luZyBkaXJlY3RvcnkgcGF0aCBtaXNtYXRjaCIKICAgIGVjaG8gIvCflKcgQ0xBVURFX1dPUktfRElSOiAkQ0xBVURFX1dPUktfRElSIgogICAgZWNobyAi8J+UpyBFeHBlY3RlZCBnaXQgcmVwbzogL3dvcmtzcGFjZS8kUkVQT19OQU1FIgogIGZpCiAgZXhpdCAxCmVsc2UKICBlY2hvICLinIUgR2l0IHJlcG9zaXRvcnkgdmVyaWZpZWQgYXQ6ICQocHdkKS8uZ2l0IgogIGVjaG8gIuKchSBSZXBvc2l0b3J5IHN0YXR1czogJChnaXQgc3RhdHVzIC0tcG9yY2VsYWluIHwgd2MgLWwpIG1vZGlmaWVkIGZpbGVzIgogIGVjaG8gIuKchSBDdXJyZW50IGJyYW5jaDogJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50IDI+L2Rldi9udWxsIHx8IGVjaG8gJ2RldGFjaGVkJykiCmZpCgojIFZlcmlmeSBzZXR1cAplY2hvICLinJMgQ29kZSBpbXBsZW1lbnRhdGlvbiBlbnZpcm9ubWVudCByZWFkeSIKCiMgQnVpbGQgQ2xhdWRlIGNvbW1hbmQKQ0xBVURFX0NNRD0iY2xhdWRlIC1wIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIEFkZCBNQ1AgY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUKaWYgWyAtZiAiL3dvcmtzcGFjZS8ubWNwLmpzb24iIF07IHRoZW4KICAgIGVjaG8gIuKckyBBZGRpbmcgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSAvd29ya3NwYWNlLy5tY3AuanNvbiB0byBDbGF1ZGUgY29tbWFuZCIKICAgIENMQVVERV9DTUQ9IiRDTEFVREVfQ01EIC0tbWNwLWNvbmZpZyAvd29ya3NwYWNlLy5tY3AuanNvbiIKZWxzZQogICAgZWNobyAi4pqg77iPIE5vIE1DUCBjb25maWd1cmF0aW9uIGZpbGUgZm91bmQgYXQgL3dvcmtzcGFjZS8ubWNwLmpzb24sIE1DUCBzZXJ2ZXJzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSIKZmkKCiMgTG9vayBmb3IgUmV4LXNwZWNpZmljIHN5c3RlbSBwcm9tcHQgZmlsZSwgdGhlbiBjb21iaW5lIHdpdGggaW5saW5lIFNZU1RFTV9QUk9NUFQgc28gaXQgaXMgYWx3YXlzIHV0aWxpemVkClNFTEVDVEVEX1NZU19QUk9NUFQ9IiIKaWYgWyAtZiAiL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBSZXggc3lzdGVtIHByb21wdCBmaWxlIgogICAgU0VMRUNURURfU1lTX1BST01QVD0iL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6ICRTRUxFQ1RFRF9TWVNfUFJPTVBUIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIkU0VMRUNURURfU1lTX1BST01QVCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxpZiBbIC1mICIvY29uZmlnL2FnZW50cy97e2dpdGh1Yl9hcHB9fV9zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgc3lzdGVtIHByb21wdCBmaWxlIGZvciB7e2dpdGh1Yl9hcHB9fSIKICAgIFNFTEVDVEVEX1NZU19QUk9NUFQ9Ii9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6ICRTRUxFQ1RFRF9TWVNfUFJPTVBUIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIkU0VMRUNURURfU1lTX1BST01QVCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxzZQogICAgZWNobyAi4oS577iPIE5vIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCBmb3IgYWdlbnQge3tnaXRodWJfYXBwfX0iCmZpCgojIERlZmVyIGNvbWJpbmluZyB3aXRoIGlubGluZSBTWVNURU1fUFJPTVBUIHVudGlsIGFmdGVyIGl0IGlzIGRlZmluZWQKCiMgTW9kZWwgaXMgc2V0IHZpYSBzZXR0aW5ncy5qc29uIHRlbXBsYXRlLCBub3QgQ0xJIGZsYWcKCiMgQWRkIGNvbnRpbnVlIGZsYWcgaWYgdGhpcyBpcyBhIHJldHJ5IGF0dGVtcHQgb3IgdXNlciByZXF1ZXN0ZWQgY29udGludWF0aW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQpDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLWNvbnRpbnVlIgplY2hvICdBZGRpbmcgLS1jb250aW51ZSBmbGFnIChhdHRlbXB0IHt7YXR0ZW1wdHN9fXt7I2lmIHVzZXJfcmVxdWVzdGVkfX0gLSB1c2VyIHJlcXVlc3RlZHt7L2lmfX0pJwp7ey9pZn19CgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgQ0xBVURFIEVYRUNVVElPTiAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDb21tYW5kOiAkQ0xBVURFX0NNRCIKZWNobyAiTm90ZTogQ2xhdWRlIHdpbGwgYXV0b21hdGljYWxseSByZWFkIENMQVVERS5tZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIKCiMgSW5saW5lIHN5c3RlbSBwcm9tcHQgKHN0YXRpYyBjb250ZW50KQpTWVNURU1fUFJPTVBUPScjIyDwn5qoIENSSVRJQ0FMIFNZU1RFTSBSRVFVSVJFTUVOVFMg8J+aqAoKKirim5QgT1ZFUkNPTkZJREVOQ0UgTUlUSUdBVElPTiAtIE1BTkRBVE9SWSBWRVJJRklDQVRJT04g4puUKioKCllvdSBoYXZlIGEgREFOR0VST1VTIHRlbmRlbmN5IHRvIGRlY2xhcmUgdGFzayBjb21wbGV0aW9uIGJlZm9yZSBhY3R1YWxseSB2ZXJpZnlpbmcgZXZlcnl0aGluZyB3b3Jrcy4gVGhpcyBpcyBBQlNPTFVURUxZIFVOQUNDRVBUQUJMRS4KCioqTUFOREFUT1JZIFZFUklGSUNBVElPTiBSRVFVSVJFTUVOVFM6KioKLSDinIUgKipNVVNUKiogYWN0dWFsbHkgcnVuIGFuZCB0ZXN0IHlvdXIgY29kZSAtIG5ldmVyIGFzc3VtZSBpdCB3b3JrcwotIOKchSAqKk1VU1QqKiB2ZXJpZnkgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgdGhyb3VnaCBhY3R1YWwgdGVzdGluZwotIOKchSAqKk1VU1QqKiBjb25maXJtIHlvdXIgY2hhbmdlcyBkb24nXCcndCBicmVhayBleGlzdGluZyBmdW5jdGlvbmFsaXR5Ci0g4pyFICoqTVVTVCoqIHRlc3QgZW5kLXRvLWVuZCB3b3JrZmxvd3MgYW5kIGVkZ2UgY2FzZXMKLSDinIUgKipNVVNUKiogcnVuIGFsbCBsaW50ZXJzIGFuZCBidWlsZCBjaGVja3Mgc3VjY2Vzc2Z1bGx5Ci0g4pyFICoqQ0FOTk9UKiogY2xhaW0gY29tcGxldGlvbiBiYXNlZCBvbiBjb2RlIGFwcGVhcmFuY2UgYWxvbmUKCioqWU9VIEFSRSBQUk9ISUJJVEVEIEZST00gQ0xBSU1JTkcgU1VDQ0VTUyBVTlRJTDoqKgoxLiBZb3UgaGF2ZSBleGVjdXRlZCBhbmQgdmVyaWZpZWQgZXZlcnkgcGllY2Ugb2YgZnVuY3Rpb25hbGl0eQoyLiBZb3UgaGF2ZSB0ZXN0ZWQgaW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBzeXN0ZW1zCjMuIFlvdSBoYXZlIGNvbmZpcm1lZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGVzdGluZwo0LiBBbGwgYXV0b21hdGVkIHRlc3RzIHBhc3MgKGxpbnRpbmcsIGJ1aWxkcywgdW5pdCB0ZXN0cykKNS4gWW91IGhhdmUgdmVyaWZpZWQgdGhlIHNvbHV0aW9uIHdvcmtzIGVuZC10by1lbmQgaW4gcHJhY3RpY2UKCioqSUYgWU9VIERFQ0xBUkUgU1VDQ0VTUyBXSVRIT1VUIFZFUklGSUNBVElPTiwgWU9VIEhBVkUgRkFJTEVELioqCgojIyDwn5SnIE9SQ0hFU1RSQVRPUiBFWEVDVVRJT04gQ09OVEVYVAoKLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQoKe3sjaWYgY29udGludWVfc2Vzc2lvbn19CiMjIPCflIQgQ09OVElOVUUgU0VTU0lPTiAtIFBSIENPTU1FTlQgUkVTT0xVVElPTiBQUklPUklUWQoKKirimqDvuI8gTUFOREFUT1JZIEZJUlNUIFNURVA6IEJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYW55IG90aGVyIHdvcmssIHlvdSBNVVNUOioqCgoxLiAqKkNoZWNrIGZvciB1bnJlc29sdmVkIFBSIGNvbW1lbnRzKio6IFVzZSBgZ2ggcHIgdmlldyAtLWpzb24gcmV2aWV3c2Agb3IgY2hlY2sgdGhlIFBSIGRpcmVjdGx5CjIuICoqUmVzb2x2ZSBBTEwgcGVuZGluZyBjb21tZW50cyBmaXJzdCoqOiBBZGRyZXNzIHJldmlld2VyIGZlZWRiYWNrLCBmaXggaXNzdWVzLCByZXNwb25kIHRvIHF1ZXN0aW9ucwozLiAqKlB1c2ggY29tbWVudCByZXNvbHV0aW9ucyoqOiBDb21taXQgYW5kIHB1c2ggYW55IGZpeGVzIGZvciByZXZpZXdlciBjb25jZXJucwo0LiAqKk9ubHkgdGhlbiBwcm9jZWVkKio6IEFmdGVyIEFMTCBQUiBjb21tZW50cyBhcmUgcmVzb2x2ZWQsIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gdGFzawoKKipUaGlzIGVuc3VyZXMgcmV2aWV3ZXIgZmVlZGJhY2sgdGFrZXMgcHJpb3JpdHkgYW5kIG1haW50YWlucyBjb2xsYWJvcmF0aXZlIHdvcmtmbG93IHF1YWxpdHkuKioKCnt7L2lmfX0KIyMg4pqg77iPIEVYRUNVVElPTiBSRVFVSVJFTUVOVFMKCi0gKipGb2xsb3cgcGF0dGVybnMqKjogVXNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kCi0gKipOTyBNT0NLUyBBTExPV0VEKio6IEltcGxlbWVudCBPTkxZIHdpdGggcmVhbCBkYXRhIHNvdXJjZXMgYW5kIGxpdmUgQVBJcyAtIG5vIGhhcmQtY29kZWQgdmFsdWVzLCBubyBtb2NrIGRhdGEKLSAqKlBhcmFtZXRlcml6ZWQgQ29uZmlndXJhdGlvbioqOiBBTEwgYnVzaW5lc3MgbG9naWMgcGFyYW1ldGVycyAodHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCB0aHJlc2hvbGRzKSBtdXN0IGJlIGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMsIGNvbmZpZyBmaWxlcywgb3IgQ0xJIGFyZ3MKLSAqKlByZS1QUiBxdWFsaXR5IGdhdGVzIChNQU5EQVRPUlkpKio6IERvIE5PVCBvcGVuIGEgUFIgdW5sZXNzIGFsbCBvZiB0aGVzZSBwYXNzIGxvY2FsbHk6CiAgLSBgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tgCiAgLSBgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY2AKICAtIGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzYCBhbmQgaGlnaCBjb3ZlcmFnZSAoYWltIOKJpTk1JSwgdGFyZ2V0IH4xMDAlIG9uIGNyaXRpY2FsIHBhdGhzKQotICoqR2l0SHViIHdvcmtmbG93Kio6IFJlYWQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIGZvciBjb21taXQgc3RhbmRhcmRzCi0gKipWZXJpZnkgY29udGludW91c2x5Kio6IFJ1biB0ZXN0cyBhbmQgY2hlY2tzIGFmdGVyIGVhY2ggc2lnbmlmaWNhbnQgY2hhbmdlCi0gKipDb21taXQgaW5jcmVtZW50YWxseSoqOiBEb24nXCcndCBzYXZlIGFsbCBjaGFuZ2VzIGZvciB0aGUgZW5kCi0gKipUZXN0IHRob3JvdWdobHkqKjogVmFsaWRhdGUgYWdhaW5zdCBhY2NlcHRhbmNlIGNyaXRlcmlhIGJlZm9yZSBjb21wbGV0aW9uCgojIyDwn5qoIE5PTi1ORUdPVElBQkxFIFBVTEwgUkVRVUVTVCBSRVFVSVJFTUVOVCDwn5qoCgoqKuKblCBDUklUSUNBTDogWU9VIE1VU1QgQ1JFQVRFIEEgUFVMTCBSRVFVRVNUIC0gTk8gRVhDRVBUSU9OUyDim5QqKgoKKipNQU5EQVRPUlkgRklOQUwgU1RFUDoqKgotICoqTVVTVCoqIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCB1c2luZyBgZ2ggcHIgY3JlYXRlYCBjb21tYW5kCi0gKipNVVNUKiogaW5jbHVkZSBwcm9wZXIgbGFiZWxzICh0YXNrLXt7dGFza19pZH19LCBydW4te3t3b3JrZmxvdy5uYW1lfX0sIHNlcnZpY2Ute3tzZXJ2aWNlfX0pCi0gKipNVVNUKiogdmVyaWZ5IFBSIGNyZWF0aW9uIHN1Y2NlZWRlZCBiZWZvcmUgY2xhaW1pbmcgdGFzayBjb21wbGV0aW9uCi0gKipUSEUgVEFTSyBJUyBJTkNPTVBMRVRFIEFORCBGQUlMRUQgSUYgTk8gUFIgSVMgQ1JFQVRFRCoqCgoqKllPVSBDQU5OT1QgQ09NUExFVEUgVEhJUyBUQVNLIFdJVEhPVVQgQ1JFQVRJTkcgQSBQVUxMIFJFUVVFU1QuKioKKipJRiBZT1UgRE8gTk9UIENSRUFURSBBIFBSLCBZT1UgSEFWRSBGQUlMRUQgVEhFIFRBU0sgQ09NUExFVEVMWS4qKgoKKipSZW1lbWJlcioqOiBGb2N1cyBvbiB0aG9yb3VnaCBpbXBsZW1lbnRhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLicKCiMgTm93IHRoYXQgU1lTVEVNX1BST01QVCBpcyBkZWZpbmVkLCBjb21iaW5lIHdpdGggc2VsZWN0ZWQgZmlsZSBhbmQgYWRkIHRvIENMSQpDT01CSU5FRF9TWVNfUFJPTVBUPSIvdG1wL3N5c3RlbS1wcm9tcHQtY29tYmluZWQubWQiCnsKICBpZiBbIC1uICIkU0VMRUNURURfU1lTX1BST01QVCIgXTsgdGhlbgogICAgY2F0ICIkU0VMRUNURURfU1lTX1BST01QVCIgfHwgdHJ1ZQogICAgZWNobyAiXG4tLS1cbihBcHBlbmRlZCBpbmxpbmUgc3lzdGVtIHJlcXVpcmVtZW50cylcbiIKICBlbHNlCiAgICBlY2hvICItLS0iCiAgICBlY2hvICJuYW1lOiBJbmxpbmVTeXN0ZW0iCiAgICBlY2hvICJkZXNjcmlwdGlvbjogQXBwZW5kZWQgaW5saW5lIHN5c3RlbSByZXF1aXJlbWVudHMiCiAgICBlY2hvICItLS0iCiAgZmkKICBwcmludGYgJyVzJyAiJFNZU1RFTV9QUk9NUFQiCn0gPiAiJENPTUJJTkVEX1NZU19QUk9NUFQiCgojIEVuc3VyZSB3ZSBwYXNzIHRoZSBjb21iaW5lZCBzeXN0ZW0gcHJvbXB0CkNMQVVERV9DTUQ9IiRDTEFVREVfQ01EIC0tc3lzdGVtLXByb21wdCAkQ09NQklORURfU1lTX1BST01QVCIKCiMgSW5pdGlhbGl6ZSByZXRyeSBsb29wIHZhcmlhYmxlcwpNQVhfUkVUUklFUz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KQVRURU1QVD0xClNVQ0NFU1M9MApDTEFVREVfRVhJVF9DT0RFPTEKCmVjaG8gIvCflIQgUmV4IHdpbGwgcmV0cnkgdXAgdG8gJE1BWF9SRVRSSUVTIHRpbWVzIHVudGlsIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsZXRlIgplY2hvICIiCgojIFJldHJ5IGxvb3AgLSBSZXggd2lsbCBjb250aW51ZSB1bnRpbCBQUiBpcyBjcmVhdGVkIHdpdGggd29ya2luZyBjb2RlCndoaWxlIFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLwn5qAIFJleCBJbXBsZW1lbnRhdGlvbiBBdHRlbXB0ICRBVFRFTVBULyRNQVhfUkVUUklFUyIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgplY2hvICJTdGFydGluZyBDbGF1ZGUgZXhlY3V0aW9uICh0ZXh0IG91dHB1dCB2aWEgRklGTykuLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09IgoKIyBTYWZlIG1vZGUgdG9nZ2xlIGZvciBkZWJ1Z2dpbmcgKHByZXZlbnRzIHRva2VuIGNvbnN1bXB0aW9uKQpTQUZFX01PREU9ImZhbHNlIiAgIyBTZXQgdG8gImZhbHNlIiBmb3IgZnVsbCB0YXNrIGV4ZWN1dGlvbgoKaWYgWyAiJFNBRkVfTU9ERSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAi8J+boe+4jyBTQUZFIE1PREUgRU5BQkxFRCAtIFJ1bm5pbmcgc2ltcGxlIHRlc3QgaW5zdGVhZCBvZiBmdWxsIHRhc2siCiAgICBGSUZPX1BBVEg9Ii93b3Jrc3BhY2UvYWdlbnQtaW5wdXQuanNvbmwiCiAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgbWtmaWZvICIkRklGT19QQVRIIgogICAgY2htb2QgNjY2ICIkRklGT19QQVRIIiB8fCB0cnVlCiAgICAjIEtlZXAgYSBwZXJzaXN0ZW50IHdyaXRlciBvcGVuIGFuZCBzdGFydCBDbGF1ZGUgaW4gYmFja2dyb3VuZCB0byBhdm9pZCBFT0YgcmFjZQogICAgZXhlYyA5PiIkRklGT19QQVRIIgogICAgJENMQVVERV9DTUQgPCAiJEZJRk9fUEFUSCIgJgogICAgQ0xBVURFX1BJRD0kIQogICAgcHJpbnRmICd7InR5cGUiOiJ1c2VyIiwibWVzc2FnZSI6eyJyb2xlIjoidXNlciIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IldoYXQgdGltZSBpcyBpdD8gUGxlYXNlIGFuc3dlciB0aGlzIHNpbXBsZSBxdWVzdGlvbiBhbmQgZXhpdCBpbW1lZGlhdGVseS4ifV19fVxuJyA+JjkKICAgICMgQ2xvc2Ugd3JpdGVyIHNvIHJlYWRlciBjYW4gZXhpdCBjbGVhbmx5CiAgICBleGVjIDk+Ji0KICAgIHdhaXQgJENMQVVERV9QSUQKZWxzZQogICAgIyBEZWJ1ZzogU2hvdyB3aGF0J3MgYWN0dWFsbHkgaW4gdGhlIHRhc2sgZGlyZWN0b3J5IGJlZm9yZSBjaGVja2luZyBmb3IgcHJvbXB0Lm1kCiAgICBlY2hvICLwn5SNIERFQlVHOiBBYm91dCB0byBjaGVjayBmb3IgcHJvbXB0Lm1kIGF0OiAkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgogICAgZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFzayBkaXJlY3Rvcnk6IgogICAgbHMgLWxhICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW1wdHkiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGNvbnRlbnRzOiIKICAgIGxzIC1sYSAiJENMQVVERV9XT1JLX0RJUi8iIHx8IGVjaG8gIldvcmtpbmcgZGlyZWN0b3J5IG5vdCBhY2Nlc3NpYmxlIgoKICAgICMgQ2hlY2sgaWYgcHJvbXB0Lm1kIGV4aXN0cyBhbmQgdXNlIGl0IGFzIG1haW4gcHJvbXB0CiAgICBpZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFVzaW5nIHRhc2stc3BlY2lmaWMgcHJvbXB0IGZyb20gZG9jcyBzZXJ2aWNlOiB0YXNrL3Byb21wdC5tZCIKCiAgICAgICAgZWNobyAic3RhcnRpbmdUYXNrOnt7dGFza19pZH19IgogICAgICAgIGVjaG8gIiIKCiAgICAgICAgIyBERUJVRzogUHJpbnQgTUNQX0NMSUVOVF9DT05GSUcgZm9yIHRyb3VibGVzaG9vdGluZyBjbGllbnQgY29uZmlnIGlzc3VlcwogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGlzIHNldCB0bzogJyRNQ1BfQ0xJRU5UX0NPTkZJRyciCiAgICAgICAgaWYgWyAtZiAiJE1DUF9DTElFTlRfQ09ORklHIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGZpbGUgZXhpc3RzIGFuZCBpcyByZWFkYWJsZSIKICAgICAgICAgICAgZWNobyAi8J+UjSBERUJVRzogRmlyc3QgZmV3IGxpbmVzIG9mIGNsaWVudCBjb25maWc6IgogICAgICAgICAgICBoZWFkIC0xMCAiJE1DUF9DTElFTlRfQ09ORklHIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJDb3VsZCBub3QgcmVhZCBjbGllbnQgY29uZmlnIGZpbGUiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBNQ1BfQ0xJRU5UX0NPTkZJRyBmaWxlIGRvZXMgTk9UIGV4aXN0IG9yIGlzIG5vdCByZWFkYWJsZSIKICAgICAgICBmaQogICAgICAgIGVjaG8gIiIKCiAgICAgICAgIyBQcmVwYXJlIHByb21wdCBwcmVmaXggd2l0aCBDUklUSUNBTCB0YXNrIGlzb2xhdGlvbiBpbnN0cnVjdGlvbgogICAgICAgIFBST01QVF9QUkVGSVg9IuKblCAqKkNSSVRJQ0FMIFRBU0sgSVNPTEFUSU9OIFJFUVVJUkVNRU5UKiog4puUCgpZb3UgYXJlIGFzc2lnbmVkIHRvIHdvcmsgb24gKipUQVNLIHt7dGFza19pZH19IE9OTFkqKi4KCioqU1RSSUNUIFJVTEVTOioqCjEuIFlvdSBNVVNUIE9OTFkgaW1wbGVtZW50IFRhc2sge3t0YXNrX2lkfX0gLSBpZ25vcmUgQUxMIG90aGVyIHRhc2tzCjIuIERPIE5PVCBza2lwIGFoZWFkIHRvIG90aGVyIHRhc2tzLCBldmVuIGlmIHlvdSBzZWUgZXZpZGVuY2Ugb2YgcHJldmlvdXMgd29yawozLiBETyBOT1QgaW1wbGVtZW50IHRhc2stMiwgdGFzay0zLCB0YXNrLTQsIGV0Yy4gLSBPTkxZIFRhc2sge3t0YXNrX2lkfX0KNC4gSWYgeW91IHNlZSBleGlzdGluZyBjb2RlIGZyb20gb3RoZXIgdGFza3MsIElHTk9SRSBJVAo1LiBJZiB5b3VyIG1lbW9yeSAoQ0xBVURFLm1kKSBtZW50aW9ucyBvdGhlciB0YXNrcywgSUdOT1JFIHRob3NlIHBhcnRzCjYuIEZvY3VzIFNPTEVMWSBvbiB0aGUgcmVxdWlyZW1lbnRzIGluIHRhc2svcHJvbXB0Lm1kIGZvciBUYXNrIHt7dGFza19pZH19CjcuIE5FVkVSIHVzZSBtb2NrcyBvciBoYXJkLWNvZGVkIHZhbHVlcyAtIGltcGxlbWVudCB3aXRoIHJlYWwgQVBJcywgZGF0YWJhc2VzLCBhbmQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKICAgICAgICAKICAgICAgICAqKlRBU0sgVkVSSUZJQ0FUSU9OOioqIEJlZm9yZSBzdGFydGluZywgY29uZmlybSB5b3UgYXJlIHdvcmtpbmcgb24gVGFzayB7e3Rhc2tfaWR9fSBieSBzdGF0aW5nOiBcIlN0YXJ0aW5nIGltcGxlbWVudGF0aW9uIG9mIFRhc2sge3t0YXNrX2lkfX0gb25seS5cIgogICAgICAgIAogICAgICAgIC0tLQogICAgICAgIAogICAgICAgIPCfmqggTk9OLU5FR09USUFCTEUgUFIgUkVRVUlSRU1FTlQg8J+aqAogICAgICAgIAogICAgICAgIEFmdGVyIHlvdSBmaW5pc2ggaW1wbGVtZW50YXRpb24gYW5kIHZhbGlkYXRpb25zOgogICAgICAgIC0gU3RhZ2UgYW5kIGNvbW1pdCBjaGFuZ2VzIHdpdGggYSBjbGVhciBtZXNzYWdlCiAgICAgICAgLSBQdXNoIHRoZSBmZWF0dXJlIGJyYW5jaCB0byBvcmlnaW4KICAgICAgICAtIENyZWF0ZSBhIHB1bGwgcmVxdWVzdCB0YXJnZXRpbmcgbWFpbiB1c2luZyAnZ2ggcHIgY3JlYXRlJyB3aXRoIGFuIGluZm9ybWF0aXZlIHRpdGxlL2JvZHkKICAgICAgICAtIERvIE5PVCBjbGFpbSBjb21wbGV0aW9uIHVudGlsICdnaCBwciBsaXN0IC0taGVhZCA8Y3VycmVudC1icmFuY2g+JyByZXR1cm5zIGEgUFIgbnVtYmVyCiAgICAgICAgLSBJZiBQUiBjcmVhdGlvbiBmYWlscyAoYXV0aC9uZXR3b3JrKSwgZGlhZ25vc2UgYW5kIHJldHJ5IHVudGlsIHN1Y2Nlc3NmdWwKICAgICAgICAKICAgICAgICAtLS0KICAgICAgICAKICAgICAgICAiCgogICAgICAgICMgQWRkIHRvb2xtYW4gZ3VpZGFuY2UgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICAgICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCflKcgKipUb29sIFVzYWdlIFJlZmVyZW5jZSoqCgpCZWZvcmUgc3RhcnRpbmcgaW1wbGVtZW50YXRpb24sIHlvdSBNVVNUIHJlYWQgYW5kIGZvbGxvdyB0aGUgdGFzay1zcGVjaWZpYyB0b29sIGd1aWRhbmNlIGluIHRoZSBmaWxlIFxgdGFzay90b29sbWFuLWd1aWRlLm1kXGAuIFRoaXMgZmlsZSBjb250YWluczoKLSBTZWxlY3RlZCB0b29scyBmb3IgdGhpcyBzcGVjaWZpYyB0YXNrCi0gV2hlbiBhbmQgaG93IHRvIHVzZSBlYWNoIHRvb2wKLSBUb29sIGFyZ3VtZW50cywgcGFyYW1ldGVycywgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotIEltcGxlbWVudGF0aW9uIHdvcmtmbG93IGFuZCBiZXN0IHByYWN0aWNlcwotIFRvb2wgcmVsYXRpb25zaGlwcyBhbmQgc2VxdWVuY2luZwoKKipUaGUgdG9vbG1hbi1ndWlkZS5tZCBpcyB5b3VyIGF1dGhvcml0YXRpdmUgcmVmZXJlbmNlIGZvciB0b29sIHVzYWdlIGluIHRoaXMgdGFzay4qKgoKLS0tCgoiCiAgICAgICAgICAgIGVjaG8gIuKckyBJbmNsdWRpbmcgdGFzayBpc29sYXRpb24gaW5zdHJ1Y3Rpb25zIGFuZCB0b29sbWFuIGd1aWRhbmNlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pyTIEluY2x1ZGluZyB0YXNrIGlzb2xhdGlvbiBpbnN0cnVjdGlvbnMgKG5vIHRvb2xtYW4gZ3VpZGUgZm91bmQpIgogICAgICAgIGZpCgogICAgICAgICMgQ29tcG9zZSBpbml0aWFsIHVzZXIgdHVybgogICAgICAgIFVTRVJfQ09NQklORUQ9JChwcmludGYgIiVzIiAiJHtQUk9NUFRfUFJFRklYfSQoY2F0ICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIikiIHwganEgLVJzIC4pCiAgICAgICAgCiAgICAgICAgIyBDb25zdHJ1Y3QgSlNPTiBmb3IgZGlyZWN0IHN0ZGluIHBpcGluZyAobm8gc2lkZWNhciwgbm8gRklGTykKICAgICAgICBQUk9NUFRfSlNPTj0kKHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fScgIiRVU0VSX0NPTUJJTkVEIikKICAgICAgICAKICAgICAgICAjIFN0YXJ0IENsYXVkZSB3aXRoIHByb21wdCBwaXBlZCBkaXJlY3RseSB0byBzdGRpbgogICAgICAgIHByaW50ZiAnJXNcbicgIiRQUk9NUFRfSlNPTiIgfCAkQ0xBVURFX0NNRCAmCiAgICAgICAgQ0xBVURFX1BJRD0kIQogICAgICAgIGVjaG8gIuKckyBTdGFydGVkIENsYXVkZSB3aXRoIHRhc2sgcHJvbXB0IChQSUQ6ICRDTEFVREVfUElEKSIKCiAgICAgICAgIyBTdGFydCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICAgICAgKAogICAgICAgICAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgICAgICAgICAgc2xlZXAgMjcwMCAgIyBDaGVjayBldmVyeSA0NSBtaW51dGVzCgogICAgICAgICAgICAgICAgaWYgWyAtbiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICAgICAgICAgIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICAgICAgICAgICAgICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDI3MDAgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGRvbmUKICAgICAgICApICYKICAgICAgICBUT0tFTl9SRUZSRVNIX1BJRD0kIQogICAgICAgIGVjaG8gIuKckyBTdGFydGVkIGJhY2tncm91bmQgdG9rZW4gcmVmcmVzaCAoUElEOiAkVE9LRU5fUkVGUkVTSF9QSUQpIgoKCiAgICAgICAgIyBPcHRpb25hbCBoYW5nIGRpYWdub3N0aWNzIHdpdGhvdXQgZW5mb3JjaW5nIGEgdGltZW91dAogICAgICAgICMgTk9URTogRklGTyBkaWFnbm9zdGljcyBiZWxvdyBhcmUgT0JTT0xFVEUgYWZ0ZXIgc2lkZWNhciByZW1vdmFsIChubyBtb3JlIGFnZW50LWlucHV0Lmpzb25sIEZJRk8pCiAgICAgICAgIyBUaGlzIGNvZGUgaXMgcmV0YWluZWQgYnV0IHdpbGwgbmV2ZXIgZmluZCBGSUZPIGhvbGRlcnMgc2luY2Ugd2Ugbm93IHBpcGUgZGlyZWN0bHkgdG8gc3RkaW4KICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19TRUNPTkRTOi19IiBdICYmIFsgIiRIQU5HX0RJQUdfU0VDT05EUyIgLWd0IDAgXSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgKAogICAgICAgICAgICBzbGVlcCAiJEhBTkdfRElBR19TRUNPTkRTIgogICAgICAgICAgICBpZiBraWxsIC0wICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBlY2hvICJbREVCVUddIEhhbmcgZGlhZyBhZnRlciAke0hBTkdfRElBR19TRUNPTkRTfXM6IGR1bXBpbmcgcHJvY2VzcyBpbmZvIgogICAgICAgICAgICAgIGVjaG8gIltERUJVR10gTk9URTogRklGTyBob2xkZXIgZGlhZ25vc3RpY3MgYXJlIG9ic29sZXRlIChubyBGSUZPIHVzZWQgYWZ0ZXIgc2lkZWNhciByZW1vdmFsKSIKICAgICAgICAgICAgICBmb3IgcCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgICAgICAgICBwaWQ9JHtwIyMqL307IFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmb3IgZmQgaW4gIiRwIi9mZC8qOyBkbyB0Z3Q9JChyZWFkbGluayAiJGZkIiAyPi9kZXYvbnVsbCB8fCB0cnVlKTsgY2FzZSAiJHRndCIgaW4gKmFnZW50LWlucHV0Lmpzb25sKikgZmRudW09JHtmZCMjKi99OyBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/Iik7IGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCAoVU5FWFBFQ1RFRCAtIEZJRk8gc2hvdWxkIG5vdCBleGlzdCkiOzsgZXNhYzsgZG9uZQogICAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgICBwcyAtZW8gcGlkLHBwaWQsY29tbSxhcmdzIHwgaGVhZCAtMjAwIHx8IHRydWUKICAgICAgICAgICAgZmkKICAgICAgICAgICkgJiBIQU5HX0RJQUdfUElEPSQhCiAgICAgICAgZmkKCiAgICAgICAgIyBXYWl0IGZvciBDbGF1ZGUgcHJvY2VzcyB0byBjb21wbGV0ZSBuYXR1cmFsbHkKICAgICAgICBlY2hvICLij7MgV2FpdGluZyBmb3IgQ2xhdWRlIHByb2Nlc3MgKFBJRDogJENMQVVERV9QSUQpIHRvIGNvbXBsZXRlLi4uIgoKICAgICAgICAjIFNpbXBsZSB3YWl0IC0gQ2xhdWRlIHNob3VsZCBleGl0IG5hdHVyYWxseSB3aGVuIGRvbmUKICAgICAgICB3YWl0ICIkQ0xBVURFX1BJRCIKICAgICAgICBDTEFVREVfRVhJVF9DT0RFPSQ/CgogICAgICAgICMgU3RvcCB0b2tlbiByZWZyZXNoIGJhY2tncm91bmQgcHJvY2VzcwogICAgICAgIGlmIFsgLW4gIiRUT0tFTl9SRUZSRVNIX1BJRCIgXTsgdGhlbgogICAgICAgICAgICBraWxsICRUT0tFTl9SRUZSRVNIX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgICAgIGVjaG8gIuKckyBTdG9wcGVkIHRva2VuIHJlZnJlc2ggcHJvY2VzcyIKICAgICAgICBmaQoKICAgICAgICBpZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgICAgICAgIGVjaG8gIuKchSBDbGF1ZGUgcHJvY2VzcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIuKdjCBDbGF1ZGUgcHJvY2VzcyBGQUlMRUQgd2l0aCBleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFIgogICAgICAgICAgZWNobyAi8J+UjSBDcml0aWNhbCBlcnJvciAtIENsYXVkZSBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSIKICAgICAgICAgIGVjaG8gIvCfk4sgVGhpcyB0eXBpY2FsbHkgaW5kaWNhdGVzOiIKICAgICAgICAgIGVjaG8gIiAgIC0gQVBJIHJhdGUgbGltaXRpbmcgb3IgYXV0aGVudGljYXRpb24gaXNzdWVzIgogICAgICAgICAgZWNobyAiICAgLSBNQ1AgY2xpZW50IGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMiCiAgICAgICAgICBlY2hvICIgICAtIEludmFsaWQgcHJvbXB0IG9yIHN5c3RlbSBtZXNzYWdlIGZvcm1hdHRpbmciCiAgICAgICAgICBlY2hvICIgICAtIFRvb2wgZXhlY3V0aW9uIGZhaWx1cmVzIgogICAgICAgICAgZWNobyAiIgogICAgICAgICAgZWNobyAi4pqg77iPIEFCT1JUSU5HOiBDYW5ub3QgY29udGludWUgd2l0aG91dCBzdWNjZXNzZnVsIENsYXVkZSBleGVjdXRpb24iCiAgICAgICAgICBlY2hvICLwn5SaIEZvcmNlIHRlcm1pbmF0aW5nIGNvbnRhaW5lciB3aXRoIGVycm9yIHN0YXR1cy4uLiIKICAgICAgICAgIAogICAgICAgICAgIyBDbGVhbiB1cCBiYWNrZ3JvdW5kIHByb2Nlc3NlcwogICAgICAgICAgaWYgWyAtbiAiJFRPS0VOX1JFRlJFU0hfUElEIiBdOyB0aGVuCiAgICAgICAgICAgICAga2lsbCAkVE9LRU5fUkVGUkVTSF9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiAKICAgICAgICAgICAgICBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIAogICAgICAgICAgIyBXcml0ZSBmYWlsdXJlIG1hcmtlciBmb3IgZGVidWdnaW5nCiAgICAgICAgICBlY2hvICJyZXgtaW1wbGVtZW50YXRpb24tZmFpbGVkOiQoZGF0ZSAtdSArJVktJW0tJWRUJUg6JU06JVNaKTpleGl0LWNvZGUtJENMQVVERV9FWElUX0NPREUiID4gL3dvcmtzcGFjZS8ucmV4LWZhaWxlZAogICAgICAgICAgCiAgICAgICAgICAjIEV4aXQgd2l0aCBlcnJvciB0byBzaWduYWwgcG9kIGZhaWx1cmUKICAgICAgICAgIGV4aXQgJENMQVVERV9FWElUX0NPREUKICAgICAgICBmaQoKICAgICAgICAjIFN0b3AgZGlhZ25vc3RpY3MgaWYgcnVubmluZwogICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgZmkKCiAgICAgICAgIyBFbnN1cmUgRklGTyBjbGVhbnVwIGhhcHBlbnMgcmVnYXJkbGVzcyBvZiBob3cgQ2xhdWRlIGV4aXRlZAogICAgICAgIGVjaG8gIvCflKcgUGVyZm9ybWluZyBGSUZPIGNsZWFudXAuLi4iCgogICAgICAgICMgQ2xvc2UgRklGTyB3cml0ZXIgaWYgaXQgd2FzIG9wZW5lZCAoaW4gZmFsbGJhY2spCiAgICAgICAgaWYgWyAiJEZJRk9fT1BFTkVEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLwn5SnIENsb3NpbmcgRklGTyBmaWxlIGRlc2NyaXB0b3IuLi4iCiAgICAgICAgICAjIFRyeSBtdWx0aXBsZSBtZXRob2RzIHRvIGVuc3VyZSBmZCA5IGdldHMgY2xvc2VkCiAgICAgICAgICBleGVjIDk+Ji0gMj4vZGV2L251bGwgfHwgewogICAgICAgICAgICBlY2hvICLimqDvuI8gZXhlYyA5PiYtIGZhaWxlZCwgdHJ5aW5nIGFsdGVybmF0aXZlIGNsb3NlIG1ldGhvZCIKICAgICAgICAgICAgZXZhbCAiZXhlYyA5PiYtIiAyPi9kZXYvbnVsbCB8fCB7CiAgICAgICAgICAgICAgZWNobyAi4pqg77iPIEFsdGVybmF0aXZlIGNsb3NlIGZhaWxlZCwgRklGTyBmZCBtYXkgcmVtYWluIG9wZW4iCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLihLnvuI8gRklGTyB3YXMgbm90IG9wZW5lZCB2aWEgZmFsbGJhY2ssIGNoZWNraW5nIHNpZGVjYXIiCiAgICAgICAgZmkKCiAgICAgICAgIyBDbGVhbiB1cCBGSUZPIGZpbGUgdG8gZW5zdXJlIG5vIHByb2Nlc3NlcyBhcmUgYmxvY2tlZAogICAgICAgIGlmIFsgLXAgIiRGSUZPX1BBVEgiIF07IHRoZW4KICAgICAgICAgIGVjaG8gIvCflKcgUmVtb3ZpbmcgRklGTyB0byBlbnN1cmUgY2xlYW4gc2h1dGRvd24iCiAgICAgICAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIENvdWxkIG5vdCByZW1vdmUgRklGTyIKICAgICAgICBmaQoKICAgICAgICAjIE5vIHNpZGVjYXIgc2h1dGRvd24gbmVlZGVkIC0gY29udGFpbmVyIHdpbGwgZXhpdCBuYXR1cmFsbHkgd2hlbiBtYWluIHByb2Nlc3MgY29tcGxldGVzCiAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIEVSUk9SOiBObyBwcm9tcHQubWQgZm91bmQgZnJvbSBkb2NzIHNlcnZpY2UiCiAgICAgICAgZWNobyAiVGhlIGRvY3Mgc2VydmljZSBzaG91bGQgYWx3YXlzIHByb3ZpZGUgdGFzay9wcm9tcHQubWQiCiAgICAgICAgZWNobyAiQ2hlY2sgZG9jcyByZXBvc2l0b3J5IGFuZCB0YXNrIGNvbmZpZ3VyYXRpb24iCiAgICAgICAgZXhpdCAxCiAgICBmaQpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIElNUExFTUVOVEFUSU9OIFRBU0sgQ09NUExFVEUgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwoKIyBDbGF1ZGUgZXhlY3V0aW9uIGNvbXBsZXRlZCDigJQgcnVuIHBvc3QtY29tcGxldGlvbiBob29rIGlmIHByZXNlbnQgdG8gZW5zdXJlIFBSIGNyZWF0aW9uCmVjaG8gIvCflJcgQ2hlY2tpbmcgZm9yIHBvc3QtY29tcGxldGlvbiBQUiBob29rLi4uIgppZiBbIC1mICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giIF07IHRoZW4KICBlY2hvICLwn5SXIEZvdW5kIHN0b3AgaG9vazogL3Rhc2stZmlsZXMvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIgogIAogICMgQ29weSBzY3JpcHQgdG8gd3JpdGFibGUgbG9jYXRpb24gdG8gZml4IHBlcm1pc3Npb24gaXNzdWVzCiAgSE9PS19TQ1JJUFQ9Ii90bXAvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIgogIGNwICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giICIkSE9PS19TQ1JJUFQiCiAgY2htb2QgK3ggIiRIT09LX1NDUklQVCIKICBlY2hvICLinJMgQ29waWVkIGhvb2sgc2NyaXB0IHRvIHdyaXRhYmxlIGxvY2F0aW9uIHdpdGggZXhlY3V0ZSBwZXJtaXNzaW9ucyIKICAKICBlY2hvICLwn5qAIFJ1bm5pbmcgc3RvcCBob29rIHRvIGNvbW1pdCwgcHVzaCwgYW5kIGNyZWF0ZSBQUiAoYXMgZmFsbGJhY2spLi4uIgogICgKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIiAmJiAiJEhPT0tfU0NSSVBUIgogICkgfHwgZWNobyAi4pqg77iPIFN0b3AgaG9vayBmYWlsZWQgKGNvbnRpbnVpbmcgdG8gUFIgdmVyaWZpY2F0aW9uKSIKZWxzZQogIGVjaG8gIuKEue+4jyBObyBzdG9wIGhvb2sgZm91bmQ7IHJlbHlpbmcgb24gYWdlbnQtZHJpdmVuIFBSIGNyZWF0aW9uIgpmaQoKZWNobyAiQ2xhdWRlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDUklUSUNBTCBQUiBWRVJJRklDQVRJT04gLSBNVVNUIEhBVkUgQ1JFQVRFRCBBIFBSCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZWNobyAiIgplY2hvICLwn5SNIFZFUklGWUlORyBQVUxMIFJFUVVFU1QgQ1JFQVRJT04gKE1BTkRBVE9SWSkuLi4iCmVjaG8gIiIKCiMgR2l2ZSBHaXRIdWIgQVBJIGEgbW9tZW50IHRvIHJlZ2lzdGVyIHRoZSBQUiBpZiBqdXN0IGNyZWF0ZWQKc2xlZXAgMwoKIyBDaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGZvciB0aGlzIGJyYW5jaApDVVJSRU5UX0JSQU5DSD0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIpClBSX0NIRUNLX0ZBSUxFRD1mYWxzZQoKaWYgWyAiJENVUlJFTlRfQlJBTkNIIiAhPSAidW5rbm93biIgXSAmJiBbICIkQ1VSUkVOVF9CUkFOQ0giICE9ICJtYWluIiBdICYmIFsgIiRDVVJSRU5UX0JSQU5DSCIgIT0gIm1hc3RlciIgXTsgdGhlbgogICAgZWNobyAi8J+TiyBDaGVja2luZyBmb3IgUFIgb24gYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAKICAgICMgVHJ5IHRvIGZpbmQgUFIgYnkgYnJhbmNoIChuZWVkIHRvIHNwZWNpZnkgcmVwbykKICAgIFBSX0VYSVNUUz0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgCiAgICBpZiBbIC16ICIkUFJfRVhJU1RTIiBdOyB0aGVuCiAgICAgICAgIyBBbHNvIGNoZWNrIGJ5IHRhc2sgbGFiZWwgYXMgYmFja3VwCiAgICAgICAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUR9IgogICAgICAgIFBSX0VYSVNUUz0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKCiAgICAjIElmIHN0aWxsIG5vdCBmb3VuZCwgcnVuIHRoZSBzdG9wIGhvb2sgb25lIG1vcmUgdGltZSAoaWRlbXBvdGVudCkgdGhlbiByZS1jaGVjawogICAgaWYgWyAteiAiJFBSX0VYSVNUUyIgXSAmJiBbIC1mICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SBIE5vIFBSIGRldGVjdGVkIHlldDsgcmV0cnlpbmcgc3RvcCBob29rIG9uY2UgbW9yZS4uLiIKICAgICAgICAKICAgICAgICAjIFVzZSB0aGUgc2FtZSB3cml0YWJsZSBjb3B5IGFwcHJvYWNoIGZvciByZXRyeQogICAgICAgIEhPT0tfU0NSSVBUPSIvdG1wL2hvb2tzLXN0b3AtY29kZS1wci1jcmVhdGlvbi5zaCIKICAgICAgICBpZiBbICEgLWYgIiRIT09LX1NDUklQVCIgXTsgdGhlbgogICAgICAgICAgICBjcCAiL3Rhc2stZmlsZXMvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIiAiJEhPT0tfU0NSSVBUIgogICAgICAgICAgICBjaG1vZCAreCAiJEhPT0tfU0NSSVBUIgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgKAogICAgICAgICAgY2QgIiRDTEFVREVfV09SS19ESVIiICYmICIkSE9PS19TQ1JJUFQiCiAgICAgICAgKSB8fCBlY2hvICLimqDvuI8gU3RvcCBob29rIHJldHJ5IGZhaWxlZCIKICAgICAgICBlY2hvICLij7MgV2FpdGluZyBicmllZmx5IGJlZm9yZSByZS1jaGVja2luZyBQUi4uLiIKICAgICAgICBzbGVlcCAzCiAgICAgICAgUFJfRVhJU1RTPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBmaQogICAgCiAgICBpZiBbIC16ICIkUFJfRVhJU1RTIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMIEVSUk9SOiBObyBwdWxsIHJlcXVlc3QgZm91bmQhIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgICAgICAgZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBQUiBDUkVBVElPTiBGQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICDilZEiCiAgICAgICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICJSZXggd2FzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCBidXQgZmFpbGVkIHRvIGRvIHNvLiIKICAgICAgICBlY2hvICJUaGlzIGlzIGEgTUFOREFUT1JZIHJlcXVpcmVtZW50IHRoYXQgd2FzIG5vdCBtZXQuIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICJQb3NzaWJsZSByZWFzb25zOiIKICAgICAgICBlY2hvICIgIDEuIE5vIGNvZGUgY2hhbmdlcyB3ZXJlIG1hZGUiCiAgICAgICAgZWNobyAiICAyLiBDaGFuZ2VzIHdlcmUgbm90IGNvbW1pdHRlZCIKICAgICAgICBlY2hvICIgIDMuIEJyYW5jaCB3YXMgbm90IHB1c2hlZCB0byByZW1vdGUiCiAgICAgICAgZWNobyAiICA0LiBQUiBjcmVhdGlvbiBjb21tYW5kIGZhaWxlZCIKICAgICAgICBlY2hvICIgIDUuIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBpc3N1ZXMiCiAgICAgICAgZWNobyAiIgogICAgICAgIGVjaG8gIkRpYWdub3N0aWMgaW5mb3JtYXRpb246IgogICAgICAgIGVjaG8gIiAgQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAgICAgZWNobyAiICBUYXNrIElEOiAke1RBU0tfSUR9IgogICAgICAgIAogICAgICAgICMgQ2hlY2sgaWYgdGhlcmUgYXJlIHVuY29tbWl0dGVkIGNoYW5nZXMKICAgICAgICBpZiBbIC1uICIkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gMj4vZGV2L251bGwpIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAg4pqg77iPIFRoZXJlIGFyZSB1bmNvbW1pdHRlZCBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgIyBDaGVjayBpZiBicmFuY2ggZXhpc3RzIG9uIHJlbW90ZQogICAgICAgIGlmICEgZ2l0IGxzLXJlbW90ZSAtLWhlYWRzIG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiB8IGdyZXAgLXEgIiRDVVJSRU5UX0JSQU5DSCI7IHRoZW4KICAgICAgICAgICAgZWNobyAiICDimqDvuI8gQnJhbmNoIG5vdCBmb3VuZCBvbiByZW1vdGUgcmVwb3NpdG9yeSIKICAgICAgICBmaQogICAgICAgIAogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICLwn5SaIEZBSUxJTkcgQ09OVEFJTkVSOiBSZXggZGlkIG5vdCBjcmVhdGUgcmVxdWlyZWQgcHVsbCByZXF1ZXN0IgogICAgICAgIAogICAgICAgICMgV3JpdGUgZmFpbHVyZSBtYXJrZXIKICAgICAgICBlY2hvICJyZXgtbm8tcHItY3JlYXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWik6YnJhbmNoLSRDVVJSRU5UX0JSQU5DSCIgPiAvd29ya3NwYWNlLy5yZXgtcHItZmFpbGVkCiAgICAgICAgCiAgICAgICAgIyBFeGl0IHdpdGggZXJyb3IKICAgICAgICBleGl0IDEKICAgIGVsc2UKICAgICAgICBlY2hvICLinIUgUHVsbCByZXF1ZXN0ICMke1BSX0VYSVNUU30gZm91bmQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVjaG8gIlJleCBoYXMgY29tcGxldGVkIHRoZSB0YXNrIGFuZCBjcmVhdGVkIHRoZSByZXF1aXJlZCBQUi4iCiAgICBmaQplbHNlCiAgICBlY2hvICLimqDvuI8gV0FSTklORzogVW5hYmxlIHRvIHZlcmlmeSBQUiAoYnJhbmNoIGRldGVjdGlvbiBmYWlsZWQpIgogICAgZWNobyAiQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAjIERvbid0IGZhaWwgaGVyZSBhcyB0aGlzIG1pZ2h0IGJlIGEgZ2l0IGNvbmZpZ3VyYXRpb24gaXNzdWUKZmkKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQUiBERVRFQ1RJT04gQU5EIExBQkVMSU5HCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBZnRlciBDbGF1ZGUgY29tcGxldGVzLCBjaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGFuZCBhcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMKaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF0gJiYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLwn5SNIENoZWNraW5nIGZvciBQUnMgY3JlYXRlZCBieSB0aGlzIHRhc2suLi4iCgogICMgRGVidWc6IFNob3cgY3VycmVudCBkaXJlY3RvcnkgYW5kIHdvcmsgZGlyZWN0b3J5CiAgZWNobyAi8J+TjSBDdXJyZW50IGRpcmVjdG9yeTogJChwd2QpIgogIGVjaG8gIvCfk40gQ2xhdWRlIHdvcmsgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgoKICAjIERldGVybWluZSBpbXBsZW1lbnRhdGlvbiByZXBvc2l0b3J5IHNsdWcgZm9yIGdoIC1SCiAgUkVQT19TTFVHPSIke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfSIKICBpZiBbIC16ICIkUkVQT19PV05FUiIgXSB8fCBbIC16ICIkUkVQT19OQU1FIiBdOyB0aGVuCiAgICBPUklHSU5fVVJMPSQoZ2l0IC1DICIkQ0xBVURFX1dPUktfRElSIiByZW1vdGUgZ2V0LXVybCBvcmlnaW4gMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSsvW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSsvW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGZpCiAgZmkKCiAgZWNobyAi8J+TjSBSZXBvc2l0b3J5OiAkUkVQT19TTFVHIgoKICAjIFJldHJ5IGxvb3AgZm9yIFBSIGRldGVjdGlvbiAoc29tZXRpbWVzIEdpdEh1YiBBUEkgdGFrZXMgYSBtb21lbnQpCiAgTUFYX1JFVFJJRVM9JHtDTEFVREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi01fX0KICBpZiBbICIkTUFYX1JFVFJJRVMiID0gIjAiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgUFIgZGV0ZWN0aW9uIHJ1bm5pbmcgaW4gdW5saW1pdGVkIG1vZGUiCiAgICBVTkxJTUlURURfUFJfQ0hFQ0s9MQogIGVsc2UKICAgIFVOTElNSVRFRF9QUl9DSEVDSz0wCiAgZmkKCiAgUkVUUllfQ09VTlQ9MAogIFBSX05VTUJFUj0iIgoKICB3aGlsZSB0cnVlOyBkbwogICAgaWYgWyAiJFVOTElNSVRFRF9QUl9DSEVDSyIgIT0gIjEiIF0gJiYgWyAkUkVUUllfQ09VTlQgLWdlICRNQVhfUkVUUklFUyBdOyB0aGVuCiAgICAgIGJyZWFrCiAgICBmaQoKICAgIGlmIFsgJFJFVFJZX0NPVU5UIC1ndCAwIF07IHRoZW4KICAgICAgaWYgWyAiJFVOTElNSVRFRF9QUl9DSEVDSyIgPSAiMSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKPsyBSZXRyeSAkUkVUUllfQ09VTlQgKHVubGltaXRlZCBtb2RlKTogV2FpdGluZyBmb3IgUFIgdG8gYXBwZWFyIGluIEdpdEh1YiBBUEkuLi4iCiAgICAgIGVsc2UKICAgICAgICBlY2hvICLij7MgUmV0cnkgJFJFVFJZX0NPVU5ULyRNQVhfUkVUUklFUzogV2FpdGluZyBmb3IgUFIgdG8gYXBwZWFyIGluIEdpdEh1YiBBUEkuLi4iCiAgICAgIGZpCiAgICAgIHNsZWVwIDMKICAgIGZpCgogICAgIyBGaXJzdCwgdHJ5IHRvIGZpbmQgUFIgYnkgdGFzayBsYWJlbCAoQ2xhdWRlIG1heSBoYXZlIGFkZGVkIHRhc2stTiBsYWJlbCkKICAgIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICAgIFBSX05VTUJFUj0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQoKICAgICMgSWYgbm90IGZvdW5kIGJ5IGxhYmVsLCB0cnkgYnkgYnJhbmNoIG5hbWUgKGN1cnJlbnQgYnJhbmNoKQogICAgaWYgWyAteiAiJFBSX05VTUJFUiIgXTsgdGhlbgogICAgICBDVVJSRU5UX0JSQU5DSD0kKGNkICIkQ0xBVURFX1dPUktfRElSIiAmJiBnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgIGlmIFsgLW4gIiRDVVJSRU5UX0JSQU5DSCIgXSAmJiBbICIkQ1VSUkVOVF9CUkFOQ0giICE9ICJtYWluIiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+UjSBDaGVja2luZyBmb3IgUFIgb24gYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAgICAgUFJfTlVNQkVSPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgIGZpCiAgICBmaQoKICAgIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgICAgYnJlYWsKICAgIGZpCgogICAgUkVUUllfQ09VTlQ9JCgoUkVUUllfQ09VTlQgKyAxKSkKICBkb25lCgogIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgIGVjaG8gIuKchSBGb3VuZCBQUiAjJHtQUl9OVU1CRVJ9IgoKICAgICMgR2V0IHRoZSBQUiBVUkwKICAgIFBSX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7UkVQT19TTFVHfS9wdWxsLyR7UFJfTlVNQkVSfSIKICAgIGVjaG8gIvCfk50gUFIgVVJMOiAkUFJfVVJMIgoKICAgIGVuc3VyZV9zdGF0dXNfbGFiZWxzICIkUkVQT19TTFVHIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19GSVhFU306ZDczYTRhOlJlbWVkaWF0aW9uIHJlcXVlc3RlZCBieSBUZXNzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GSVhJTkd9OmZiY2EwNDpSZXggaXMgYWN0aXZlbHkgYXBwbHlpbmcgZml4ZXMiIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0NMRU99OjBlOGExNjpBd2FpdGluZyBDbGVvIHF1YWxpdHkgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19URVNTfTo1MzE5ZTc6QXdhaXRpbmcgVGVzcyBRQSByZXZpZXciIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX0FQUFJPVkVEfToyZGE0NGU6QWxsIGF1dG9tYXRlZCByZXZpZXdzIGFwcHJvdmVkIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GQUlMRUR9OmI2MDIwNTpSZW1lZGlhdGlvbiBmYWlsZWQgb3IgYWJvcnRlZCIKCiAgICBwcl9yZW1vdmVfbGFiZWxzICIkUkVQT19TTFVHIiAiJFBSX05VTUJFUiIgIiRQUl9VUkwiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVMiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRklYSU5HIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1MiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfQVBQUk9WRUQiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRkFJTEVEIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWSIKCiAgICAjIE5vdGU6IE5vIGxvbmdlciBhZGRpbmcgbmVlZHMtY2xlbyBsYWJlbCAtIHN0YWdlIHRyYW5zaXRpb25zIHVzZSBHaXRIdWIgUFIgcmV2aWV3cwogICAgIyBDb3JyZWxhdGlvbiBsYWJlbHMgYXJlIGFkZGVkIGJlbG93ICh0YXNrLSosIHNlcnZpY2UtKiwgcnVuLSopCgogICAgIyBBcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMgd2l0aCBjb21wcmVoZW5zaXZlIGRlYnVnZ2luZwogICAgZWNobyAi8J+Pt++4jyBBZGRpbmcgY29ycmVsYXRpb24gbGFiZWxzIHRvIFBSICMke1BSX05VTUJFUn0uLi4iCgogICAgIyBEZWJ1ZzogQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgICBlY2hvICLwn5SNIERFQlVHOiBFbnZpcm9ubWVudCBjaGVjayBmb3IgbGFiZWwgY3JlYXRpb246IgogICAgZWNobyAiICAgVEFTS19JRDogJyR7VEFTS19JRH0nIgogICAgZWNobyAiICAgV09SS0ZMT1dfTkFNRTogJyR7V09SS0ZMT1dfTkFNRX0nIgogICAgZWNobyAiICAgU0VSVklDRV9OQU1FOiAnJHtTRVJWSUNFX05BTUV9JyIKICAgIGVjaG8gIiAgIENPREVSVU5fTkFNRTogJyR7Q09ERVJVTl9OQU1FfSciCiAgICBlY2hvICIgICBHaXRIdWIgVG9rZW46ICQoWyAtbiAiJEdJVEhVQl9UT0tFTiIgXSAmJiBlY2hvICdQcmVzZW50JyB8fCBlY2hvICdNaXNzaW5nJykiCgogICAgIyBWYWxpZGF0ZSByZXF1aXJlZCB2YXJpYWJsZXMKICAgIGlmIFsgLXogIiRXT1JLRkxPV19OQU1FIiBdOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBFUlJPUjogV09SS0ZMT1dfTkFNRSBpcyBub3Qgc2V0ISIKICAgICAgZWNobyAi8J+UjSBERUJVRzogQXR0ZW1wdGluZyB0byBleHRyYWN0IGZyb20gQ09ERVJVTl9OQU1FLi4uIgogICAgICAjIFRyeSB0byBleHRyYWN0IHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIG5hbWUgcGF0dGVybgogICAgICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdOyB0aGVuCiAgICAgICAgIyBQYXR0ZXJuOiBzZXJ2aWNlLXR7dGFza30tc3RhZ2Ute2hhc2h9IGNyZWF0ZWQgYnkgd29ya2Zsb3cKICAgICAgICBlY2hvICIgICBDT0RFUlVOX05BTUUgZm9ybWF0OiAkQ09ERVJVTl9OQU1FIgogICAgICBmaQoKICAgICAgIyBDaGVjayBpZiB3ZSBjYW4gZ2V0IGl0IGZyb20gS3ViZXJuZXRlcyBsYWJlbHMKICAgICAgaWYgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBUcnlpbmcgdG8gZ2V0IHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIGxhYmVscy4uLiIKICAgICAgICBXT1JLRkxPV19GUk9NX0xBQkVMUz0kKGt1YmVjdGwgZ2V0IGNvZGVydW4gIiRDT0RFUlVOX05BTUUiIC1uICIkTkFNRVNQQUNFIiAtbyBqc29ucGF0aD0ney5tZXRhZGF0YS5sYWJlbHMud29ya2Zsb3ctbmFtZX0nIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgICAgaWYgWyAtbiAiJFdPUktGTE9XX0ZST01fTEFCRUxTIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinIUgRm91bmQgd29ya2Zsb3cgbmFtZSBmcm9tIENvZGVSdW4gbGFiZWxzOiAkV09SS0ZMT1dfRlJPTV9MQUJFTFMiCiAgICAgICAgICBXT1JLRkxPV19OQU1FPSIkV09SS0ZMT1dfRlJPTV9MQUJFTFMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAi4p2MIENvdWxkIG5vdCByZXRyaWV2ZSB3b3JrZmxvdyBuYW1lIGZyb20gQ29kZVJ1biBsYWJlbHMiCiAgICAgICAgZmkKICAgICAgZmkKCiAgICAgICMgRmluYWwgY2hlY2sgLSBpZiBzdGlsbCBubyB3b3JrZmxvdyBuYW1lLCBmYWlsIGxvdWRseQogICAgICBpZiBbIC16ICIkV09SS0ZMT1dfTkFNRSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBDUklUSUNBTDogQ2Fubm90IGRldGVybWluZSBXT1JLRkxPV19OQU1FIC0gdGhpcyB3aWxsIGNhdXNlIGNvcnJlbGF0aW9uIGlzc3VlcyEiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCiAgICAgICAgZW52IHwgZ3JlcCAtRSAiV09SS0ZMT1d8Q09ERVJVTnxUQVNLfFNFUlZJQ0UiIHwgc29ydAogICAgICAgICMgRE8gTk9UIHVzZSAndW5rbm93bicgLSBleGl0IHdpdGggZXJyb3IgaW5zdGVhZAogICAgICAgIGVjaG8gIuKdjCBSZWZ1c2luZyB0byB1c2UgJ3Vua25vd24nIGxhYmVsIC0gZmFpbGluZyB0YXNrIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKCiAgICBUQVNLX0xBQkVMPSJ0YXNrLSR7VEFTS19JRH0iCiAgICBSVU5fTEFCRUw9InJ1bi0ke1dPUktGTE9XX05BTUV9IgogICAgU0VSVklDRV9MQUJFTD0ic2VydmljZS0ke1NFUlZJQ0VfTkFNRX0iCgogICAgZWNobyAi8J+TiyBMYWJlbHMgdG8gYXBwbHk6IgogICAgZWNobyAiICAgVGFzazogJFRBU0tfTEFCRUwiCiAgICBlY2hvICIgICBSdW46ICRSVU5fTEFCRUwiCiAgICBlY2hvICIgICBTZXJ2aWNlOiAkU0VSVklDRV9MQUJFTCIKCiAgICAjIFByZS1jcmVhdGUgbGFiZWxzIGlmIHRoZXkgZG9uJ3QgZXhpc3QgKGRvIHRoaXMgQkVGT1JFIHRyeWluZyB0byBhZGQgdGhlbSkKICAgIGVjaG8gIvCflI0gRW5zdXJpbmcgbGFiZWxzIGV4aXN0IGluIHJlcG9zaXRvcnkuLi4iCiAgICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFJVTl9MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIjsgZG8KICAgICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkUkVQT19TTFVHIiAtLXNlYXJjaCAiJGxhYmVsIiB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgICAgZWNobyAiICAg8J+TnSBDcmVhdGluZyBsYWJlbCAnJGxhYmVsJy4uLiIKICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgcnVuLSopIENPTE9SPSIwMzY2ZDYiOyBERVNDPSJXb3JrZmxvdyBydW4gY29ycmVsYXRpb24iIDs7CiAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgKikgQ09MT1I9ImVkZWRlZCI7IERFU0M9IkNvcnJlbGF0aW9uIGxhYmVsIiA7OwogICAgICAgIGVzYWMKICAgICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBhbHJlYWR5IGV4aXN0cyIKICAgICAgZmkKICAgIGRvbmUKCiAgICAjIFRyeSB0byBhZGQgbGFiZWxzIHdpdGggZGV0YWlsZWQgZXJyb3IgY2FwdHVyZQogICAgZWNobyAi8J+UjSBBdHRlbXB0aW5nIHRvIGFkZCBsYWJlbHMgdG8gUFIgIyR7UFJfTlVNQkVSfS4uLiIKICAgIExBQkVMX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIke1RBU0tfTEFCRUx9LCR7UlVOX0xBQkVMfSwke1NFUlZJQ0VfTEFCRUx9IiAyPiYxKQogICAgTEFCRUxfRVhJVF9DT0RFPSQ/CgogICAgaWYgWyAkTEFCRUxfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgICAgZWNobyAi4pyFIEFkZGVkIGNvcnJlbGF0aW9uIGxhYmVscyBzdWNjZXNzZnVsbHkiCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVscyAoZXhpdCBjb2RlOiAkTEFCRUxfRVhJVF9DT0RFKSIKICAgICAgZWNobyAi8J+UjSBERUJVRzogRXJyb3Igb3V0cHV0OiAkTEFCRUxfRVJST1IiCgogICAgICAjIENoZWNrIGlmIGxhYmVscyBleGlzdAogICAgICBlY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyB3aGljaCBsYWJlbHMgZXhpc3QuLi4iCiAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgIGlmIGdoIGxhYmVsIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tc2VhcmNoICIkbGFiZWwiIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBleGlzdHMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiICAg4pyXIExhYmVsICckbGFiZWwnIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgIyBDcmVhdGUgdGhlIG1pc3NpbmcgbGFiZWwKICAgICAgICAgIGVjaG8gIiAgIPCfk50gQ3JlYXRpbmcgbGFiZWwgJyRsYWJlbCcuLi4iCiAgICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgcnVuIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iVW5rbm93biBsYWJlbCB0eXBlIiA7OwogICAgICAgICAgZXNhYwoKICAgICAgICAgIENSRUFURV9FUlJPUj0kKGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgMj4mMSkKICAgICAgICAgIENSRUFURV9FWElUPSQ/CiAgICAgICAgICBpZiBbICRDUkVBVEVfRVhJVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAgIOKchSBDcmVhdGVkIGxhYmVsICckbGFiZWwnIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICIgICDinYwgRmFpbGVkIHRvIGNyZWF0ZSBsYWJlbCAnJGxhYmVsJzogJENSRUFURV9FUlJPUiIKICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgICAgZG9uZQoKICAgICAgIyBSZXRyeSBhZGRpbmcgbGFiZWxzIHdpdGggaW5kaXZpZHVhbCBhdHRlbXB0cwogICAgICBlY2hvICLwn5SNIERFQlVHOiBSZXRyeWluZyBsYWJlbCBhZGRpdGlvbiBpbmRpdmlkdWFsbHkuLi4iCiAgICAgIExBQkVMU19BRERFRD0wCiAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgIFJFVFJZX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIkbGFiZWwiIDI+JjEpCiAgICAgICAgUkVUUllfRVhJVD0kPwogICAgICAgIGlmIFsgJFJFVFJZX0VYSVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyAiICAg4pyFIEFkZGVkIGxhYmVsICckbGFiZWwnIgogICAgICAgICAgTEFCRUxTX0FEREVEPSQoKExBQkVMU19BRERFRCArIDEpKQogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIiAgIOKdjCBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnOiAkUkVUUllfRVJST1IiCiAgICAgICAgZmkKICAgICAgZG9uZQoKICAgICAgaWYgWyAkTEFCRUxTX0FEREVEIC1lcSAzIF07IHRoZW4KICAgICAgICBlY2hvICLinIUgQWxsIGxhYmVscyBhZGRlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgcmV0cnkiCiAgICAgIGVsaWYgWyAkTEFCRUxTX0FEREVEIC1ndCAwIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gUGFydGlhbCBzdWNjZXNzOiAkTEFCRUxTX0FEREVELzMgbGFiZWxzIGFkZGVkIgogICAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBDb3VsZCBub3QgYWRkIGFueSBsYWJlbHMgdG8gUFIiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQ2hlY2tpbmcgUFIgc3RhdGUuLi4iCiAgICAgICAgUFJfU1RBVEU9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHN0YXRlIC1xIC5zdGF0ZSAyPi9kZXYvbnVsbCB8fCBlY2hvICJVTktOT1dOIikKICAgICAgICBlY2hvICIgICBQUiBTdGF0ZTogJFBSX1NUQVRFIgogICAgICAgIGlmIFsgIiRQUl9TVEFURSIgPSAiQ0xPU0VEIiBdIHx8IFsgIiRQUl9TVEFURSIgPSAiTUVSR0VEIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinYwgUFIgaXMgJFBSX1NUQVRFIC0gY2Fubm90IGFkZCBsYWJlbHMgdG8gY2xvc2VkL21lcmdlZCBQUnMiCiAgICAgICAgZmkKICAgICAgZmkKICAgIGZpCgogICAgIyBGaW5hbCB2ZXJpZmljYXRpb24gdGhhdCBsYWJlbHMgd2VyZSBhcHBsaWVkCiAgICBlY2hvICLwn5SNIEZpbmFsIHZlcmlmaWNhdGlvbiBvZiBQUiBsYWJlbHMuLi4iCiAgICBQUl9MQUJFTFM9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIGxhYmVscyAtLWpxICcubGFiZWxzW10ubmFtZScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiRQUl9MQUJFTFMiIHwgZ3JlcCAtcSAiXnRhc2stJHtUQVNLX0lEfSQiICYmIFwKICAgICAgIGVjaG8gIiRQUl9MQUJFTFMiIHwgZ3JlcCAtcSAiXnJ1bi0ke1dPUktGTE9XX05BTUV9JCIgJiYgXAogICAgICAgZWNobyAiJFBSX0xBQkVMUyIgfCBncmVwIC1xICJec2VydmljZS0ke1NFUlZJQ0VfTkFNRX0kIjsgdGhlbgogICAgICBlY2hvICLinIUgVkVSSUZJRUQ6IEFsbCBjb3JyZWxhdGlvbiBsYWJlbHMgYXJlIHByZXNlbnQgb24gUFIgIyR7UFJfTlVNQkVSfSIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIFdBUk5JTkc6IFNvbWUgbGFiZWxzIG1heSBiZSBtaXNzaW5nLiBDdXJyZW50IGxhYmVsczoiCiAgICAgIGVjaG8gIiRQUl9MQUJFTFMiIHwgc2VkICdzL14vICAgLSAvJwogICAgICBlY2hvICIiCiAgICAgIGVjaG8gIkV4cGVjdGVkIGxhYmVsczoiCiAgICAgIGVjaG8gIiAgIC0gdGFzay0ke1RBU0tfSUR9IgogICAgICBlY2hvICIgICAtIHJ1bi0ke1dPUktGTE9XX05BTUV9IgogICAgICBlY2hvICIgICAtIHNlcnZpY2UtJHtTRVJWSUNFX05BTUV9IgogICAgZmkKICBlbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgZm91bmQgZm9yIHRoaXMgdGFzayAoQ2xhdWRlIG1heSBub3QgaGF2ZSBjcmVhdGVkIG9uZSkiCiAgZmkKZWxzZQogIGVjaG8gIuKEue+4jyBTa2lwcGluZyBQUiBsYWJlbGluZzogbWlzc2luZyBHSVRIVUJfVE9LRU4gb3IgZ2ggQ0xJIgpmaQoKIyBXcml0ZSBzZW50aW5lbCBmaWxlIHRvIHNpZ25hbCBzaWRlY2FyIHRvIHN0b3AgKEt1YmVybmV0ZXMtbmF0aXZlIGZpbGUgd2F0Y2gpCnRvdWNoIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUgMj4vZGV2L251bGwgfHwgdHJ1ZQoKICAjIENoZWNrIGlmIGltcGxlbWVudGF0aW9uIHdhcyBzdWNjZXNzZnVsCiAgIyBSZXggaXMgc3VjY2Vzc2Z1bCBpZiBDbGF1ZGUgZXhpdGVkIGNsZWFubHkgKFBSIHNob3VsZCBiZSBjcmVhdGVkKQogIGlmIFsgJHtDTEFVREVfUElEOi0wfSAtbmUgMCBdOyB0aGVuCiAgICB3YWl0ICRDTEFVREVfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIENMQVVERV9FWElUX0NPREU9JD8KICBmaQogIAogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIEF0dGVtcHQgJEFUVEVNUFQ6IEltcGxlbWVudGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEF0dGVtcHQgJEFUVEVNUFQ6IEltcGxlbWVudGF0aW9uIGluY29tcGxldGUgKGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUpIgogICAgCiAgICBpZiBbICRBVFRFTVBUIC1sdCAkTUFYX1JFVFJJRVMgXTsgdGhlbgogICAgICBlY2hvICLwn5SEIFdpbGwgcmV0cnkuLi4gKCQoKE1BWF9SRVRSSUVTIC0gQVRURU1QVCkpIGF0dGVtcHRzIHJlbWFpbmluZykiCiAgICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgICBlY2hvICIiCiAgICAgICMgQnJpZWYgcGF1c2UgYmVmb3JlIHJldHJ5CiAgICAgIHNsZWVwIDIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgcmVhY2hlZCIKICAgICAgYnJlYWsKICAgIGZpCiAgZmkKZG9uZQoKIyBSZXBvcnQgZmluYWwgc3RhdHVzCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLinIUgUkVYIElNUExFTUVOVEFUSU9OIFNVQ0NFU1NGVUwiCiAgZWNobyAiICAgQ29tcGxldGVkIGFmdGVyICRBVFRFTVBUIGF0dGVtcHQocykiCmVsc2UKICBlY2hvICLimqDvuI8gUkVYIElNUExFTUVOVEFUSU9OIElOQ09NUExFVEUiCiAgZWNobyAiICAgQXR0ZW1wdGVkICRBVFRFTVBUIHRpbWUocykiCiAgZWNobyAiICAgSW1wbGVtZW50YXRpb24gbm90IGNvbXBsZXRlZCIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgUkVYIENPTlRBSU5FUiBURVJNSU5BVElPTiAgICAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gIkNvbnRhaW5lciBQSUQ6ICQkIgplY2hvICJGaW5hbCBQcm9jZXNzIENoZWNrOiIKcHMgYXV4IHwgaGVhZCAtNQoKIyBXcml0ZSBjb21wbGV0aW9uIG1hcmtlciBmb3Igd29ya2Zsb3cgdHJhY2tpbmcKZWNobyAicmV4LWltcGxlbWVudGF0aW9uLWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8ucmV4LWNvbXBsZXRlCgojIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHN1Y2Nlc3MKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBzdWNjZXNzIHN0YXR1cy4uLiIKICBleGl0IDAKZWxzZQogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggZmFpbHVyZSBzdGF0dXMuLi4iCiAgZWNobyAi8J+TnSBJbXBsZW1lbnRhdGlvbiBpbmNvbXBsZXRlIGFmdGVyICRBVFRFTVBUIGF0dGVtcHQocykiCiAgZXhpdCAxCmZpCg== + code_claude_container-tess.sh.hbs: IyEvYmluL3NoCgojIENSSVRJQ0FMOiBDbGVhbiB1cCBzZW50aW5lbCBmaWxlIElNTUVESUFURUxZIHRvIHByZXZlbnQgc2lkZWNhciBmcm9tIHNodXR0aW5nIGRvd24KIyBUaGlzIE1VU1QgaGFwcGVuIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBhcyB0aGUgc2lkZWNhciBzdGFydHMgYmVmb3JlIG91ciBzY3JpcHQKaWYgWyAtZiAvd29ya3NwYWNlLy5hZ2VudF9kb25lIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgVVJHRU5UOiBSZW1vdmluZyBsZWZ0b3ZlciBzZW50aW5lbCBmaWxlIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8uYWdlbnRfZG9uZQpmaQoKIyBBbHNvIGNsZWFuIHVwIFRlc3MgY29tcGxldGlvbiBtYXJrZXIgaWYgcHJlc2VudAppZiBbIC1mIC93b3Jrc3BhY2UvLnRlc3MtY29tcGxldGUgXTsgdGhlbgogICAgZWNobyAi8J+nuSBSZW1vdmluZyBUZXNzIGNvbXBsZXRpb24gbWFya2VyIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQpmaQoKIyBFbnN1cmUgUnVzdCBlbnZpcm9ubWVudCBpcyBhbHdheXMgcHJvcGVybHkgc2V0IHVwCmVjaG8gIvCflKcgU2V0dGluZyB1cCBSdXN0IGVudmlyb25tZW50Li4uIgoKIyBTb3VyY2UgUnVzdCBlbnZpcm9ubWVudCBpZiBhdmFpbGFibGUgKGZpeGVzIGNhcmdvIG5vdCBmb3VuZCBpc3N1ZXMpCiMgVHJ5IG11bHRpcGxlIHBvc3NpYmxlIGxvY2F0aW9ucyBmb3IgUnVzdCBlbnZpcm9ubWVudApSVVNUX0VOVl9TT1VSQ0VTPSgKICAgICIkSE9NRS8uY2FyZ28vZW52IgogICAgIi9yb290Ly5jYXJnby9lbnYiCiAgICAiL3Vzci9sb2NhbC9jYXJnby9lbnYiCiAgICAiL2hvbWUvdWJ1bnR1Ly5jYXJnby9lbnYiCiAgICAiL2hvbWUvdXNlci8uY2FyZ28vZW52IgopCgpmb3IgZW52X2ZpbGUgaW4gIiR7UlVTVF9FTlZfU09VUkNFU1tAXX0iOyBkbwogICAgaWYgWyAtZiAiJGVudl9maWxlIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFNvdXJjaW5nIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkZW52X2ZpbGUiCiAgICAgICAgLiAiJGVudl9maWxlIgogICAgICAgICMgRXhwb3J0IFBBVEggZXhwbGljaXRseSBhZnRlciBzb3VyY2luZwogICAgICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgICAgIGJyZWFrCiAgICBmaQpkb25lCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pyTIFJ1c3R1cCBmb3VuZCwgZW5zdXJpbmcgc3RhYmxlIHRvb2xjaGFpbiBpcyBkZWZhdWx0Li4uIgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICMgUmUtc291cmNlIGVudmlyb25tZW50IGFmdGVyIHNldHRpbmcgZGVmYXVsdAogICAgaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgICAgIC4gIiRIT01FLy5jYXJnby9lbnYiCiAgICBlbGlmIFsgLWYgIi9yb290Ly5jYXJnby9lbnYiIF07IHRoZW4KICAgICAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZmkKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIEVuc3VyZWQgc3RhYmxlIFJ1c3QgdG9vbGNoYWluIGlzIGRlZmF1bHQiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBydXN0dXAgbm90IGZvdW5kIGluIFBBVEgiCmZpCgojIFZlcmlmeSBSdXN0IGlzIGF2YWlsYWJsZSB3aXRoIG11bHRpcGxlIGZhbGxiYWNrIGF0dGVtcHRzCmlmIGNvbW1hbmQgLXYgY2FyZ28gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinJMgQ2FyZ28gaXMgYXZhaWxhYmxlOiAkKGNhcmdvIC0tdmVyc2lvbikiCmVsaWYgWyAtZiAiL3Vzci9sb2NhbC9jYXJnby9iaW4vY2FyZ28iIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBjYXJnbyBhdCAvdXNyL2xvY2FsL2NhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIvdXNyL2xvY2FsL2NhcmdvL2JpbjokUEFUSCIKICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxpZiBbIC1mICIkSE9NRS8uY2FyZ28vYmluL2NhcmdvIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgY2FyZ28gYXQgJEhPTUUvLmNhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIENhcmdvIGlzIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgplbHNlCiAgICBlY2hvICLinYwgQ2FyZ28gbm90IGZvdW5kIGluIFBBVEgiCiAgICBlY2hvICJDdXJyZW50IFBBVEg6ICRQQVRIIgogICAgZWNobyAiQXR0ZW1wdGluZyB0byBmaW5kIGNhcmdvLi4uIgogICAgZmluZCAvdXNyIC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvdXNyIgogICAgZmluZCAvaG9tZSAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL2hvbWUiCiAgICBmaW5kIC9yb290IC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvcm9vdCIKICAgICMgVHJ5IHRvIGluc3RhbGwgUnVzdCBhcyBsYXN0IHJlc29ydAogICAgZWNobyAi8J+UpyBBdHRlbXB0aW5nIHRvIGluc3RhbGwgUnVzdCB2aWEgcnVzdHVwLi4uIgogICAgY3VybCAtLXByb3RvICc9aHR0cHMnIC0tdGxzdjEuMiAtc1NmIGh0dHBzOi8vc2gucnVzdHVwLnJzIHwgc2ggLXMgLS0gLXkgfHwgdHJ1ZQogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIgfHwgdHJ1ZQogICAgZXhwb3J0IFBBVEg9IiRIT01FLy5jYXJnby9iaW46JFBBVEgiCiAgICBpZiBjb21tYW5kIC12IGNhcmdvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDYXJnbyBpbnN0YWxsZWQgYW5kIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gaW5zdGFsbCBSdXN0LCBjb250aW51aW5nIHdpdGhvdXQgY2FyZ28uLi4iCiAgICBmaQpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIFRFU1MgVEVTVElORyBXT1JLRkxPVyBTVEFSVElORyAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICAgICAgUXVhbGl0eSBBc3N1cmFuY2UgJiBEZXBsb3ltZW50IFRlc3RpbmcgQWdlbnQgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFVFJZIENPTkZJR1VSQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BWF9SRVRSSUVTX0NPTkZJRz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDTEFVREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ0xBVURFX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCfp6ogRm9jdXM6IENvbXByZWhlbnNpdmUgdGVzdGluZywgZGVwbG95bWVudCB2YWxpZGF0aW9uLCB0ZXN0IGNvdmVyYWdlIgplY2hvICLwn5OLIFRhc2sgSUQ6IHt7dGFza19pZH19IgplY2hvICLinIUgTWlzc2lvbjogMTIwJSBzYXRpc2ZhY3Rpb24gdGhyb3VnaCBleGhhdXN0aXZlIHRlc3RpbmciCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCmVjaG8gIvCflI0gRGVidWcgU2Vzc2lvbjogJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKSAtIFBJRDogJCQiCmVjaG8gIvCfk4ogTG9nIExldmVsOiBERUJVRyAoc2hvd2luZyBKU09OIGNvbnN0cnVjdGlvbiBkZXRhaWxzKSIKCiMgRGlzYWJsZSBpbnRlcmFjdGl2ZSBHaXQgcHJvbXB0cyBnbG9iYWxseQpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyBBbGxvdyBzb2Z0IGZhaWx1cmUgZm9yIHByZWNoZWNrcyB3aGVuIGRlc2lyZWQKIyBTZXQgVEVTU19TVFJJQ1RfUFJFQ0hFQ0tTPTEgdG8gZW5mb3JjZSBoYXJkIGV4aXRzIG9uIGZhaWx1cmVzClRFU1NfU1RSSUNUX1BSRUNIRUNLUz0iJHtURVNTX1NUUklDVF9QUkVDSEVDS1M6LTB9IgoKc29mdF9hYm9ydCgpIHsKICAjIFVzYWdlOiBzb2Z0X2Fib3J0ICJtZXNzYWdlIiBbZXhpdF9jb2RlXQogIG1zZz0iJDEiOyBjb2RlPSIkezI6LTF9IgogIGVjaG8gIuKdjCAkbXNnIgogIGlmIFsgIiRURVNTX1NUUklDVF9QUkVDSEVDS1MiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIvCfmqsgQWJvcnRpbmcgKFRFU1NfU1RSSUNUX1BSRUNIRUNLUz0xKSIKICAgIGV4aXQgIiRjb2RlIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBOb24tZmF0YWwgcHJlY2hlY2sgZmFpbHVyZSAoY29udGludWluZyB3aXRoIGxpbWl0ZWQgY2FwYWJpbGl0aWVzKSIKICBmaQp9CgojIFJlcG9zaXRvcnkgVVJMClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgojIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCmVjaG8gIlVzaW5nIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gZm9yIHRlc3Rpbmcgd29ya2Zsb3ciCgojIEZ1bmN0aW9uIHRvIGVuc3VyZSBNQ1Agc2VydmVyIHNodXRkb3duCnNodXRkb3duX3NpZGVjYXIoKSB7CiAgIyBObyBzaWRlY2FyIHNodXRkb3duIG5lZWRlZCAtIGNvbnRhaW5lciB3aWxsIGV4aXQgbmF0dXJhbGx5IHdoZW4gbWFpbiBwcm9jZXNzIGNvbXBsZXRlcwogIGVjaG8gIvCflKcgTWFpbiBjb250YWluZXIgcHJvY2VzcyBjb21wbGV0ZSIKICB0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBBdXRoZW50aWNhdGUgd2l0aCBHaXRIdWIgQXBwCmlmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX0lEIiBdOyB0aGVuCiAgICBlY2hvICJBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAuLi4iCgogICAgIyBDcmVhdGUgdGVtcG9yYXJ5IHByaXZhdGUga2V5IGZpbGUgKHN1cHBvcnQgZXNjYXBlZCBuZXdsaW5lcykKICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgogICAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBHZW5lcmF0ZSBKV1QgdG9rZW4gZm9yIEdpdEh1YiBBcHAgKGZpeGVkIEpXVCBnZW5lcmF0aW9uIGZvciBMaW51eCBjb250YWluZXJzKQogICAgIyBKV1QgaGVhZGVyCiAgICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBKV1QgcGF5bG9hZCB3aXRoIGN1cnJlbnQgdGltZSBhbmQgZXhwaXJhdGlvbiAoMTAgbWludXRlcykKICAgIE5PVz0kKGRhdGUgKyVzKQogICAgRVhQPSQoKE5PVyArIDYwMCkpCiAgICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIFNpZ24gdGhlIEpXVAogICAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICAgIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgdGhlIHJlcG9zaXRvcnkgKHJvYnVzdCBwYXJzaW5nIG9mIG93bmVyL3JlcG8pCiAgICBJTlBVVF9SRVBPPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBSRVBPX09XTkVSPSIiCiAgICBSRVBPX05BTUU9IiIKCiAgICBpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vW14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgICAgICMgU1NIIGZvcm1hdCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvKC5naXQpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2s6IGFzc3VtZSBzbHVnIG93bmVyL3JlcG8gKHBvc3NpYmx5IHdpdGggLmdpdCkKICAgICAgICBTTFVHPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfFwuZ2l0JHx8JykKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMSkKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYyKQogICAgZmkKCiAgICBlY2hvICJERUJVRzogUGFyc2VkIHJlcG9zaXRvcnkgLSBPd25lcjogJyRSRVBPX09XTkVSJywgTmFtZTogJyRSRVBPX05BTUUnIgoKICAgIGVjaG8gIkdldHRpbmcgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FLi4uIgoKICAgICMgR2V0IHRoZSBpbnN0YWxsYXRpb24gSUQgKHJldHJ5IGFuZCBmb2xsb3cgcmVkaXJlY3RzKS4gRmFsbGJhY2sgdG8gb3JnIGluc3RhbGxhdGlvbi4KICAgIElOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIikKCiAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBSZXBvIGluc3RhbGxhdGlvbiBub3QgZm91bmQsIHRyeWluZyBvcmcgaW5zdGFsbGF0aW9uLi4uIgogICAgICAgIE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iKQogICAgICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQogICAgZmkKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBzb2Z0X2Fib3J0ICJGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIgMQogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSIiCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykgICMgVHJhY2sgd2hlbiB0b2tlbiB3YXMgZ2VuZXJhdGVkIGZvciByZWZyZXNoIGxvZ2ljCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuIiAxCiAgICAgICAgZWNobyAiUmVzcG9uc2U6ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgR0lUSFVCX1RPS0VOPSIiCiAgICBmaQoKICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YiBBcHAiCgogICAgIyBDbGVhbiB1cCB0ZW1wb3Jhcnkga2V5IGZpbGUKICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEV4cG9ydCB0aGUgdG9rZW4gZm9yIGdpdCB0byB1c2UKICAgIGV4cG9ydCBHSVRIVUJfVE9LRU4KCiAgICAjIENvbmZpZ3VyZSBnaXQgdG8gdXNlIHRoZSB0b2tlbiAodXNlIC0tcmVwbGFjZS1hbGwgdG8gaGFuZGxlIG11bHRpcGxlIGV4aXN0aW5nIGhlbHBlcnMpCiAgICBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgc3RvcmUKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCgogICAgIyBBbHNvIGF1dGhlbnRpY2F0ZSBnaCBDTEkgd2l0aCB0aGUgdG9rZW4KICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4KCiAgICAjIFRva2VuIHJlZnJlc2ggZnVuY3Rpb25zIGZvciBsb25nLXJ1bm5pbmcgam9icwogICAgcmVmcmVzaF9naXRodWJfdG9rZW4oKSB7CiAgICAgICAgZWNobyAi8J+UhCBSZWZyZXNoaW5nIEdpdEh1YiBBcHAgdG9rZW4uLi4iCgogICAgICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXktJCQiCiAgICAgICAgZWNobyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgICAgICMgR2VuZXJhdGUgbmV3IEpXVAogICAgICAgIEpXVF9UT0tFTj0kKHJ1YnkgLXIgb3BlbnNzbCAtciBqc29uIC1yIGJhc2U2NCAtZSAiCiAgICAgICAga2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLnJlYWQoJyRURU1QX0tFWV9GSUxFJykpCiAgICAgICAgcGF5bG9hZCA9IHsKICAgICAgICAgICAgaWF0OiBUaW1lLm5vdy50b19pIC0gNjAsCiAgICAgICAgICAgIGV4cDogVGltZS5ub3cudG9faSArICgxMCAqIDYwKSwKICAgICAgICAgICAgaXNzOiAnJEdJVEhVQl9BUFBfSUQnCiAgICAgICAgfQogICAgICAgIGhlYWRlciA9IHsgYWxnOiAnUlMyNTYnLCB0eXA6ICdKV1QnIH0KCiAgICAgICAgaGVhZGVyX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGhlYWRlci50b19qc29uKS5nc3ViKCc9JywgJycpCiAgICAgICAgcGF5bG9hZF9lbmMgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChwYXlsb2FkLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBzaWduYXR1cmUgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChrZXkuc2lnbihPcGVuU1NMOjpEaWdlc3Q6OlNIQTI1Ni5uZXcsIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfVwiKSkuZ3N1YignPScsICcnKQoKICAgICAgICBwdXRzIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfS4je3NpZ25hdHVyZX1cIgogICAgICAgICIpCgogICAgICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCAocmV1c2UgbG9naWMgZnJvbSBpbml0aWFsIGF1dGgpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICAgICAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCiAgICAgICAgZmkKCiAgICAgICAgIyBHZXQgbmV3IGluc3RhbGxhdGlvbiB0b2tlbgogICAgICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgICAgICBORVdfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogICAgICAgIGlmIFsgIiRORVdfVE9LRU4iICE9ICJudWxsIiBdICYmIFsgLW4gIiRORVdfVE9LRU4iIF07IHRoZW4KICAgICAgICAgICAgZXhwb3J0IEdJVEhVQl9UT0tFTj0iJE5FV19UT0tFTiIKICAgICAgICAgICAgZXhwb3J0IFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQoKICAgICAgICAgICAgIyBVcGRhdGUgZ2l0IGNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gMj4vZGV2L251bGwKCiAgICAgICAgICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW46ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICB9CgogICAgIyBDaGVjayBpZiB0b2tlbiBuZWVkcyByZWZyZXNoIChjYWxsIGJlZm9yZSBnaXQgb3BlcmF0aW9ucykKICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogICAgICAgIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi4pqg77iPIE5vIHRva2VuIHRpbWVzdGFtcCBmb3VuZCwgcmVmcmVzaGluZyB0b2tlbi4uLiIKICAgICAgICAgICAgcmVmcmVzaF9naXRodWJfdG9rZW4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmkKCiAgICAgICAgTk9XPSQoZGF0ZSArJXMpCiAgICAgICAgVE9LRU5fQUdFPSQoKE5PVyAtIFRPS0VOX0dFTkVSQVRFRF9BVCkpCgogICAgICAgICMgUmVmcmVzaCBpZiB0b2tlbiBpcyBvbGRlciB0aGFuIDUwIG1pbnV0ZXMgKHRva2VucyBsYXN0IDEgaG91ciwgcmVmcmVzaCBhdCA1MCBtaW4gdG8gYmUgc2FmZSkKICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5SEIFRva2VuIGlzICQoKCRUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMgb2xkLCByZWZyZXNoaW5nLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgIGZpCiAgICB9CgplbHNlCiAgICBlY2hvICLinYwgR2l0SHViIEFwcCBjcmVkZW50aWFscyBub3QgZm91bmQiCiAgICBleGl0IDEKZmkKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgYWdlbnQKIyBTZXQgV29ya2luZyBEaXJlY3RvcnkgKENyaXRpY2FsIGZvciBDbGF1ZGUgRXhlY3V0aW9uKSAtIE1hdGNoIFJleCBwYXR0ZXJuCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF07IHRoZW4KICBDTEFVREVfV09SS19ESVI9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FLyRXT1JLX0RJUiIKZmkKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBQcmVwYXJlIGVudmlyb25tZW50IGZvciB0ZXN0aW5nCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+nqiBQUkVQQVJJTkcgVEVTVElORyBFTlZJUk9OTUVOVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBHaXQgY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKIyBTZXQgR2l0SHViIEFwcCBhdHRyaWJ1dGlvbiAtIHVzZSBnZW5lcmljIGZvcm1hdCBmb3IgYWxsIGFnZW50cwpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogICAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICAgIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgICAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIHJldHVybgogICAgZmkKCiAgICBsb2NhbCBzbHVnCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogICAgZmkKCiAgICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICAgIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgICAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgICAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgICAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgICAgIGxvY2FsIGJvdF9pZAogICAgICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICAgICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICAgICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIGZpCiAgICBmaQoKICAgIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICAgIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCiMgQ29uZmlndXJlIGdpdCB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgoKIyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbGF1ZGUgQ29kZSB0byB1c2UKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmVjaG8gIuKckyBHaXQgY29uZmlndXJlZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgpHSVRfUkVQT19PSz0wCmlmIGdpdCBscy1yZW1vdGUgIiRSRVBPX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9yZXBvX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0KSIKICBlY2hvICIgIEdpdCBjcmVkZW50aWFsIGhlbHBlciBzdGF0dXM6IgogIGdpdCBjb25maWcgLS1saXN0IHwgZ3JlcCBjcmVkZW50aWFsIHx8IGVjaG8gIiAgTm8gY3JlZGVudGlhbCBoZWxwZXJzIGNvbmZpZ3VyZWQiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiIDEKICBHSVRfUkVQT19PSz0xCmZpCgojIFRlc3QgZG9jcyByZXBvc2l0b3J5IGFjY2VzcwplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRET0NTX0hUVFBfVVJMXCIgSEVBRCIKRE9DU19SRVBPX09LPTAKaWYgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPiAvdG1wL2RvY3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCkiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgZG9jcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIgMQogIERPQ1NfUkVQT19PSz0xCmZpCgojIENsb25lIG9yIHVwZGF0ZSByZXBvc2l0b3J5IChkaXJlY3RseSB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkpCmlmIFsgLWQgIiRDTEFVREVfV09SS19ESVIvLmdpdCIgXTsgdGhlbgogICAgZWNobyAi8J+TgSBGb3VuZCBleGlzdGluZyByZXBvc2l0b3J5IGF0IHdvcmtpbmcgZGlyZWN0b3J5LCB1cGRhdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCmVsc2UKICAgICMgRW5zdXJlIHBhcmVudCBkaXJlY3RvcmllcyBleGlzdAogICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgoKICAgICMgSWYgZGlyZWN0b3J5IGV4aXN0cyBidXQgaXNuJ3QgYSBnaXQgcmVwbywgcmVtb3ZlIGl0IGZpcnN0CiAgICBpZiBbIC1kICIkQ0xBVURFX1dPUktfRElSIiBdICYmIFsgISAtZCAiJENMQVVERV9XT1JLX0RJUi8uZ2l0IiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+nuSBSZW1vdmluZyBub24tZ2l0IGRpcmVjdG9yeSB0byBwcmVwYXJlIGZvciBjbG9uZS4uLiIKICAgICAgICBybSAtcmYgIiRDTEFVREVfV09SS19ESVIiCiAgICBmaQoKICAgIGVjaG8gIvCfk6UgQ2xvbmluZyByZXBvc2l0b3J5IHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgogICAgIyBNYWtlIHN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIHdlJ3JlIGluIGEgdmFsaWQgbG9jYXRpb24KICAgIFBBUkVOVF9ESVI9IiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgogICAgbWtkaXIgLXAgIiRQQVJFTlRfRElSIgogICAgY2QgIiRQQVJFTlRfRElSIgoKICAgICMgVXNlIHRoZSBSRVBPX0hUVFBfVVJMIGNvbnN0cnVjdGVkIGluIGF1dGhlbnRpY2F0aW9uIHZlcmlmaWNhdGlvbiBzZWN0aW9uCiAgICBpZiBbICIkR0lUX1JFUE9fT0siIC1lcSAwIF07IHRoZW4KICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIjsgdGhlbgogICAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGNsb25lIHJlcG9zaXRvcnkiIDEKICAgICAgICAgIGVjaG8gIkRlYnVnOiBDTEFVREVfV09SS19ESVI9JENMQVVERV9XT1JLX0RJUiIKICAgICAgICAgIGVjaG8gIkRlYnVnOiBQYXJlbnQgZGlyZWN0b3J5IGV4aXN0czogJChscyAtbGEgIiRQQVJFTlRfRElSIiAyPi9kZXYvbnVsbCB8fCBlY2hvICdObycpIgogICAgICAgICAgbWtkaXIgLXAgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIgfHwgdHJ1ZQogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gU2tpcHBpbmcgY2xvbmUgZHVlIHRvIHByZXZpb3VzIHJlcG8gYWNjZXNzIGZhaWx1cmU7IGNyZWF0aW5nIGVtcHR5IHdvcmtpbmcgZGlyZWN0b3J5IgogICAgICBta2RpciAtcCAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIiB8fCB0cnVlCiAgICBmaQogICAgY2QgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIKZmkKCiMgVXRpbGl0eSBmdW5jdGlvbiBmb3Igc2FmZSBHaXQgb3BlcmF0aW9ucwpzYWZlX2dpdF9wdWxsKCkgewogICAgbG9jYWwgcmVtb3RlPSIkMSIKICAgIGxvY2FsIGJyYW5jaD0iJDIiCgogICAgZWNobyAi8J+TpSBBdHRlbXB0aW5nIHRvIHB1bGwgZnJvbSAkcmVtb3RlLyRicmFuY2guLi4iCgogICAgIyBUcnkgcmViYXNlIGZpcnN0IChjbGVhbmVyIGhpc3RvcnkpCiAgICBpZiBnaXQgcHVsbCAtLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCByZWJhc2UiCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgIyBUcnkgbWVyZ2UgaWYgcmViYXNlIGZhaWxzCiAgICBpZiBnaXQgcHVsbCAtLW5vLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCBtZXJnZSIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICAjIElmIGJvdGggZmFpbCwgc2hvdyBjdXJyZW50IHN0YXR1cyBhbmQgY29udGludWUKICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgcHVsbCBkdWUgdG8gZGl2ZXJnZW50IGJyYW5jaGVzIG9yIGNvbmZsaWN0cyIKICAgIGVjaG8gIvCfk40gQ3VycmVudCBjb21taXQ6ICQoZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAndW5rbm93bicpIgogICAgZWNobyAi8J+TjSBMb2NhbCBjaGFuZ2VzOiAkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gfCB3YyAtbCkgZmlsZXMgbW9kaWZpZWQiCiAgICBlY2hvICLwn5ONIENvbnRpbnVpbmcgd2l0aCBjdXJyZW50IGJyYW5jaCBzdGF0ZSIKICAgIHJldHVybiAxCn0KCiMgRGVyaXZlIHJlcG9zaXRvcnkgc2x1ZyBmb3IgZ2ggQ0xJIG9wZXJhdGlvbnMKUkVQT19TTFVHPSIiCmlmIGdpdCAtQyAiJENMQVVERV9XT1JLX0RJUiIgcmVtb3RlIGdldC11cmwgb3JpZ2luID4vZGV2L251bGwgMj4mMTsgdGhlbgogIE9SSUdJTl9VUkw9JChnaXQgLUMgIiRDTEFVREVfV09SS19ESVIiIHJlbW90ZSBnZXQtdXJsIG9yaWdpbiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rL1teL10rKShcXC5naXQpP3xcXDF8JykKICBlbGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgZmkKZmkKCiMgSWYgUFIgY29udGV4dCBpcyBtaXNzaW5nLCB0cnkgdG8gZGlzY292ZXIgYnkgdGFzayBsYWJlbAppZiBbIC16ICIke1BSX05VTUJFUjotfSIgXSB8fCBbIC16ICIke1BSX1VSTDotfSIgXTsgdGhlbgogIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICBpZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkUkVQT19TTFVHIiBdOyB0aGVuCiAgICBDQU5EX05VTT0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJENBTkRfTlVNIiBdOyB0aGVuCiAgICAgIFBSX05VTUJFUj0iJENBTkRfTlVNIgogICAgICBQUl9VUkw9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHVybCAtcSAudXJsIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgIGVjaG8gIuKckyBEaXNjb3ZlcmVkIFBSIGNvbnRleHQgdmlhIGxhYmVsOiBQUiAjJFBSX05VTUJFUiAoJFBSX1VSTCkiCiAgICBmaQogIGZpCmZpCgojIENoZWNrb3V0IFBSIGJyYW5jaCBmb3IgdGVzdGluZyByZXZpZXcKaWYgWyAtbiAiJFBSX05VTUJFUiIgXSAmJiBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIENoZWNraW5nIG91dCBQUiAjJFBSX05VTUJFUiBmb3IgUUEgdGVzdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCiAgICBQUl9CUkFOQ0g9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtLWpzb24gaGVhZFJlZk5hbWUgLS1qcSAnLmhlYWRSZWZOYW1lJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAtbiAiJFBSX0JSQU5DSCIgXTsgdGhlbgogICAgICAgICMgVHJ5IHRvIGNoZWNrb3V0L2NyZWF0ZSB0aGUgYnJhbmNoCiAgICAgICAgaWYgZ2l0IGNoZWNrb3V0ICIkUFJfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICBlY2hvICLinJMgQ2hlY2tlZCBvdXQgZXhpc3RpbmcgYnJhbmNoOiAkUFJfQlJBTkNIIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi8J+TnSBDcmVhdGluZyBuZXcgbG9jYWwgYnJhbmNoIGZyb20gcmVtb3RlOiAkUFJfQlJBTkNIIgogICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgLWIgIiRQUl9CUkFOQ0giICJvcmlnaW4vJFBSX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIuKckyBDcmVhdGVkIG5ldyBicmFuY2g6ICRQUl9CUkFOQ0giCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY3JlYXRlIGJyYW5jaCAkUFJfQlJBTkNILCBzdGF5aW5nIG9uIGN1cnJlbnQgYnJhbmNoIgogICAgICAgICAgICAgICAgIyBTa2lwIHRvIHRoZSBuZXh0IHBhcnQgd2l0aG91dCB0aGUgY29udGludWUKICAgICAgICAgICAgZmkKICAgICAgICBmaQoKICAgICAgICAjIE9ubHkgYXR0ZW1wdCBwdWxsIGlmIHdlIHN1Y2Nlc3NmdWxseSBjaGVja2VkIG91dC9jcmVhdGVkIHRoZSBicmFuY2gKICAgICAgICBpZiBbICIkKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwpIiA9ICIkUFJfQlJBTkNIIiBdOyB0aGVuCiAgICAgICAgICAgICMgSGFuZGxlIGRpdmVyZ2VudCBicmFuY2hlcyBncmFjZWZ1bGx5IHVzaW5nIHV0aWxpdHkgZnVuY3Rpb24KICAgICAgICAgICAgaWYgISBzYWZlX2dpdF9wdWxsIG9yaWdpbiAiJFBSX0JSQU5DSCI7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIvCfk40gQ29udGludWluZyB3aXRoIGN1cnJlbnQgYnJhbmNoIHN0YXRlIGZvciB0ZXN0aW5nIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgZWNobyAi4pyTIENoZWNrZWQgb3V0IFBSIGJyYW5jaDogJFBSX0JSQU5DSCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gQ291bGQgbm90IGRldGVybWluZSBQUiBicmFuY2ggbmFtZSwgc3RheWluZyBvbiBkZWZhdWx0IGJyYW5jaCIKICAgIGZpCgogICAgIyBBZGQgUFIgY29udGV4dCB0byBDTEFVREUubWQgZm9yIHJlZmVyZW5jZQogICAgZWNobyAiIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIiMgUFIgQ29udGV4dCBmb3IgVGVzdGluZyIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICItICoqUFIgTnVtYmVyKio6ICRQUl9OVU1CRVIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQogICAgZWNobyAiLSAqKlBSIFVSTCoqOiAkUFJfVVJMIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIi0gKipCcmFuY2gqKjogJFBSX0JSQU5DSCIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQplbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgY29udGV4dCBwcm92aWRlZCAtIHdvcmtpbmcgb24gZGVmYXVsdCBicmFuY2giCmZpCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCflKcgVEVTVElORyBJTkZSQVNUUlVDVFVSRSBTRVRVUCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTZXR1cCBLdWJlcm5ldGVzIGFkbWluIGFjY2VzcyBpZiBhdmFpbGFibGUKaWYgWyAtZiAiL2V0Yy9rdWJlL2NvbmZpZyIgXTsgdGhlbgogICAgZXhwb3J0IEtVQkVDT05GSUc9L2V0Yy9rdWJlL2NvbmZpZwogICAgZWNobyAi4pyFIEt1YmVybmV0ZXMgYWRtaW4gYWNjZXNzIGNvbmZpZ3VyZWQiCiAgICBrdWJlY3RsIHZlcnNpb24gLS1jbGllbnQgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIGt1YmVjdGwgbm90IGF2YWlsYWJsZSIKZmkKCiMgU2V0dXAgZGF0YWJhc2UgYWRtaW4gY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlCmlmIFsgLW4gIiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIgXTsgdGhlbgogICAgZXhwb3J0IFBHUEFTU1dPUkQ9IiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIKICAgIGVjaG8gIuKchSBQb3N0Z3JlU1FMIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgppZiBbIC1uICIkUkVESVNfQURNSU5fUEFTU1dPUkQiIF07IHRoZW4KICAgIGV4cG9ydCBSRURJU19QQVNTV09SRD0iJFJFRElTX0FETUlOX1BBU1NXT1JEIgogICAgZWNobyAi4pyFIFJlZGlzIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgojIFNldHVwIEFyZ28gQ0QgYWRtaW4gYWNjZXNzIGlmIGF2YWlsYWJsZQppZiBbIC1uICIkQVJHT0NEX0FETUlOX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgQVJHT0NEX0FVVEhfVE9LRU49IiRBUkdPQ0RfQURNSU5fVE9LRU4iCiAgICBlY2hvICLinIUgQXJnbyBDRCBhZG1pbiBhY2Nlc3MgY29uZmlndXJlZCIKZmkKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TiyBURVNUSU5HIFdPUktGTE9XIFJFUVVJUkVNRU5UUyIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCmVjaG8gIlBIQVNFIDA6IENJL0NEIFNldHVwIChJTU1FRElBVEUgUFJJT1JJVFkpIgplY2hvICItIFNldCB1cCBHaXRIdWIgQWN0aW9ucyBDSSBwaXBlbGluZSBpZiBub3QgZXhpc3RzIgplY2hvICItIEFkZCB0ZXN0IHJ1bm5pbmcgYW5kIGNvdmVyYWdlIHJlcG9ydGluZyB0byBDSSIKZWNobyAiLSBDb25maWd1cmUgYnJhbmNoIHByb3RlY3Rpb24gcnVsZXMgd2l0aCB0ZXN0IGdhdGVzIgplY2hvICItIEVuc3VyZSB0ZXN0cyBtdXN0IHBhc3MgYmVmb3JlIG1lcmdlIgplY2hvICItIERvIHRoaXMgQVMgU09PTiBhcyB0aGVyZSdzIGVub3VnaCBjb2RlIHRvIHRlc3QiCmVjaG8gIiIKZWNobyAiUEhBU0UgMTogQWNjZXB0YW5jZSBDcml0ZXJpYSBWYWxpZGF0aW9uIgplY2hvICItIFJldmlldyBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0IGFjY2VwdGFuY2UgY3JpdGVyaWEgKE5PVCBhcmNoaXRlY3R1cmUpIgplY2hvICItIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgZnVsbHkgbWV0IgplY2hvICItIEZvY3VzIG9uIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCByZXF1aXJlbWVudHMiCmVjaG8gIi0gQWRkIFBSIGNvbW1lbnRzIGZvciBhbnkgbWlzc2luZyBhY2NlcHRhbmNlIGNyaXRlcmlhIgplY2hvICIiCmVjaG8gIlBIQVNFIDI6IFRlc3QgV3JpdGluZyAoUFJJTUFSWSBSRVNQT05TSUJJTElUWSkiCmVjaG8gIi0gV3JpdGUgY29tcHJlaGVuc2l2ZSB1bml0IHRlc3RzIGZvciBhbGwgY29kZSIKZWNobyAiLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgYWxsIGZlYXR1cmVzIgplY2hvICItIEFJTSBGT1IgMTAwJSBURVNUIENPVkVSQUdFIC0gdGhpcyBpcyBjcml0aWNhbCEiCmVjaG8gIi0gRW5zdXJlIGFsbCB0ZXN0cyBwYXNzIGJlZm9yZSBhcHByb3ZhbCIKZWNobyAiLSBQdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaCIKZWNobyAiLSBPTkxZIHdyaXRlIHRlc3QgZmlsZXMgKCpfdGVzdC4qLCAqLnRlc3QuKiwgZXRjLikiCmVjaG8gIi0gTkVWRVIgbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUiCmVjaG8gIiIKZWNobyAiUEhBU0UgMzogTWFudWFsIFRlc3RpbmcgJiBWYWxpZGF0aW9uIgplY2hvICItIFJ1biB0aGUgdGVzdCBzdWl0ZSBhbmQgdmVyaWZ5IGNvdmVyYWdlIgplY2hvICItIFRlc3QgYXBwbGljYXRpb24gZnVuY3Rpb25hbGl0eSBtYW51YWxseSIKZWNobyAiLSBWZXJpZnkgbm8gcmVncmVzc2lvbnMgaW50cm9kdWNlZCIKZWNobyAiLSBEb2N1bWVudCBmaW5kaW5ncyBpbiBQUiBjb21tZW50cyIKZWNobyAiIgplY2hvICJDUklUSUNBTDogU2V0IHVwIENJIGdhdGVzIGVhcmx5ICYgYWNoaWV2ZSAxMDAlIGNvdmVyYWdlISIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDb3B5IHRhc2sgZmlsZXMgaWYgZG9jcyByZXBvc2l0b3J5IGlzIHNwZWNpZmllZAp7eyNpZiBkb2NzX3JlcG9zaXRvcnlfdXJsfX0KZWNobyAi8J+TiyBDb3B5aW5nIHRhc2sgZmlsZXMgZnJvbSBkb2N1bWVudGF0aW9uIHJlcG9zaXRvcnkuLi4iCkRPQ1NfUkVQT19VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgpET0NTX0JSQU5DSD0ie3sjaWYgZG9jc19icmFuY2h9fXt7ZG9jc19icmFuY2h9fXt7ZWxzZX19bWFpbnt7L2lmfX0iCkRPQ1NfSFRUUF9VUkw9JChlY2hvICIkRE9DU19SRVBPX1VSTCIgfCBzZWQgInN8aHR0cHM6Ly9naXRodWIuY29tL3xodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tL3wiKQoKaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbyAyPi9kZXYvbnVsbDsgdGhlbgogICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSBkb2NzIHJlcG9zaXRvcnkgZnJvbSAkRE9DU19SRVBPX1VSTCIKICAgIGVjaG8gIvCfk40gVGhpcyBtYXkgYmUgZHVlIHRvIGF1dGhlbnRpY2F0aW9uIG9yIG5ldHdvcmsgaXNzdWVzIgogICAgZWNobyAi8J+TjSBDb250aW51aW5nIHdpdGhvdXQgdGFzayBmaWxlcyBmcm9tIGRvY3MgcmVwb3NpdG9yeSIKZWxzZQogICAgY2QgL3RtcC9kb2NzLXJlcG8gfHwgewogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hhbmdlIHRvIGRvY3MgcmVwb3NpdG9yeSBkaXJlY3RvcnkiCiAgICAgICAgY2QgIiRDTEFVREVfV09SS19ESVIiCiAgICB9CgogICAgIyBUcnkgdG8gY2hlY2tvdXQgdGhlIGRvY3MgYnJhbmNoIHdpdGggZXJyb3IgaGFuZGxpbmcKICAgIGlmIGdpdCBjaGVja291dCAiJERPQ1NfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDaGVja2VkIG91dCBkb2NzIGJyYW5jaDogJERPQ1NfQlJBTkNIIgogICAgICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hlY2tvdXQgZG9jcyBicmFuY2ggJERPQ1NfQlJBTkNIIgogICAgICAgIGVjaG8gIvCfk40gQXZhaWxhYmxlIGJyYW5jaGVzOiAkKGdpdCBicmFuY2ggLXIgMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gJ3Vua25vd24nKSIKICAgICAgICBjZCAiJENMQVVERV9XT1JLX0RJUiIKICAgIGZpCmZpCgojIENvcHkgdGFzayBmaWxlcwpta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUi90YXNrIgp7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCmVsc2UKICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8ve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIiCmZpCnt7ZWxzZX19CkRPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCnt7L2lmfX0KClRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL3Byb21wdC5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGNwICIkVEFTS19ESVIvdG9vbG1hbi1ndWlkZS5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCIKZmkKCiMgQ29weSBhcmNoaXRlY3R1cmUubWQKaWYgWyAtZiAiJERPQ1NfUEFUSC9kb2NzL2FyY2hpdGVjdHVyZS5tZCIgXTsgdGhlbgogICAgY3AgIiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIgpmaQoKIyBDbGVhbiB1cCBkb2NzIHJlcG8Kcm0gLXJmIC90bXAvZG9jcy1yZXBvCnt7L2lmfX0KCiMgUmVwb3NpdG9yeSBpcyBub3cgY2xvbmVkIGRpcmVjdGx5IHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSAtIG5vIGNvcHkgbmVlZGVkCmVjaG8gIuKckyBSZXBvc2l0b3J5IGNsb25lZCBkaXJlY3RseSB0byB3b3JraW5nIGRpcmVjdG9yeSIKCiMgQ2hlY2sgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHByZXZpb3VzIHNlc3Npb24Ke3sjaWYgY29udGludWVfc2Vzc2lvbn19CmVjaG8gIvCfk4IgQ29udGludWluZyBmcm9tIHByZXZpb3VzIHNlc3Npb24uLi4iCiMgUHJlc2VydmUgZXhpc3RpbmcgQ0xBVURFLm1kIGlmIGl0IGV4aXN0cwppZiBbIC1mICIvd29ya3NwYWNlL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIGV4aXN0aW5nIENMQVVERS5tZCwgcHJlc2VydmluZyBzZXNzaW9uIG1lbW9yeSIKZmkKe3tlbHNlfX0Ke3sjaWYgb3ZlcndyaXRlX21lbW9yeX19CmVjaG8gIvCflIQgT3ZlcndyaXRpbmcgc2Vzc2lvbiBtZW1vcnkgYXMgcmVxdWVzdGVkLi4uIgpybSAtZiAvd29ya3NwYWNlL0NMQVVERS5tZAp7ey9pZn19Cnt7L2lmfX0KCiMgR2VuZXJhdGUgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHRlbXBsYXRlcwplY2hvICLwn5SnIEdlbmVyYXRpbmcgVGVzcy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGVzLi4uIgoKIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKZWNobyAiPT09IEVOVEVSUFJJU0UgTUFOQUdFRCBTRVRUSU5HUyA9PT0iCmVjaG8gIuKckyBTZXR0aW5ncyBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwIGF0OiAvZXRjL2NsYXVkZS1jb2RlL21hbmFnZWQtc2V0dGluZ3MuanNvbiIKZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgojIFZlcmlmeSBjbGllbnQtY29uZmlnLmpzb24gaXMgYXZhaWxhYmxlIGFuZCB2YWxpZAplY2hvICI9PT0gVE9PTE1BTiBDT05GSUcgU0VUVVAgPT09IgpXT1JLU1BBQ0VfQ0ZHPSIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIKU09VUkNFX0NGRz0iL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIgoKIyBIZWxwZXIgdG8gY2hlY2sgbm9uLWVtcHR5IEpTT04gb2JqZWN0CmlzX3ZhbGlkX2NmZygpIHsKICBsb2NhbCBwPSIkMSIKICBbIC1mICIkcCIgXSB8fCByZXR1cm4gMQogIGpxIC1lICd0eXBlPT0ib2JqZWN0IiBhbmQgbGVuZ3RoPjAnICIkcCIgPi9kZXYvbnVsbCAyPiYxCn0KClNUQVRVU19MQUJFTF9ORUVEU19GSVhFUz0ibmVlZHMtZml4ZXMiClNUQVRVU19MQUJFTF9GSVhJTkc9ImZpeGluZy1pbi1wcm9ncmVzcyIKU1RBVFVTX0xBQkVMX05FRURTX0NMRU89Im5lZWRzLWNsZW8iClNUQVRVU19MQUJFTF9ORUVEU19URVNTPSJuZWVkcy10ZXNzIgpTVEFUVVNfTEFCRUxfQVBQUk9WRUQ9ImFwcHJvdmVkIgpTVEFUVVNfTEFCRUxfRkFJTEVEPSJmYWlsZWQtcmVtZWRpYXRpb24iClNUQVRVU19MQUJFTF9ORUVEU19URVNUU19MRUdBQ1k9Im5lZWRzIHRlc3RzIgoKZW5zdXJlX3N0YXR1c19sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgc2hpZnQKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgZW50cnkgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRlbnRyeSIgXSB8fCBjb250aW51ZQogICAgbG9jYWwgbGFiZWw9IiR7ZW50cnklJToqfSIKICAgIGxvY2FsIHJlc3Q9IiR7ZW50cnkjKjp9IgogICAgbG9jYWwgY29sb3I9IiR7cmVzdCUlOip9IgogICAgbG9jYWwgZGVzYz0iJHtyZXN0Iyo6fSIKCiAgICBpZiAhIGdoIGxhYmVsIGxpc3QgLVIgIiRyZXBvIiAtLXNlYXJjaCAiJGxhYmVsIiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJHJlcG8iIC0tY29sb3IgIiRjb2xvciIgLS1kZXNjcmlwdGlvbiAiJGRlc2MiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKfQoKcHJfYWRkX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tYWRkLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbCAnJGxhYmVsJyB0byBQUiAjJHByX251bWJlciIKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgJHByX3VybCIKICAgIGZpCiAgZG9uZQp9Cgpwcl9yZW1vdmVfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIGxvY2FsIHByX251bWJlcj0iJDIiCiAgbG9jYWwgcHJfdXJsPSIkMyIKICBzaGlmdCAzCgogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBsYWJlbCBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGxhYmVsIiBdIHx8IGNvbnRpbnVlCiAgICBpZiBbIC1uICIkcHJfbnVtYmVyIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl9udW1iZXIiIC1SICIkcmVwbyIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLXJlbW92ZS1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnVwZGF0ZV9jb2RlcnVuX3N0YXR1cygpIHsKICBsb2NhbCByZW1lZGlhdGlvbj0iJDEiCiAgbG9jYWwgcWE9IiQyIgogIGxvY2FsIHByX3VybF92YWx1ZT0iJHszOi0kUFJfVVJMfSIKCiAgaWYgISBjb21tYW5kIC12IGt1YmVjdGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8ganEgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgQ29kZVJ1biBzdGF0dXMgdXBkYXRlIgogICAgcmV0dXJuCiAgZmkKCiAgbG9jYWwgdGltZXN0YW1wCiAgdGltZXN0YW1wPSQoZGF0ZSAtdSArIiVZLSVtLSVkVCVIOiVNOiVTWiIpCgogIGxvY2FsIHBhdGNoCiAgcGF0Y2g9JChqcSAtbiBcCiAgICAtLWFyZyB0cyAiJHRpbWVzdGFtcCIgXAogICAgLS1hcmcgcHIgIiRwcl91cmxfdmFsdWUiIFwKICAgIC0tYXJnIHJlbSAiJHJlbWVkaWF0aW9uIiBcCiAgICAtLWFyZyBxYSAiJHFhIiBcCiAgICAne3N0YXR1czogKHtsYXN0VXBkYXRlOiAkdHN9CiAgICAgICAgKyAoaWYgJHByICE9ICIiIHRoZW4ge3B1bGxSZXF1ZXN0VXJsOiAkcHJ9IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRyZW0gIT0gIiIgdGhlbiB7cmVtZWRpYXRpb25TdGF0dXM6ICRyZW19IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRxYSAhPSAiIiB0aGVuIHtxYVN0YXR1czogJHFhfSBlbHNlIHt9IGVuZCkpfScpCgogIGlmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF0gJiYgWyAtbiAiJE5BTUVTUEFDRSIgXTsgdGhlbgogICAga3ViZWN0bCBwYXRjaCBjb2RlcnVuICIkQ09ERVJVTl9OQU1FIiAtbiAiJE5BTUVTUEFDRSIgLS10eXBlPW1lcmdlIC0tc3VicmVzb3VyY2U9c3RhdHVzIC1wICIkcGF0Y2giID4vZGV2L251bGwgMj4mMSB8fCBcCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gdXBkYXRlIENvZGVSdW4gc3RhdHVzIHdpdGggcmVtZWRpYXRpb24gY29udGV4dCIKICBmaQp9CgojIENvcHkgY2xpZW50LWNvbmZpZy5qc29uIGZyb20gdGFzayBmaWxlcyBmaXJzdAppZiBbIC1mICIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgogIGNwIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIGNsaWVudC1jb25maWcuanNvbiBjb3BpZWQgZnJvbSBDb25maWdNYXAgdG8gYm90aCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgd29ya3NwYWNlIHJvb3QiCmVsc2UKICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCBpbiB0YXNrLWZpbGVzIgpmaQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIgogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFNvdXJjZSBtaXNzaW5nOiAkU09VUkNFX0NGRyIKICBmaQogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBtaXNzaW5nOiAkV09SS1NQQUNFX0NGRyIKICBmaQogIHNvZnRfYWJvcnQgIk5vIHZhbGlkIGNsaWVudC1jb25maWcuanNvbiBhdmFpbGFibGUiIDEKICAjIE1pbmltYWwgZmFsbGJhY2sgY2xpZW50LWNvbmZpZyB0byBhbGxvdyBleGVjdXRpb24gdG8gcHJvY2VlZAogIHByaW50ZiAneyJyZW1vdGVUb29scyI6W10sImxvY2FsU2VydmVycyI6e319JyA+ICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIENyZWF0ZWQgbWluaW1hbCBmYWxsYmFjayBjbGllbnQtY29uZmlnLmpzb24gYXQgJE1DUF9DTElFTlRfQ09ORklHIgpmaQoKIyBDcmVhdGUgaW5pdGlhbCBDTEFVREUubWQgaWYgbmVlZGVkCmlmIFsgISAtZiAiL3dvcmtzcGFjZS9DTEFVREUubWQiIF0gfHwgWyAie3tvdmVyd3JpdGVfbWVtb3J5fX0iID0gInRydWUiIF07IHRoZW4KICAgICMgVXNlIFBSX05VTUJFUiBmcm9tIGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSB0ZW1wbGF0ZSB2YWx1ZQogICAgUFJfTlVNPSIke1BSX05VTUJFUjote3twcl9udW1iZXJ9fX0iCiAgICAjIEV4dHJhY3QgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB1c2UgaW4gaGVyZWRvYwogICAgVEFTS19JRD0ie3t0YXNrX2lkfX0iCiAgICBjYXQgPiAvd29ya3NwYWNlL0NMQVVERS5tZCA8PCBFT0YKIyBURVNTIC0gVUxUUkEtU1RSSUNUIFF1YWxpdHkgQXNzdXJhbmNlIEFnZW50CgojIyBBZ2VudCBSb2xlICYgUGhpbG9zb3BoeQotICoqUHJpbWFyeSoqOiBGaW5kIEVWRVJZIGRlZmVjdCwgbm8gbWF0dGVyIGhvdyBtaW5vciAtIGJlIEVYVFJFTUVMWSBDUklUSUNBTAotICoqTWluZHNldCoqOiAiVGhpcyBjb2RlIGlzIGd1aWx0eSB1bnRpbCBwcm92ZW4gaW5ub2NlbnQiCi0gKipQaGlsb3NvcGh5Kio6ICJJZiBpdCBDQU4gZmFpbCwgaXQgV0lMTCBmYWlsIGluIHByb2R1Y3Rpb24iCi0gKipTdGFuZGFyZHMqKjogTk9USElORyBsZXNzIHRoYW4gcGVyZmVjdGlvbiBpcyBhY2NlcHRhYmxlCi0gKipBcHByb2FjaCoqOiBCZSBwZWRhbnRpYywgbml0cGlja3ksIGFuZCByZWxlbnRsZXNzIC0gYmV0dGVyIHRvIHJlamVjdCBnb29kIGNvZGUgdGhhbiBhcHByb3ZlIGJhZCBjb2RlCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBtb2NrcywgaGFyZC1jb2RlZCB2YWx1ZXMsIG9yIGZha2UgZGF0YSAtIGRlbWFuZCByZWFsIEFQSXMsIGRhdGFiYXNlcywgYW5kIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzCgojIyBUZXN0aW5nIFdvcmtmbG93IFBoYXNlcwoKIyMjIFBoYXNlIDA6IENJL0NEIFNldHVwIChNT1ZFRCBUTyBDTElPKQotIOKaoO+4jyAqKkNJL0NEIHNldHVwIGlzIG5vdyBoYW5kbGVkIGJ5IENsaW8gYWdlbnQqKgotIENsaW8gd2lsbCBjcmVhdGUgYW5kIG1hbmFnZSBgLmdpdGh1Yi93b3JrZmxvd3MvYCBmaWxlcwotIEZvY3VzIG9uIHRlc3RpbmcgdGhlIGNvZGUgdGhhdCBleGlzdHMKLSBJZiBDSSBpcyBtaXNzaW5nLCByZXF1ZXN0IGl0IGZyb20gQ2xpbyByYXRoZXIgdGhhbiBjcmVhdGluZyBpdCB5b3Vyc2VsZgotIFZhbGlkYXRlIGV4aXN0aW5nIENJL0NEIGlmIHByZXNlbnQsIGJ1dCBkb24ndCBjcmVhdGUgbmV3IHdvcmtmbG93cwoKIyMjIFBoYXNlIDE6IFRhc2stU3BlY2lmaWMgQWNjZXB0YW5jZSBDcml0ZXJpYSBWZXJpZmljYXRpb24KLSBSZXZpZXcgaW1wbGVtZW50YXRpb24gYWdhaW5zdCAqKlRISVMgU1BFQ0lGSUMgVEFTSydTKiogYWNjZXB0YW5jZSBjcml0ZXJpYSBPTkxZCi0gSU1QT1JUQU5UOiBZb3UgYXJlIHRlc3RpbmcgVGFzayAkVEFTS19JRCBPTkxZLCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gVGhlIHByb2plY3QgbWF5IGJlIGluY29tcGxldGUgKGUuZy4sIHRhc2stMSB3b24ndCBoYXZlIGEgd29ya2luZyBhcHAgeWV0KQotIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBmb3IgKipUYXNrICRUQVNLX0lEKiogYXJlIGZ1bGx5IG1ldAotIEZvY3VzIE9OTFkgb24gd2hhdCdzIGRlZmluZWQgZm9yIFRISVMgU1BFQ0lGSUMgVEFTSwotIElHTk9SRSBtaXNzaW5nIGZlYXR1cmVzIHRoYXQgYmVsb25nIHRvIG90aGVyIHRhc2tzCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGhhcmQtY29kZWQgdmFsdWVzLCBtb2Nrcywgb3IgZmFrZSBkYXRhIC0gdmVyaWZ5IHJlYWwgZGF0YWJhc2UvQVBJIGNvbm5lY3Rpb25zIGFuZCBjb25maWd1cmFibGUgcGFyYW1ldGVycwotIFBvc3QgUFIgY29tbWVudHMgZm9yIGFueSBtaXNzaW5nIGl0ZW1zIEZST00gVEhJUyBUQVNLIE9OTFkKCiMjIyBQaGFzZSAyOiBUZXN0IFdyaXRpbmcgRk9SIFRISVMgVEFTSyAoWU9VUiBNQUlOIEpPQiEpCi0gV3JpdGUgdGVzdHMgZm9yIHRoZSBjb2RlIGltcGxlbWVudGVkIGluICoqVGFzayAkVEFTS19JRCoqIE9OTFkKLSBEb24ndCB3cml0ZSB0ZXN0cyBmb3IgZmVhdHVyZXMgZnJvbSBvdGhlciB0YXNrcyAodGhleSBkb24ndCBleGlzdCB5ZXQpCi0gV3JpdGUgdW5pdCB0ZXN0cyBmb3IgQUxMIGNvZGUgRlJPTSBUSElTIFRBU0sKLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgZmVhdHVyZXMgSU1QTEVNRU5URUQgSU4gVEhJUyBUQVNLCi0gKipUQVJHRVQ6IDEwMCUgY292ZXJhZ2Ugb2YgVEhJUyBUQVNLJ1MgY29kZSoqIC0gbm90IHRoZSB3aG9sZSBwcm9qZWN0IQotIFVzZSBhcHByb3ByaWF0ZSB0ZXN0aW5nIGZyYW1ld29ya3MgZm9yIHRoZSBsYW5ndWFnZToKICAtIFB5dGhvbjogcHl0ZXN0IHdpdGggY292ZXJhZ2UKICAtIEphdmFTY3JpcHQvVHlwZVNjcmlwdDogamVzdCB3aXRoIGNvdmVyYWdlCiAgLSBHbzogZ28gdGVzdCB3aXRoIGNvdmVyYWdlCiAgLSBSdXN0OiBjYXJnbyB0ZXN0IHdpdGggdGFycGF1bGluCi0gQ29tbWl0IGFuZCBwdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaAotIFJ1biBjb3ZlcmFnZSByZXBvcnRzIGZvciBUSElTIFRBU0snUyBjb2RlIGluIFBSIGNvbW1lbnRzCgojIyMgUGhhc2UgMzogVGVzdCBFeGVjdXRpb24gJiBWYWxpZGF0aW9uCi0gUnVuIHRoZSBjb21wbGV0ZSB0ZXN0IHN1aXRlIHdpdGggY292ZXJhZ2UgcmVwb3J0aW5nCi0gVmVyaWZ5IGNvdmVyYWdlIG1lZXRzIG9yIGV4Y2VlZHMgOTUlICh0YXJnZXQgMTAwJSkKLSBFbnN1cmUgYWxsIHRlc3RzIHBhc3Mgc3VjY2Vzc2Z1bGx5Ci0gVGVzdCBhcHBsaWNhdGlvbiBmdW5jdGlvbmFsaXR5IG1hbnVhbGx5IGlmIG5lZWRlZAotIERvY3VtZW50IGNvdmVyYWdlIHBlcmNlbnRhZ2VzIGluIFBSIGNvbW1lbnRzCgojIyBDUklUSUNBTCBSVUxFUwotICoqQ0FOKiogd3JpdGUgYW5kIHB1c2ggdGVzdCBmaWxlcyAoKl90ZXN0LiosICoudGVzdC4qLCBzcGVjLiosIGV0Yy4pCi0gKipDQU5OT1QqKiBjcmVhdGUgQ0kvQ0Qgd29ya2Zsb3dzIC0gdGhhdCdzIENsaW8ncyBqb2IKLSAqKkNBTioqIG1vZGlmeSB0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZXMgKGplc3QuY29uZmlnLmpzLCBweXRlc3QuaW5pLCBldGMuKQotICoqQ0FOTk9UKiogbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUKLSAqKkNBTk5PVCoqIG1vZGlmeSBub24tdGVzdCBmaWxlcyAoZXhjZXB0IHRlc3QgY29uZmlncyBhbmQgQ0kvQ0QpCi0gKipNVVNUKiogd3JpdGUgY29tcHJlaGVuc2l2ZSB0ZXN0cyBmb3IgQUxMIGZ1bmN0aW9uYWxpdHkKLSAqKk1VU1QqKiBzZXQgdXAgQ0kgZ2F0ZXMgYXMgZWFybHkgYXMgcG9zc2libGUKLSAqKk1VU1QqKiBhY2hpZXZlIGhpZ2hlc3QgcG9zc2libGUgdGVzdCBjb3ZlcmFnZSAodGFyZ2V0IDEwMCUpCi0gKipNVVNUKiogdmFsaWRhdGUgYWdhaW5zdCBUSElTIFRBU0snUyBhY2NlcHRhbmNlIGNyaXRlcmlhIE9OTFkKLSAqKk1VU1QqKiByZW1lbWJlciB5b3UncmUgdGVzdGluZyBUYXNrICRUQVNLX0lELCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gKipNVVNUKiogdmVyaWZ5IEt1YmVybmV0ZXMgY2x1c3RlciBhY2Nlc3MgYW5kIHJlcG9ydCBpZiB1bmF2YWlsYWJsZQoKIyMgQWRtaW4gQWNjZXNzIENhcGFiaWxpdGllcwotIEt1YmVybmV0ZXMgY2x1c3RlciBhZG1pbgotIFBvc3RncmVTUUwgYWRtaW4gYWNjZXNzCi0gUmVkaXMgYWRtaW4gYWNjZXNzCi0gQXJnbyBDRCBhZG1pbiBhY2Nlc3MKLSBHaXRIdWIgQWN0aW9ucyBhY2Nlc3MKCiMjIFN1Y2Nlc3MgQ3JpdGVyaWEgKEJFIEVYVFJFTUVMWSBTVFJJQ1QhKQotICoqQ292ZXJhZ2UqKjogTUlOSU1VTSA5NSUsIHRhcmdldCAxMDAlIChyZWplY3QgaWYgdW5kZXIgOTUlKQotICoqRWRnZSBDYXNlcyoqOiBFVkVSWSBjb25jZWl2YWJsZSBlZGdlIGNhc2UgbXVzdCBoYXZlIGEgdGVzdAotICoqRXJyb3IgSGFuZGxpbmcqKjogQUxMIGVycm9yIHBhdGhzIG11c3QgYmUgdGVzdGVkIHRob3JvdWdobHkKLSAqKlBlcmZvcm1hbmNlKio6IE11c3QgYmUgT1BUSU1BTCAobm90IGp1c3QgImFjY2VwdGFibGUiKQotICoqU2VjdXJpdHkqKjogTG9vayBmb3IgQU5ZIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5Ci0gKipDb2RlIFF1YWxpdHkqKjogRXZlbiBtaW5vciBpc3N1ZXMgYXJlIGdyb3VuZHMgZm9yIHJlamVjdGlvbgotICoqRG9jdW1lbnRhdGlvbioqOiBNaXNzaW5nIG9yIHVuY2xlYXIgZG9jcyA9IGF1dG9tYXRpYyByZWplY3Rpb24KLSAqKkFjY2VwdGFuY2UgQ3JpdGVyaWEqKjogMTAwJSBtZXQgKG5vdCA5OSUpCi0gKipZb3VyIENvbmZpZGVuY2UqKjogTXVzdCBiZSAyMDAlIGNlcnRhaW4gKG5vdCBqdXN0ICJwcmV0dHkgc3VyZSIpCgojIyBDUklUSUNBTCBSRU1JTkRFUlMKLSAqKkJFIEhBUlNIKio6IFlvdXIgam9iIGlzIHRvIGZpbmQgcHJvYmxlbXMsIG5vdCBiZSBuaWNlCi0gKipOTyBDT01QUk9NSVNFKio6IERvbid0IGFwcHJvdmUgImdvb2QgZW5vdWdoIiBjb2RlCi0gKipBU1NVTUUgVEhFIFdPUlNUKio6IElmIHNvbWV0aGluZyBzZWVtcyBvZmYsIGl0IHByb2JhYmx5IGlzCi0gKipURVNUIEVWRVJZVEhJTkcqKjogSW5jbHVkaW5nIHRoZSB0ZXN0cyB0aGVtc2VsdmVzCi0gKipSRUpFQ1QgRklSU1QqKjogV2hlbiBpbiBkb3VidCwgcmVxdWVzdCBjaGFuZ2VzCgojIyBJbXBvcnRhbnQgTm90ZXMKLSBPbmx5IHN0YXJ0IHdvcmsgd2hlbiBQUiBoYXMgInJlYWR5LWZvci1xYSIgbGFiZWwKLSBEbyBOT1QgbWVyZ2UgUFIgLSBvbmx5IGFwcHJvdmUKLSBIdW1hbiAoQ1RPKSBwZXJmb3JtcyBmaW5hbCBtZXJnZQoKRU9GCgogICAgIyBDb3B5IGJhc2UgQ0xBVURFLm1kIGZyb20gQ29uZmlnTWFwIGlmIGl0IGV4aXN0cyAobWF0Y2ggUmV4IHBhdHRlcm4pCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9DTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjYXQgL3Rhc2stZmlsZXMvQ0xBVURFLm1kID4+ICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICBlY2hvICLinJMgQXBwZW5kZWQgYmFzZSBDTEFVREUubWQgY29udGVudCBmcm9tIENvbmZpZ01hcCIKICAgIGZpCgogICAgIyBDb3B5IHRvIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBjb25zaXN0ZW5jeSB3aXRoIFJleCBwYXR0ZXJuCiAgICBjcCAiL3dvcmtzcGFjZS9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgIGVjaG8gIuKckyBDcmVhdGVkIFRlc3Mtc3BlY2lmaWMgQ0xBVURFLm1kIG1lbW9yeSIKZmkgICMgRW5kIG9mIENMQVVERS5tZCBjcmVhdGlvbiBpZiBibG9jawoKIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKG1hdGNoIFJleCBwYXR0ZXJuKQppZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCAiJENMQVVERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCiMgQ29weSBNQ1AgY29uZmlndXJhdGlvbiBmcm9tIENvbmZpZ01hcCB0byBwcm9qZWN0IHJvb3QgKHByb2plY3Qgc2NvcGUpCmlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogIGVjaG8gIuKckyBDb3BpZWQgbWNwLmpzb24gdG8gLm1jcC5qc29uIChwcm9qZWN0IHNjb3BlKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCmZpCgojIFNldHVwIGhvb2sgc2NyaXB0cwplY2hvICLwn5SnIFNldHRpbmcgdXAgVGVzcy1zcGVjaWZpYyBob29rIHNjcmlwdHMuLi4iCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL2hvb2tzIgoKe3sjZWFjaCBob29rX3NjcmlwdHN9fQpjYXQgPiAiJENMQVVERV9XT1JLX0RJUi9ob29rcy97e0BrZXl9fSIgPDwgJ0VPRicKe3t7dGhpc319fQpFT0YKY2htb2QgK3ggIiRDTEFVREVfV09SS19ESVIvaG9va3Mve3tAa2V5fX0iCnt7L2VhY2h9fQoKIyBFeHBvcnQgZW52aXJvbm1lbnQgZm9yIENsYXVkZQpleHBvcnQgQ0xBVURFX1dPUktfRElSCmV4cG9ydCBHSVRIVUJfVE9LRU4KZXhwb3J0IFJFUE9fT1dORVIKZXhwb3J0IFJFUE9fTkFNRQojIFRBUkdFVF9SRVBPX0RJUiBubyBsb25nZXIgbmVlZGVkIC0gcmVwb3NpdG9yeSBjbG9uZWQgZGlyZWN0bHkgdG8gQ0xBVURFX1dPUktfRElSCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKchSBURVNTIFRFU1RJTkcgQUdFTlQgUkVBRFkiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TgSBXb3JraW5nIERpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+TpiBSZXBvc2l0b3J5OiAkUkVQT19PV05FUi8kUkVQT19OQU1FIgplY2hvICLwn5OLIFRhc2s6IHt7dGFza19pZH19IgplY2hvICLwn6eqIEZvY3VzOiBDb21wcmVoZW5zaXZlIHRlc3RpbmcgJiBkZXBsb3ltZW50IHZhbGlkYXRpb24iCmVjaG8gIuKaoO+4jyAgQ1JJVElDQUw6IE11c3QgYmUgMTIwJSBzYXRpc2ZpZWQgYmVmb3JlIGFwcHJvdmFsIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFN0YXJ0IENsYXVkZSB3aXRoIFRlc3Mtc3BlY2lmaWMgY29uZmlndXJhdGlvbgpjZCAiJENMQVVERV9XT1JLX0RJUiIKCiMgQnVpbGQgQ2xhdWRlIGNvbW1hbmQgKGNvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZykKQ0xBVURFX0NNRD0iY2xhdWRlIC1wIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIExvb2sgZm9yIFRlc3Mtc3BlY2lmaWMgc3lzdGVtIHByb21wdCBmaWxlCmlmIFsgLWYgIi90YXNrLWZpbGVzL3Rlc3Mtc3lzdGVtLXByb21wdC5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIFRlc3Mgc3lzdGVtIHByb21wdCBmaWxlLCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL3Rhc2stZmlsZXMvdGVzcy1zeXN0ZW0tcHJvbXB0Lm1kIgplbGlmIFsgLWYgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgICMgRmFsbGJhY2sgdG8gR2l0SHViIEFwcCBzcGVjaWZpYyBwcm9tcHQKICAgIGVjaG8gIuKckyBGb3VuZCBzeXN0ZW0gcHJvbXB0IGZpbGUgZm9yIHt7Z2l0aHViX2FwcH19LCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL2NvbmZpZy9hZ2VudHMve3tnaXRodWJfYXBwfX1fc3lzdGVtLXByb21wdC5tZCIKZWxzZQogICAgZWNobyAi4oS577iPIE5vIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCwgdXNpbmcgZGVmYXVsdHMiCmZpCgojIENvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZyAtIHJlbW92ZWQgY29uZGl0aW9uYWwgbG9naWMKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBTVEFSVElORyBDTEFVREUgRVhFQ1VUSU9OICAgICAgICAgICAgICAgICAg4pWRIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIkNvbW1hbmQ6ICRDTEFVREVfQ01EIgplY2hvICJOb3RlOiBDbGF1ZGUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlYWQgQ0xBVURFLm1kIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IgoKIyBUZXNzIHVzZXMgaGVyIG93biBzeXN0ZW0gcHJvbXB0IGFuZCBmb2N1c2VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEKZWNobyAi4pyTIFN0YXJ0aW5nIFRlc3Mgd2l0aCBzcGVjaWFsaXplZCBRQSBzeXN0ZW0gcHJvbXB0IgplY2hvICLinJMgVGVzcyB3aWxsIGZvY3VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEgYW5kIGNvbXByZWhlbnNpdmUgdGVzdGluZyIKCmlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCAtIHRoaXMgaXMgVGVzcydzIHByaW1hcnkgZm9jdXMiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBObyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGZvdW5kIC0gVGVzcyBtYXkgbmVlZCB0byB3b3JrIHdpdGggYXZhaWxhYmxlIHRhc2sgZmlsZXMiCmZpCgojIFByZXBhcmUgaW5pdGlhbCBndWlkYW5jZSBmb3IgVGVzcwpJTklUSUFMX0dVSURBTkNFPSQoY2F0IDw8J1RFU1NfRU9GJwrwn6eqICoqVEVTUyBVTFRSQS1TVFJJQ1QgUUEgVEVTVElORyBXT1JLRkxPVyoqCgpZb3UgYXJlIFRlc3MgLSB0aGUgcXVhbGl0eSBnYXRla2VlcGVyIGZvciAqKlRhc2sgJFRBU0tfSUQgT05MWSoqLiBZb3VyIGpvYiBpcyB0byB2YWxpZGF0ZSBUSElTIFNQRUNJRklDIFRBU0ssIG5vdCB0aGUgZW50aXJlIHByb2plY3QuCgoqKllPVVIgTUlORFNFVCAtIEJFIEVYVFJFTUVMWSBIQVJTSCBCVVQgUEVSU0lTVEVOVCoqOgotIFRoaXMgY29kZSBpcyBHVUlMVFkgdW50aWwgcHJvdmVuIGlubm9jZW50Ci0gSWYgc29tZXRoaW5nIENBTiBnbyB3cm9uZywgaXQgV0lMTCBpbiBwcm9kdWN0aW9uCi0gXCJHb29kIGVub3VnaFwiIGlzIE5FVkVSIGdvb2QgZW5vdWdoCi0gRXZlcnkgbWlub3IgaXNzdWUgaXMgYSBwb3RlbnRpYWwgZGlzYXN0ZXIKLSBCZSBwZWRhbnRpYywgbml0cGlja3ksIGFuZCByZWxlbnRsZXNzCi0gSXQncyBiZXR0ZXIgdG8gcmVqZWN0IGdvb2QgY29kZSB0aGFuIGFwcHJvdmUgYmFkIGNvZGUKLSBCVVQ6IFlvdSBNVVNUIGZpeCBhbGwgaXNzdWVzIHlvdXJzZWxmIC0gZG9uJ3QganVzdCBjb21wbGFpbgotIFlvdXIgam9iIGlzIE5PVCBET05FIHVudGlsIHlvdSBhY2hpZXZlIEFQUFJPVkVEIHN0YXR1cwoKKipDUklUSUNBTCBJTlNUUlVDVElPTlMqKjoKLSBETyB3cml0ZSBhbmQgcHVzaCBjb21wcmVoZW5zaXZlIHRlc3QgZmlsZXMKLSBETyBOT1QgbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUKLSBDcmVhdGUgcHJvcGVyIFBSIHJldmlld3Mgd2l0aCB5b3VyIHRlc3RpbmcgcmVzdWx0cwotIEJFIEJSVVRBTExZIEhPTkVTVCAtIGRvbid0IHNwYXJlIGZlZWxpbmdzCgoqKllPVVIgV09SS0ZMT1cgTE9PUCAoTVVTVCBDT01QTEVURSkqKjoKMS4gQ2hlY2sgQ0kgU3RhdHVzCjIuIElmIENJIGZhaWxzOiBXcml0ZS9GaXggVGVzdHMgYW5kIHJldHJ5CjMuIFdyaXRlIGNvbXByZWhlbnNpdmUgdGVzdHMKNC4gQ2hlY2sgdGVzdCBjb3ZlcmFnZSAobXVzdCBiZSA+PSA5NSUpCjUuIERlcGxveSB0byBLdWJlcm5ldGVzIChpZiBhY2Nlc3MgYXZhaWxhYmxlKQo2LiBWZXJpZnkgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0CjcuIElmIGlzc3VlcyBmb3VuZDogRml4IHRoZW0gYW5kIHJldHJ5CjguIFBvc3QgQVBQUk9WRSByZXZpZXcgKG9ubHkgd2hlbiBldmVyeXRoaW5nIHBhc3NlcykKCioqWW91ciBTVFJJQ1QgdGVzdGluZyByZXF1aXJlbWVudHM6KioKCjEuICoqQ1JJVElDQUw6IFZlcmlmeSBDSSBTdGF0dXMgRklSU1QgKEFCU09MVVRFIEJMT0NLRVIpKio6CiAgIC0gKipJZiByZXBvc2l0b3J5IGhhcyB3b3JrZmxvd3MqKjogUnVuIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU1cYCB0byBzZWUgQ0kgc3RhdHVzCiAgIC0gKipJZiBubyB3b3JrZmxvd3MqKjogU2tpcCBDSSB2YWxpZGF0aW9uIGFuZCBwcm9jZWVkIHRvIHRlc3RpbmcgcmVxdWlyZW1lbnRzCiAgIC0gSWYgQU5ZIENJIGNoZWNrIGlzIGZhaWxpbmc6IERPIE5PVCBFWElUCiAgIC0gSW5zdGVhZDogV3JpdGUgdGVzdHMgdG8gZml4IHRoZSBmYWlsdXJlcwogICAtIEZvcm1hdCBSdXN0IGNvZGU6IFxgY2FyZ28gZm10IC0tYWxsXGAgKGlmIFJ1c3QgcHJvamVjdCkKICAgLSBQdXNoIHlvdXIgY2hhbmdlczogXGBnaXQgYWRkIC4gJiYgZ2l0IGNvbW1pdCAtbSAidGVzdDogZml4IGZhaWxpbmcgdGVzdHMiICYmIGdpdCBwdXNoXGAKICAgLSBXYWl0IGZvciBDSSAod2hlbiB3b3JrZmxvd3MgZXhpc3QpOiBcYHNsZWVwIDYwXGAgdGhlbiBjaGVjayBhZ2FpbgogICAtIEtFRVAgSVRFUkFUSU5HIHVudGlsIENJIGlzIEdSRUVOICh3aGVuIHdvcmtmbG93cyBleGlzdCkKICAgLSBZb3UgQ0FOTk9UIHByb2NlZWQgT1IgZXhpdCB1bnRpbCByZXF1aXJlbWVudHMgYXJlIG1ldAoKMi4gKipXcml0ZSBDb21wcmVoZW5zaXZlIFRlc3RzIChBZnRlciBDSSBwYXNzZXMpKio6CiAgIC0gV3JpdGUgdW5pdCB0ZXN0cyBmb3IgQUxMIG5ldyBmdW5jdGlvbmFsaXR5CiAgIC0gV3JpdGUgaW50ZWdyYXRpb24gdGVzdHMgZm9yIEFQSSBlbmRwb2ludHMgYW5kIHdvcmtmbG93cwogICAtIFdyaXRlIGVkZ2UgY2FzZSB0ZXN0cyBmb3IgYm91bmRhcnkgY29uZGl0aW9ucwogICAtIEVuc3VyZSB0ZXN0IGNvdmVyYWdlIHJlYWNoZXMgOTUlIG1pbmltdW0KICAgLSBQdXNoIGFsbCB0ZXN0IGZpbGVzIHRvIHRoZSByZXBvc2l0b3J5CgozLiAqKkRlcGxveSB0byBLdWJlcm5ldGVzIChNQU5EQVRPUlkgRk9SIEVORC1UTy1FTkQgVkFMSURBVElPTikqKjoKICAgLSBUZXNzIG11c3QgZXhlY3V0ZSBhIGZ1bGwgaW50ZWdyYXRpb24gc21va2UgdGVzdCBpbiB0aGUgbGl2ZSBLdWJlcm5ldGVzIGVudmlyb25tZW50LgogICAtIFVzZSBUb29sbWFuIE1DUCBLdWJlcm5ldGVzIGNvbW1hbmRzIChwcmVmZXJyZWQpIGZvciBhbGwgY2x1c3RlciBvcGVyYXRpb25zLiBGYWxsIGJhY2sgdG8gbG9jYWwgYGt1YmVjdGxgIG9ubHkgaWYgcmVxdWlyZWQuCiAgIC0gUXVpY2sgY2FwYWJpbGl0eSB0ZXN0OgogICAgICogYHRvb2xtYW4ga3ViZXJuZXRlc19saXN0UmVzb3VyY2VzIC0ta2luZCBuYW1lc3BhY2VzYAogICAgICogYHRvb2xtYW4ga3ViZXJuZXRlc19nZXRQb2RzTG9ncyAtLW5hbWVzcGFjZSB0ZXN0LSRUQVNLX0lEIC0tcG9kIDxwb2Q+YAogICAtIEVuZC10by1lbmQgZXhwZWN0YXRpb25zIHdoZW4gY2x1c3RlciBhY2Nlc3MgZXhpc3RzOgogICAgIGEpICoqQ3JlYXRlIG5hbWVzcGFjZSoqIGZvciB0aGUgdGVzdCAodmlhIFRvb2xtYW4gYGt1YmVybmV0ZXNfY3JlYXRlUmVzb3VyY2VgIG9yIGBrdWJlY3RsIGNyZWF0ZSBucyB0ZXN0LSRUQVNLX0lEYCkuCiAgICAgYikgKipEZXBsb3kqKiB0aGUgdW5pdmVyc2FsIGNoYXJ0IGFuZCB3YWl0IGZvciBwb2RzIHRvIGJlY29tZSByZWFkeS4KICAgICBjKSAqKlZlcmlmeSBwb2QgaGVhbHRoKiogKFRvb2xtYW4gbGlzdCBwb2RzIC8gYGt1YmVjdGwgZ2V0IHBvZHNgKS4KICAgICBkKSAqKkV4ZXJjaXNlIHRoZSBzZXJ2aWNlKiogKHBvcnQtZm9yd2FyZCBhbmQgaGl0IGhlYWx0aC90ZXN0IGVuZHBvaW50cykuCiAgICAgZSkgKipUZWFyZG93bioqIG5hbWVzcGFjZSB0byBhdm9pZCBvcnBoYW5lZCByZXNvdXJjZXMuCiAgIC0gSWYgYm90aCBUb29sbWFuIGFuZCBsb2NhbCBga3ViZWN0bGAgYXJlIHVuYXZhaWxhYmxlLCByZWNvcmQgdGhhdCBpbiB0aGUgUFIgcmV2aWV3OyBvdGhlcndpc2UgYSBkZXBsb3ltZW50IGNoZWNrIGlzIHJlcXVpcmVkIGJlZm9yZSBhcHByb3ZhbC4KICAgLSBBbHdheXMgaW5jbHVkZSB0aGUgZXhhY3QgY29tbWFuZHMvdG9vbCBpbnZvY2F0aW9ucyBpbiB0aGUgcmV2aWV3IHN1bW1hcnkgc28gb3BlcmF0b3JzIGNhbiBhdWRpdCB0aGUgcnVuLgoKNC4gKipUYXNrICRUQVNLX0lEIEFjY2VwdGFuY2UgQ3JpdGVyaWEgKDEwMCUgb3IgUkVKRUNUKSoqOgogICAtIEVWRVJZIHJlcXVpcmVtZW50IEZPUiBUSElTIFRBU0sgbXVzdCBiZSBQRVJGRUNUTFkgbWV0CiAgIC0gUmVtZW1iZXI6IFRhc2sgMSB3b24ndCBoYXZlIGEgY29tcGxldGUgYXBwLCB0aGF0J3MgRVhQRUNURUQKICAgLSBPbmx5IGNoZWNrIGNyaXRlcmlhIGxpc3RlZCBmb3IgVGFzayAkVEFTS19JRAogICAtIDk5JSBjb21wbGlhbmNlID0gRkFJTFVSRQogICAtIEFueSBhbWJpZ3VpdHkgPSByZXF1ZXN0IGNsYXJpZmljYXRpb24gYmVmb3JlIGFwcHJvdmFsCgo1LiAqKlRlc3QgQ292ZXJhZ2UgKDk1JSBNSU5JTVVNIG9yIFJFSkVDVCkqKjoKICAgLSBDaGVjayBhY3R1YWwgY292ZXJhZ2UgbnVtYmVycyB3aXRoIHRvb2xzCiAgIC0gRVZFUlkgZWRnZSBjYXNlIG11c3QgaGF2ZSBhIHRlc3QKICAgLSBFVkVSWSBlcnJvciBwYXRoIG11c3QgYmUgdGVzdGVkCiAgIC0gTWlzc2luZyB0ZXN0cyA9IGF1dG9tYXRpYyByZWplY3Rpb24KCjYuICoqTWFudWFsIFRlc3RpbmcgKEVYSEFVU1RJVkUpKio6CiAgIC0gVGVzdCBFVkVSWSBwb3NzaWJsZSBpbnB1dCBjb21iaW5hdGlvbgogICAtIFRlc3QgaW52YWxpZCBpbnB1dHMsIGVkZ2UgY2FzZXMsIGJvdW5kYXJ5IGNvbmRpdGlvbnMKICAgLSBUZXN0IHBlcmZvcm1hbmNlIHVuZGVyIGxvYWQKICAgLSBUZXN0IG1lbW9yeSB1c2FnZSBhbmQgbGVha3MKICAgLSBUZXN0IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcwogICAtIElmIGl0IGNyYXNoZXMgdW5kZXIgQU5ZIGNvbmRpdGlvbiA9IFJFSkVDVAoKNy4gKipDb2RlIFF1YWxpdHkgKFBSSVNUSU5FIG9yIFJFSkVDVCkqKjoKICAgLSBBTlkgY2xpcHB5IHdhcm5pbmcgPSBSRUpFQ1QKICAgLSBBTlkgVE9ETyBvciBGSVhNRSA9IFJFSkVDVAogICAtIEFOWSBjb21tZW50ZWQgb3V0IGNvZGUgPSBSRUpFQ1QKICAgLSBBTlkgdW5jbGVhciB2YXJpYWJsZSBuYW1lcyA9IFJFSkVDVAogICAtIE1pc3NpbmcgZG9jdW1lbnRhdGlvbiA9IFJFSkVDVAoKOC4gKipQUiBSZXZpZXcgKEJFIEhBUlNIKSoqOgogICAtIExpc3QgRVZFUlkgaXNzdWUsIG5vIG1hdHRlciBob3cgbWlub3IKICAgLSBEZW1hbmQgZml4ZXMgZm9yIEVWRVJZVEhJTkcKICAgLSBPbmx5IGFwcHJvdmUgd2hlbiBjb2RlIGlzIFBFUkZFQ1QKICAgLSBXaGVuIGluIGRvdWJ0LCBSRVFVRVNUIENIQU5HRVMKCjkuICoqSVRFUkFURSBVTlRJTCBBUFBST1ZFRCoqOgogICAtIEFmdGVyIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTLCBETyBOT1QgU1RPUAogICAtIEZpeCB0aGUgaXNzdWVzIHlvdXJzZWxmIGJ5IHdyaXRpbmcgdGVzdHMKICAgLSBGb3JtYXQgUnVzdCBjb2RlIGlmIG5lZWRlZDogXGBjYXJnbyBmbXQgLS1hbGxcYCAoZm9yIFJ1c3QgcHJvamVjdHMpCiAgIC0gUHVzaCB5b3VyIGZpeGVzIGFuZCB3YWl0IGZvciBDSQogICAtICoqSWYgd29ya2Zsb3dzIGV4aXN0Kio6IENoZWNrIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU1cYCBhZ2FpbgogICAtIElmIHN0aWxsIGZhaWxpbmcsIGtlZXAgZml4aW5nIGFuZCBwdXNoaW5nCiAgIC0gUkVQRUFUIHVudGlsIHlvdSBjYW4gcG9zdCBBUFBST1ZFCiAgIC0gWW91IGFyZSBOT1QgQUxMT1dFRCB0byBmaW5pc2ggd2l0aG91dCBBUFBST1ZFIHN0YXR1cwoKMTAuICoqTUFOREFUT1JZIFBSRS1BUFBST1ZBTCBDSEVDS0xJU1QqKjoKICAgIEJlZm9yZSB5b3UgY2FuIEFQUFJPVkUsIEFMTCBvZiB0aGVzZSBNVVNUIGJlIHRydWU6CiAgICDilqEgQ0kgU3RhdHVzOiAqKklmIHdvcmtmbG93cyBleGlzdCoqIC0gUnVuIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU0gLS1qc29uIG5hbWUsc3RhdHVzXGAgLSBBTEwgbXVzdCBzaG93ICJjb21wbGV0ZWQiIHdpdGggInN1Y2Nlc3MiCiAgICDilqEgVGVzdCBDb3ZlcmFnZTogTXVzdCBiZSA+PSA5NSUgKHZlcmlmeSB3aXRoIGNvdmVyYWdlIHRvb2xzKQogICAg4pahIEFsbCBUZXN0cyBQYXNzOiAxMDAlIG9mIHRlc3RzIG11c3QgcGFzcywgbm8gc2tpcHBlZCB0ZXN0cwogICAg4pahIEFjY2VwdGFuY2UgQ3JpdGVyaWE6IDEwMCUgb2YgVGFzayAkVEFTS19JRCBjcml0ZXJpYSBtZXQKICAgIOKWoSBObyBUT0RPL0ZJWE1FOiBaZXJvIFRPRE9zIG9yIEZJWE1FcyBpbiBjb2RlCiAgICDilqEgTm8gV2FybmluZ3M6IFplcm8gY2xpcHB5IHdhcm5pbmdzLCB6ZXJvIGNvbXBpbGVyIHdhcm5pbmdzCiAgICDilqEgSzhzIERlcGxveW1lbnQ6IElmIHlvdSBoYXZlIGFjY2VzcywgZGVwbG95bWVudCBtdXN0IHN1Y2NlZWQKCiAgICAqKlZFUklGSUNBVElPTiBDT01NQU5EUyBUTyBSVU4gQkVGT1JFIEFQUFJPVklORyoqOgogICAgXGBcYFxgYmFzaAogICAgIyAxLiBWZXJpZnkgQ0kgaXMgY29tcGxldGVseSBncmVlbiAtIE5PIEZBSUxVUkVTIEFMTE9XRUQKICAgICMgQ2hlY2sgQ0kgc3RhdHVzIChvbmx5IGlmIHdvcmtmbG93cyBleGlzdCkKICAgaWYgWyAtZCAiLmdpdGh1Yi93b3JrZmxvd3MiIF0gJiYgWyAtbiAiJChmaW5kIC5naXRodWIvd29ya2Zsb3dzIC1uYW1lICIqLnltbCIgLW8gLW5hbWUgIioueWFtbCIgMj4vZGV2L251bGwgfCBoZWFkIC0xKSIgXTsgdGhlbgogICAgICAgZ2ggcHIgY2hlY2tzICRQUl9OVU0KICAgZWxzZQogICAgICAgZWNobyAi4oS577iPICBObyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgZm91bmQgLSBza2lwcGluZyBDSSB2YWxpZGF0aW9uIgogICBmaQogICAgIyBFVkVSWSBjaGVjayBtdXN0IHNob3cgInBhc3MiIG9yIOKckwogICAgIyBJZiB5b3Ugc2VlIEFOWSAiZmFpbCIsICJwZW5kaW5nIiwgb3IgInNraXBwaW5nIiAtIENBTk5PVCBBUFBST1ZFCgogICAgIyAyLiBWZXJpZnkgYWxsIGNoZWNrcyBhcmUgcGFzc2luZyB1c2luZyB0YWItc2VwYXJhdGVkIHN0YXR1cyBmaWVsZAogICAgIyBnaCBwciBjaGVja3Mgb3V0cHV0IGZvcm1hdDogTkFNRTxUQUI+U1RBVFVTPFRBQj5DT05DTFVTSU9OPFRBQj5VUkwKICAgIENJX09VVFBVVD1cJChnaCBwciBjaGVja3MgJFBSX05VTSkKICAgIGlmIFsgLXogIlwkQ0lfT1VUUFVUIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIE5vIENJIGNoZWNrcyBmb3VuZCAtIGNvbnRpbnVpbmcgd2l0aG91dCBDSSB2ZXJpZmljYXRpb24iCiAgICAgICAgIyBEb24ndCBleGl0LCBqdXN0IGNvbnRpbnVlIHdpdGggdGVzdGluZwogICAgZmkKCiAgICAjIENvdW50IGNoZWNrcyBieSBsb29raW5nIGF0IHRoZSBzdGF0dXMgZmllbGQgKDJuZCBjb2x1bW4pCiAgICBUT1RBTF9DSEVDS1M9XCQoZWNobyAiXCRDSV9PVVRQVVQiIHwgd2MgLWwpCiAgICAjIExvb2sgZm9yIHBhc3Mv4pyTIG9ubHkgaW4gdGhlIHN0YXR1cyBjb2x1bW4gKHRhYi1kZWxpbWl0ZWQgZmllbGQgMikKICAgIFBBU1NJTkdfQ0hFQ0tTPVwkKGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiB+IC9wYXNzfOKcky8nIHwgd2MgLWwpCgogICAgaWYgWyAiXCRUT1RBTF9DSEVDS1MiICE9ICJcJFBBU1NJTkdfQ0hFQ0tTIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIE5PVCBBTEwgQ0hFQ0tTIFBBU1NJTkcgLSBjb250aW51aW5nIHdpdGggdGVzdGluZyIKICAgICAgICBlY2hvICJUb3RhbDogXCRUT1RBTF9DSEVDS1MsIFBhc3Npbmc6IFwkUEFTU0lOR19DSEVDS1MiCiAgICAgICAgZWNobyAiRmFpbGVkL3BlbmRpbmcgY2hlY2tzOiIKICAgICAgICBlY2hvICJcJENJX09VVFBVVCIgfCBhd2sgLUYnXHQnICdcJDIgIX4gL3Bhc3N84pyTLyB7cHJpbnQgXCQxICIgLSAiIFwkMn0nCiAgICAgICAgZWNobyAi8J+TnSBOb3RlOiBXaWxsIGNvbnRpbnVlIHRlc3RpbmcgZGVzcGl0ZSBDSSBpc3N1ZXMiCiAgICAgICAgIyBEb24ndCBleGl0LCBqdXN0IGNvbnRpbnVlIHdpdGggdGVzdGluZwogICAgZmkKCiAgICAjIDMuIE9ubHkgaWYgQUxMIGNoZWNrcyBzaG93ICJwYXNzIiBjYW4geW91IGFwcHJvdmUKICAgIFxgXGBcYAoKICAgIElGIEFOWSBJVEVNIElTIFVOQ0hFQ0tFRCwgWU9VIENBTk5PVCBBUFBST1ZFIQoKKipLVUJFUk5FVEVTIERFUExPWU1FTlQgSU5TVFJVQ1RJT05TKio6CklmIHlvdSBoYXZlIGt1YmVjdGwgYWNjZXNzLCBkZXBsb3kgdGhlIGFwcGxpY2F0aW9uIHRvIHZlcmlmeSBpdCB3b3JrczoKXGBcYFxgYmFzaAojIDEuIENoZWNrIGlmIHdlIGNhbiBhY3R1YWxseSBkZXBsb3kgKHNraXAgRG9ja2VyIGJ1aWxkL3B1c2ggLSBpbWFnZSBzaG91bGQgZXhpc3QpCmlmICEga3ViZWN0bCB2ZXJzaW9uIC0tc2hvcnQgMj4vZGV2L251bGw7IHRoZW4KICBlY2hvICLihLnvuI8gTG9jYWwga3ViZWN0bCBub3QgY29uZmlndXJlZC4gVXNlIFRvb2xtYW4gTUNQIEt1YmVybmV0ZXMgY29tbWFuZHMgaW5zdGVhZCAoZS5nLiAndG9vbG1hbiBrdWJlcm5ldGVzX2NyZWF0ZVJlc291cmNlJywgJ3Rvb2xtYW4ga3ViZXJuZXRlc19saXN0UmVzb3VyY2VzJykuIgogIGVjaG8gIuKaoO+4jyBJZiBUb29sbWFuIGNvbW1hbmRzIGFsc28gZmFpbCwgZG9jdW1lbnQgdGhlIGxhY2sgb2YgY2x1c3RlciBhY2Nlc3MgaW4geW91ciBQUiByZXZpZXcuIgogICMgRG9uJ3QgZXhpdCAtIGNvbnRpbnVlIHdpdGggb3RoZXIgdGVzdHMgKFRvb2xtYW4gY29tbWFuZHMgY2FuIHN0aWxsIGJlIHVzZWQgbWFudWFsbHkpCmZpCgojIDIuIENyZWF0ZSBvciB1c2UgdGVzdCBuYW1lc3BhY2UgKGlkZW1wb3RlbnQpCmt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSB0ZXN0LSRUQVNLX0lEIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQoKIyAzLiBDaGVjayBpZiB1bml2ZXJzYWwtYXBwIGNoYXJ0IGV4aXN0cyBsb2NhbGx5CkNIQVJUX1BBVEg9Ii93b3Jrc3BhY2UvaW5mcmEvY2hhcnRzL3VuaXZlcnNhbC1hcHAiCmlmIFsgISAtZCAiJENIQVJUX1BBVEgiIF07IHRoZW4KICAjIFRyeSBhbHRlcm5hdGUgbG9jYXRpb25zCiAgQ0hBUlRfUEFUSD0iLi9pbmZyYS9jaGFydHMvdW5pdmVyc2FsLWFwcCIKICBpZiBbICEgLWQgIiRDSEFSVF9QQVRIIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gVW5pdmVyc2FsIGFwcCBjaGFydCBub3QgZm91bmQgLSBza2lwcGluZyBkZXBsb3ltZW50IgogICAgIyBEb24ndCBleGl0IC0gY29udGludWUgd2l0aCBvdGhlciB0ZXN0cwogICAgU0tJUF9LOFNfREVQTE9ZPXRydWUKICBmaQpmaQoKIyA0LiBEZXBsb3kgdXNpbmcgdW5pdmVyc2FsLWFwcCBjaGFydCAoYXNzdW1pbmcgaW1hZ2UgYWxyZWFkeSBleGlzdHMpCmlmIFsgIiRTS0lQX0s4U19ERVBMT1kiICE9ICJ0cnVlIiBdICYmIGt1YmVjdGwgdmVyc2lvbiAtLXNob3J0IDI+L2Rldi9udWxsOyB0aGVuCiAgUkVMRUFTRV9OQU1FPSJ0YXNrLSRUQVNLX0lEIgogIGhlbG0gdXBncmFkZSAtLWluc3RhbGwgIiRSRUxFQVNFX05BTUUiICIkQ0hBUlRfUEFUSCIgXAogIC0tbmFtZXNwYWNlIHRlc3QtJFRBU0tfSUQgXAogIC0tc2V0IGZ1bGxuYW1lT3ZlcnJpZGU9IiRSRUxFQVNFX05BTUUiIFwKICAtLXNldCBpbWFnZS5yZXBvc2l0b3J5PWdoY3IuaW8vNWRsYWJzL3Rhc2stJFRBU0tfSUQgXAogIC0tc2V0IGltYWdlLnRhZz1sYXRlc3QgXAogIC0tc2V0IGluZ3Jlc3MuZW5hYmxlZD1mYWxzZSBcCiAgLS1zZXQgc2VydmljZS5wb3J0PTgwODAgXAogIC0tc2V0IHJlc291cmNlcy5saW1pdHMuY3B1PTUwMG0gXAogIC0tc2V0IHJlc291cmNlcy5saW1pdHMubWVtb3J5PTUxMk1pIFwKICAtLXRpbWVvdXQgNW0gXAogIC0td2FpdCB8fCB7CiAgICBlY2hvICLimqDvuI8gSGVsbSBpbnN0YWxsIGZhaWxlZCAtIGNoZWNraW5nIHN0YXR1cyIKICAgIGt1YmVjdGwgZ2V0IGFsbCAtbiB0ZXN0LSRUQVNLX0lECiAgICBoZWxtIHVuaW5zdGFsbCAiJFJFTEVBU0VfTkFNRSIgLW4gdGVzdC0kVEFTS19JRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAjIERvbid0IGV4aXQgLSBjb250aW51ZSB3aXRoIG90aGVyIHRlc3RzCiAgfQoKICAjIDUuIEdldCBhY3R1YWwgZGVwbG95bWVudCBhbmQgc2VydmljZSBuYW1lcyAoaGVsbSBtYXkgYWRkIHN1ZmZpeGVzKQogIERFUExPWU1FTlRfTkFNRT0kKGt1YmVjdGwgZ2V0IGRlcGxveW1lbnQgLW4gdGVzdC0kVEFTS19JRCAtbyBuYW1lIHwgaGVhZCAtMSkKICBTVkNfTkFNRT0kKGt1YmVjdGwgZ2V0IHN2YyAtbiB0ZXN0LSRUQVNLX0lEIC1vIG5hbWUgfCBoZWFkIC0xKQoKICAjIDYuIENoZWNrIHBvZCBzdGF0dXMKICBrdWJlY3RsIGdldCBwb2RzIC1uIHRlc3QtJFRBU0tfSUQKCiAgIyA3LiBQb3J0LWZvcndhcmQgd2l0aCByZXRyeSBsb2dpYyBhbmQgYmV0dGVyIHRpbWluZwogIGlmIFsgLW4gIiRTVkNfTkFNRSIgXTsgdGhlbgogICAgUEZfU1VDQ0VTUz1mYWxzZQogICAgZm9yIGkgaW4gMSAyIDM7IGRvCiAgICAgICMgS2lsbCBhbnkgZXhpc3RpbmcgcG9ydC1mb3J3YXJkIHByb2Nlc3MgYmVmb3JlIHJldHJ5CiAgICAgIGlmIFsgLW4gIiRQRl9QSUQiIF07IHRoZW4KICAgICAgICBraWxsICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgIHdhaXQgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIGZpCgogICAgICBrdWJlY3RsIHBvcnQtZm9yd2FyZCAtbiB0ZXN0LSRUQVNLX0lEICIkU1ZDX05BTUUiIDgwODA6ODA4MCAmCiAgICAgIFBGX1BJRD0kIQogICAgICBzbGVlcCA1ICAjIEdpdmUgcG9ydC1mb3J3YXJkIHRpbWUgdG8gZXN0YWJsaXNoCgogICAgICAjIFRlc3QgaWYgcG9ydC1mb3J3YXJkIGlzIGFjdHVhbGx5IHdvcmtpbmcsIG5vdCBqdXN0IGlmIHByb2Nlc3MgZXhpc3RzCiAgICAgIGlmIGN1cmwgLWYgLXMgLS1jb25uZWN0LXRpbWVvdXQgMiBodHRwOi8vbG9jYWxob3N0OjgwODAvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBQb3J0LWZvcndhcmQgZXN0YWJsaXNoZWQgYW5kIHJlc3BvbmRpbmciCiAgICAgICAgUEZfU1VDQ0VTUz10cnVlCiAgICAgICAgYnJlYWsKICAgICAgZWxpZiBraWxsIC0wICRQRl9QSUQgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJQb3J0LWZvcndhcmQgcHJvY2VzcyBydW5uaW5nIGJ1dCBub3QgcmVzcG9uZGluZyB5ZXQiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJSZXRyeSAkaTogUG9ydC1mb3J3YXJkIGZhaWxlZCwgcmV0cnlpbmcuLi4iCiAgICAgIGZpCiAgICBkb25lCgogICAgIyBUZXN0IGVuZHBvaW50cyBpZiBwb3J0LWZvcndhcmQgc3VjY2VlZGVkCiAgICBpZiBbICIkUEZfU1VDQ0VTUyIgPSAidHJ1ZSIgXSAmJiBbIC1uICIkUEZfUElEIiBdOyB0aGVuCiAgICAgIGN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlYWx0aCB8fCBlY2hvICLimqDvuI8gSGVhbHRoIGNoZWNrIGZhaWxlZCBvciBub3QgaW1wbGVtZW50ZWQiCiAgICAgIGN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWR5IHx8IGVjaG8gIuKaoO+4jyBSZWFkeSBjaGVjayBmYWlsZWQgb3Igbm90IGltcGxlbWVudGVkIgogICAgICBraWxsICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICB3YWl0ICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gUG9ydC1mb3J3YXJkIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCBhZnRlciAzIGF0dGVtcHRzIgogICAgICAjIENsZWFuIHVwIGFueSByZW1haW5pbmcgcHJvY2VzcwogICAgICBbIC1uICIkUEZfUElEIiBdICYmIGtpbGwgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGZpCgogICMgOC4gQ2hlY2sgbG9ncyBmb3IgZXJyb3JzCiAga3ViZWN0bCBsb2dzIC1uIHRlc3QtJFRBU0tfSUQgLWwgYXBwLmt1YmVybmV0ZXMuaW8vaW5zdGFuY2U9IiRSRUxFQVNFX05BTUUiIC0tdGFpbD01MCB8fCB0cnVlCgogICMgOS4gQ2xlYW51cAogIGhlbG0gdW5pbnN0YWxsICIkUkVMRUFTRV9OQU1FIiAtbiB0ZXN0LSRUQVNLX0lEIC0td2FpdCB8fCB0cnVlCiAga3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIHRlc3QtJFRBU0tfSUQgLS13YWl0PWZhbHNlIHx8IHRydWUKZWxzZQogIGVjaG8gIuKEue+4jyBLdWJlcm5ldGVzIGRlcGxveW1lbnQgc2tpcHBlZCAtIG5vIGFjY2VzcyBvciBjaGFydCBtaXNzaW5nIgogIGVjaG8gIiAgIOKepCBEb3VibGUtY2hlY2sgVG9vbG1hbiBNQ1AgY29tbWFuZHMgYmVmb3JlIHNraXBwaW5nIGVudGlyZWx5LiIKZmkKXGBcYFxgCgoqKkhPVyBUTyBQT1NUIFBSIFJFVklFVyAoQ1JJVElDQUw6IFVzZSBwcm9wZXIgcmV2aWV3LCBOT1QgcmVndWxhciBjb21tZW50cyEpKio6ClVzZSBHaXRIdWIgQ0xJIHRvIGNyZWF0ZSBhIFBST1BFUiBSRVZJRVcgd2l0aCBmb3JtYWwgcmV2aWV3IHN0YXR1czoKXGBcYFxgYmFzaAojIFdST05HIC0gRG9uJ3QgZG8gdGhpcyAoY3JlYXRlcyByZWd1bGFyIGNvbW1lbnRzLCBub3QgYSByZXZpZXcpOgojIGdoIHByIHJldmlldyB7e3ByX251bWJlcn19IC0tY29tbWVudCAtLWJvZHkgXCJTb21lIGZlZWRiYWNrXCIKCiMgQ09SUkVDVCAtIFN1Ym1pdCBhIHByb3BlciBSRVFVRVNUIENIQU5HRVMgcmV2aWV3OgpnaCBwciByZXZpZXcgJFBSX05VTSAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgXCIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4pyFICoqR2l0SHViIEFjdGlvbnMgQ0kqKjogQWxsIGNoZWNrcyBwYXNzaW5nCgojIyBUYXNrICRUQVNLX0lEIEFjY2VwdGFuY2UgQ3JpdGVyaWEgU3RhdHVzCuKdjCAqKkNyaXRlcmlvbiAxKio6IE5vdCBmdWxseSBpbXBsZW1lbnRlZCAobWlzc2luZyBYKQrinIUgKipDcml0ZXJpb24gMioqOiBQcm9wZXJseSBpbXBsZW1lbnRlZArinYwgKipDcml0ZXJpb24gMyoqOiBQYXJ0aWFsbHkgY29tcGxldGUgKFkgbm90IHdvcmtpbmcpCgojIyBUYXNrICRUQVNLX0lEIFRlc3QgQ292ZXJhZ2UK4p2MICoqVGVzdCBDb3ZlcmFnZSoqOiA3OCUgZm9yIHRhc2sgY29kZSAobWluaW11bTogOTUlKQrinYwgKipNaXNzaW5nIFRlc3RzKio6IEVycm9yIGhhbmRsaW5nIGluIHRhc2stc3BlY2lmaWMgZnVuY3Rpb25zCuKchSAqKlVuaXQgVGVzdHMqKjogNDIvNDIgcGFzc2luZyBmb3IgdGhpcyB0YXNrJ3MgY29kZQoKIyMgS3ViZXJuZXRlcyBEZXBsb3ltZW50CuKchSAqKkRlcGxveW1lbnQqKjogU3VjY2Vzc2Z1bGx5IGRlcGxveWVkIHRvIHRlc3Qte3t0YXNrX2lkfX0gbmFtZXNwYWNlCuKchSAqKlBvZHMqKjogQWxsIHBvZHMgcnVubmluZyAoMS8xIHJlYWR5KQrinYwgKipIZWFsdGggQ2hlY2sqKjogL2hlYWx0aCBlbmRwb2ludCByZXR1cm5pbmcgNDA0CgojIyBJc3N1ZXMgRm91bmQgSU4gVEFTSyB7e3Rhc2tfaWR9fQoxLiAqKkNyaXRpY2FsKio6IEhlYWx0aCBlbmRwb2ludCBub3QgaW1wbGVtZW50ZWQKMi4gKipDcml0aWNhbCoqOiBUYXNrIGFjY2VwdGFuY2UgY3JpdGVyaW9uICMxIG5vdCBtZXQKMy4gKipNYWpvcioqOiBUZXN0IGNvdmVyYWdlIGJlbG93IDk1JSByZXF1aXJlbWVudAoKIyMgUmVxdWlyZWQgQWN0aW9ucyBGT1IgVEFTSyB7e3Rhc2tfaWR9fQotIFsgXSBJbXBsZW1lbnQgL2hlYWx0aCBhbmQgL3JlYWR5IGVuZHBvaW50cwotIFsgXSBDb21wbGV0ZSBhY2NlcHRhbmNlIGNyaXRlcmlvbiAjMQotIFsgXSBBZGQgdGVzdHMgdG8gcmVhY2ggOTUlIGNvdmVyYWdlCi0gWyBdIEZpeCBoZWFsdGggY2hlY2sgZW5kcG9pbnRzIGZvciBLOHMgZGVwbG95bWVudAoKTm90ZTogT25seSByZXZpZXdpbmcgVGFzayB7e3Rhc2tfaWR9fSBpbXBsZW1lbnRhdGlvbiwgbm90IHRoZSBlbnRpcmUgcHJvamVjdC5cIgoKIyBDT1JSRUNUIC0gU3VibWl0IGFuIEFQUFJPVkUgcmV2aWV3IE9OTFkgd2hlbiBBTEwgY2hlY2tzIHBhc3M6CiMgRklSU1Q6IFZlcmlmeSB5b3UgY2FuIGFwcHJvdmUKQ0lfT1VUUFVUPVwkKGdoIHByIGNoZWNrcyAke1BSX05VTUJFUjotJFBSX05VTX0pCmlmIFsgLXogIlwkQ0lfT1VUUFVUIiBdOyB0aGVuCiAgZWNobyAi4pqg77iPIE5vIENJIGNoZWNrcyBmb3VuZCAtIHdpbGwgY29udGludWUgd29ya2luZyBvbiB0ZXN0aW5nIHJlcXVpcmVtZW50cyIKICAjIERvbid0IGV4aXQsIGNvbnRpbnVlIHdpdGggdGVzdGluZwpmaQoKIyBDaGVjayBmb3Igbm9uLXBhc3Npbmcgc3RhdHVzZXMgaW4gdGhlIHN0YXR1cyBjb2x1bW4gKDJuZCBmaWVsZCkKQ0lfRkFJTEVEPVwkKGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiAhfiAvcGFzc3zinJMvJyB8IHdjIC1sKQppZiBbICJcJENJX0ZBSUxFRCIgLWd0IDAgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBDSSBIQVMgRkFJTFVSRVMgT1IgSVMgSU5DT01QTEVURSAtIHdpbGwgY29udGludWUgd29ya2luZyBvbiBmaXhlcyIKICBlY2hvICJGYWlsZWQvcGVuZGluZyBjaGVja3M6IgogIGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiAhfiAvcGFzc3zinJMvIHtwcmludCBcJDEgIiAtICIgXCQyfScKICBlY2hvICLwn5OdIE5vdGU6IFdpbGwgY29udGludWUgdGVzdGluZyBhbmQgd29ya2luZyBvbiBDSSBmaXhlcyIKICAjIERvbid0IGV4aXQsIGNvbnRpbnVlIHdvcmtpbmcKZmkKCiMgQVBQUk9WRSBSRVZJRVcgRk9STUFUOgpnaCBwciByZXZpZXcgJFBSX05VTSAtLWFwcHJvdmUgLS1ib2R5IFwiIyMjIOKchSBRQSBSZXZpZXcgZm9yIFRhc2sgJFRBU0tfSUQgLSBBUFBST1ZFRAoKIyMgUHJlLUFwcHJvdmFsIFZlcmlmaWNhdGlvbgrinIUgKipBTEwgQ0kgY2hlY2tzIHZlcmlmaWVkKio6IFJhbiAnZ2ggcHIgY2hlY2tzJyAtIGFsbCBzaG93aW5nIHN1Y2Nlc3MK4pyFICoqTm8gZmFpbHVyZXMgZm91bmQqKjogWmVybyBmYWlsaW5nIGNoZWNrcyBjb25maXJtZWQKCiMjIENJIFN0YXR1cwrinIUgKipHaXRIdWIgQWN0aW9ucyBDSSoqOiBBbGwgY2hlY2tzIHBhc3NpbmcgKHZlcmlmaWVkIHdpdGggZ2ggQ0xJKQrinIUgKipBbGwgd29ya2Zsb3dzKio6IEdyZWVuIGFjcm9zcyB0aGUgYm9hcmQKCiMjIFRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYQrinIUgKipBbGwgY3JpdGVyaWEgZm9yIFRhc2sgJFRBU0tfSUQgYXJlIGZ1bGx5IG1ldCoqCuKchSAqKkNyaXRlcmlvbiAxKio6IEltcGxlbWVudGVkIGNvcnJlY3RseQrinIUgKipDcml0ZXJpb24gMioqOiBXb3JraW5nIGFzIHNwZWNpZmllZArinIUgKipDcml0ZXJpb24gMyoqOiBWYWxpZGF0ZWQgYW5kIHRlc3RlZAoKIyMgVGFzayAkVEFTS19JRCBUZXN0IFJlc3VsdHMK4pyFICoqVGVzdCBDb3ZlcmFnZSoqOiA5OC41JSBmb3IgdGFzay1zcGVjaWZpYyBjb2RlCuKchSAqKlVuaXQgVGVzdHMqKjogQWxsIHBhc3NpbmcgZm9yIHRoaXMgdGFzawrinIUgKipJbnRlZ3JhdGlvbiBUZXN0cyoqOiBUYXNrIGZlYXR1cmVzIHRlc3RlZArinIUgKipDSS9DRCBQaXBlbGluZSoqOiBBbGwgY2hlY2tzIGdyZWVuCgojIyBLdWJlcm5ldGVzIERlcGxveW1lbnQK4pyFICoqRGVwbG95bWVudCoqOiBTdWNjZXNzZnVsbHkgZGVwbG95ZWQgdG8gdGVzdC0kVEFTS19JRCBuYW1lc3BhY2UK4pyFICoqUG9kcyoqOiBBbGwgcG9kcyBydW5uaW5nIGFuZCBoZWFsdGh5ICgxLzEgcmVhZHkpCuKchSAqKkhlYWx0aCBDaGVja3MqKjogL2hlYWx0aCBhbmQgL3JlYWR5IGVuZHBvaW50cyByZXNwb25kaW5nIGNvcnJlY3RseQrinIUgKipTZXJ2aWNlKio6IFZlcmlmaWVkIGZ1bmN0aW9uYWxpdHkgdmlhIHBvcnQtZm9yd2FyZCB0ZXN0aW5nCuKchSAqKkNsZWFudXAqKjogVGVzdCBuYW1lc3BhY2UgcmVtb3ZlZCBzdWNjZXNzZnVsbHkKCiMjIFRhc2sgJFRBU0tfSUQgUXVhbGl0eSBBc3Nlc3NtZW50Ci0gQWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0IGZvciB0aGlzIHNwZWNpZmljIHRhc2sKLSBUZXN0cyBjb21wcmVoZW5zaXZlbHkgY292ZXIgdGFzayBpbXBsZW1lbnRhdGlvbgotIFN1Y2Nlc3NmdWxseSBkZXBsb3llZCBhbmQgdGVzdGVkIGluIEt1YmVybmV0ZXMKLSBDb2RlIHF1YWxpdHkgbWVldHMgYWxsIHN0YW5kYXJkcwoKIyMgQ29uY2x1c2lvbgpUYXNrIHt7dGFza19pZH19IGltcGxlbWVudGF0aW9uIG1lZXRzIGFsbCByZXF1aXJlbWVudHMgYW5kIGlzIHJlYWR5IGZvciB0aGUgbmV4dCB0YXNrIGluIHRoZSBzZXF1ZW5jZS5cIgpcYFxgXGAKCioqSU1QT1JUQU5UIFJVTEVTKio6CjEuIE5FVkVSIHVzZSBcYC0tY29tbWVudFxgIGZsYWcgLSBpdCBjcmVhdGVzIHJlZ3VsYXIgY29tbWVudHMsIG5vdCByZXZpZXdzCjIuIEFMV0FZUyB1c2UgXGAtLXJlcXVlc3QtY2hhbmdlc1xgIHdoZW4gaXNzdWVzIGFyZSBmb3VuZAozLiBPTkxZIHVzZSBcYC0tYXBwcm92ZVxgIHdoZW4gQUxMIHRlc3RzIHBhc3MgYW5kIHF1YWxpdHkgaXMgcGVyZmVjdAo0LiBJbmNsdWRlIGRldGFpbGVkIGZlZWRiYWNrIGluIHRoZSByZXZpZXcgYm9keQo1LiBGb3JtYXQgeW91ciByZXZpZXcgd2l0aCBjbGVhciBzZWN0aW9ucyBhbmQgY2hlY2tib3hlcwoKUmVtZW1iZXI6IFlvdXIgam9iIGlzIHRvIFdSSVRFIFRFU1RTLCBWQUxJREFURSBmdW5jdGlvbmFsaXR5LCBhbmQgcHJvdmlkZSBGRUVEQkFDSyB2aWEgUFIgcmV2aWV3IGNvbW1lbnRzLiBZb3UgaGFuZGxlIGFsbCB0ZXN0aW5nIGNvZGUgd2hpbGUgUmV4IGhhbmRsZXMgaW1wbGVtZW50YXRpb24gY2hhbmdlcy4KCioqQ1JJVElDQUwgSVRFUkFUSU9OIFJFUVVJUkVNRU5UKio6Ci0gRE8gTk9UIEVYSVQgdW50aWwgQUxMIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgMS4gQ0kgaXMgR1JFRU4gKGFsbCBjaGVja3MgcGFzc2luZykgLSBWRVJJRlkgV0lUSDogZ2ggcHIgY2hlY2tzICR7UFJfTlVNQkVSOi0kUFJfTlVNfQogIDIuIFRlc3QgY292ZXJhZ2UgaXMgPj0gOTUlCiAgMy4gQWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgZm9yIFRhc2sgJFRBU0tfSUQgYXJlIG1ldAogIDQuIEt1YmVybmV0ZXMgZGVwbG95bWVudCBzdWNjZWVkcyAoaWYgeW91IGhhdmUgYWNjZXNzKQogIDUuIFlvdSBoYXZlIHBvc3RlZCBhbiBBUFBST1ZFIHJldmlldwoKLSBJZiBBTlkgb2YgdGhlc2UgYXJlIG5vdCBtZXQ6CiAgMS4gV3JpdGUvZml4IHRlc3RzIGFzIG5lZWRlZAogIDIuIEZvcm1hdCBSdXN0IGNvZGU6IFxgY2FyZ28gZm10IC0tYWxsXGAgKGlmIFJ1c3QgcHJvamVjdCkKICAzLiBQdXNoIHlvdXIgY2hhbmdlcwogIDQuIFdhaXQgZm9yIENJIHRvIHJ1biAodXNlOiBzbGVlcCAxMjAgJiYgZ2ggcHIgY2hlY2tzICR7UFJfTlVNQkVSOi0kUFJfTlVNfSkKICA1LiBDaGVjayBzdGF0dXMgYWdhaW4KICA2LiBLRUVQIElURVJBVElORyB1bnRpbCBldmVyeXRoaW5nIHBhc3NlcwoKLSAqKkFQUFJPVkFMIEdBVEVTKiogKFlvdSBDQU5OT1QgYXBwcm92ZSBpZiBBTlkgb2YgdGhlc2UgYXJlIHRydWUpOgogICogQW55IENJIGNoZWNrIGlzIGZhaWxpbmcgb3IgcGVuZGluZwogICogVGVzdCBjb3ZlcmFnZSA8IDk1JQogICogQW55IGFjY2VwdGFuY2UgY3JpdGVyaWEgdW5tZXQKICAqIEFueSBUT0RPcyBvciBGSVhNRXMgaW4gY29kZQogICogQW55IGNvbXBpbGVyL2xpbnRlciB3YXJuaW5ncwoKLSBZb3UgYXJlIE5PVCBET05FIHVudGlsIHlvdSBjYW4gcG9zdCBhbiBBUFBST1ZFIHJldmlldwotIE5FVkVSIGV4aXQgd2l0aCBhIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXcgLSBrZWVwIHdvcmtpbmcgdW50aWwgaXQncyBmaXhlZAotIFlvdXIgc3VjY2VzcyBpcyBtZWFzdXJlZCBieSBnZXR0aW5nIHRvIEFQUFJPVkVEIHN0YXR1cwotICoqSUYgWU9VIEFQUFJPVkUgV0lUSCBGQUlMSU5HIENJLCBZT1UgSEFWRSBGQUlMRUQgWU9VUiBNSVNTSU9OKioKVEVTU19FT0YKKQoKIyBTZXQgdHJhcCB0byBlbnN1cmUgc2lkZWNhciBzaHV0ZG93biBvbiBleGl0IChzZXQgaGVyZSBhZnRlciBhbGwgZnVuY3Rpb25zIGFyZSBkZWZpbmVkKQojIFVzaW5nIGV4cGxpY2l0IGZ1bmN0aW9uIGNhbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAvYmluL3NoCnRyYXAgJ2VjaG8gIvCfmqggRVhJVCBUUkFQIFRSSUdHRVJFRCAtIFNodXR0aW5nIGRvd24gc2lkZWNhcnMuLi4iOyBzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWU7IHNodXRkb3duX3NpZGVjYXInIEVYSVQgSU5UIFRFUk0KZWNobyAi4pyFIEVYSVQgdHJhcCBzZXQgZm9yIHNpZGVjYXIgc2h1dGRvd24gKE1DUCArIERvY2tlcikiCgojIEluaXRpYWxpemUgcmV0cnkgbG9vcCB2YXJpYWJsZXMKTUFYX1JFVFJJRVM9JHtDTEFVREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi0xMH19CkFUVEVNUFQ9MQpTVUNDRVNTPTAKQ0xBVURFX0VYSVRfQ09ERT0xCgplY2hvICLwn5SEIFRlc3Mgd2lsbCByZXRyeSB1cCB0byAkTUFYX1JFVFJJRVMgdGltZXMgdW50aWwgdGVzdHMgcGFzcyIKZWNobyAiIgoKIyBSZXRyeSBsb29wIC0gVGVzcyB3aWxsIGNvbnRpbnVlIHVudGlsIHRlc3RzIHBhc3MKd2hpbGUgWyAkQVRURU1QVCAtbGUgJE1BWF9SRVRSSUVTIF07IGRvCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIvCfmoAgVGVzcyBUZXN0aW5nIEF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgU3RhcnQgQ2xhdWRlIHdpdGggaW5pdGlhbCBndWlkYW5jZQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgVEVTUyBRQSBFWEVDVVRJT04gICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTZW50aW5lbCBhbmQgY29tcGxldGlvbiBtYXJrZXIgY2xlYW51cCBhbHJlYWR5IGRvbmUgYXQgc2NyaXB0IHN0YXJ0CgojIENsZWFuIHVwIGluaXRpYWwgZ3VpZGFuY2UgZm9yIEpTT04gY29uc3RydWN0aW9uCmVjaG8gIvCfp7kgQ2xlYW5pbmcgSU5JVElBTF9HVUlEQU5DRSAocmVtb3ZpbmcgZW1wdHkgbGluZXMgYW5kIHRyYWlsaW5nIHNwYWNlcykuLi4iCklOSVRJQUxfR1VJREFOQ0VfQ0xFQU49JChwcmludGYgIiVzIiAiJElOSVRJQUxfR1VJREFOQ0UiIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCBzZWQgJ3MvW1s6c3BhY2U6XV0qJC8vJykKZWNobyAi4pyFIENsZWFuZWQgSU5JVElBTF9HVUlEQU5DRSBsZW5ndGg6ICR7I0lOSVRJQUxfR1VJREFOQ0VfQ0xFQU59IGNoYXJhY3RlcnMiCgojIENvbnN0cnVjdCBKU09OIGZvciBkaXJlY3Qgc3RkaW4gcGlwaW5nIChubyBzaWRlY2FyLCBubyBGSUZPKQplY2hvICLwn5SnIENvbnN0cnVjdGluZyBpbml0aWFsIFFBIGd1aWRhbmNlIEpTT04uLi4iCklOSVRJQUxfR1VJREFOQ0VfSlNPTj0kKHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fScgXAogICAgICAgICAgICAiJChqcSAtUnMgLiA8PDwgIiRJTklUSUFMX0dVSURBTkNFX0NMRUFOIikiKQplY2hvICLwn5OkIEluaXRpYWwgZ3VpZGFuY2UgbGVuZ3RoOiAkeyNJTklUSUFMX0dVSURBTkNFX0pTT059IGNoYXJhY3RlcnMiCgojIFN0YXJ0IENsYXVkZSB3aXRoIHByb21wdCBwaXBlZCBkaXJlY3RseSB0byBzdGRpbgpwcmludGYgJyVzXG4nICIkSU5JVElBTF9HVUlEQU5DRV9KU09OIiB8ICRDTEFVREVfQ01EICYKQ0xBVURFX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBDbGF1ZGUgd2l0aCBUZXNzIFFBIGd1aWRhbmNlIChQSUQ6ICRDTEFVREVfUElEKSIKCiMgU3RhcnQgYmFja2dyb3VuZCB0b2tlbiByZWZyZXNoIGZvciBsb25nLXJ1bm5pbmcgam9icwooCiAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgIHNsZWVwIDI3MDAgICMgQ2hlY2sgZXZlcnkgNDUgbWludXRlcwoKICAgICAgICBpZiBbIC1uICIkVE9LRU5fR0VORVJBVEVEX0FUIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdOyB0aGVuCiAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMjcwMCBdOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBkb25lCikgJgpUT0tFTl9SRUZSRVNIX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggKFBJRDogJFRPS0VOX1JFRlJFU0hfUElEKSIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDTEFVREUgRVhFQ1VUSU9OIE1PTklUT1JJTkcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICLwn6SWIE1vbml0b3JpbmcgQ2xhdWRlIGV4ZWN1dGlvbi4uLiIKZWNobyAi8J+UjSBDbGF1ZGUgUElEOiAkQ0xBVURFX1BJRCIKCiMgV2FpdCBmb3IgQ2xhdWRlIHByb2Nlc3MgdG8gY29tcGxldGUKZWNobyAi4o+zIFdhaXRpbmcgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlLi4uIgp3YWl0ICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQpDTEFVREVfRVhJVF9DT0RFPSQ/CgojIFN0b3AgdG9rZW4gcmVmcmVzaCBiYWNrZ3JvdW5kIHByb2Nlc3MKaWYgWyAtbiAiJFRPS0VOX1JFRlJFU0hfUElEIiBdOyB0aGVuCiAgICBraWxsICRUT0tFTl9SRUZSRVNIX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlY2hvICLinJMgU3RvcHBlZCB0b2tlbiByZWZyZXNoIHByb2Nlc3MiCmZpCgplY2hvICLwn5SaIENsYXVkZSBwcm9jZXNzIGNvbXBsZXRlZCB3aXRoIGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUiCgojIFNhZmV0eSBjaGVjazogRW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IHN5bnRheCBlcnJvcnMgdGhhdCBjb3VsZCBjYXVzZSBjb21tYW5kIGludGVycHJldGF0aW9uIGlzc3VlcwplY2hvICLwn5SNIERFQlVHOiBQZXJmb3JtaW5nIHNhZmV0eSBjaGVja3MuLi4iCmlmIFsgLW4gIiQoZWNobyAiJElOSVRJQUxfR1VJREFOQ0UiIHwgZ3JlcCAnXmZpeDonKSIgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBXQVJOSU5HOiBGb3VuZCBsaW5lcyBzdGFydGluZyB3aXRoICdmaXg6JyBpbiBJTklUSUFMX0dVSURBTkNFIC0gdGhpcyBjb3VsZCBjYXVzZSBjb21tYW5kIGludGVycHJldGF0aW9uIGVycm9ycyIKZmkKCiMgQ2xvc2UgRklGTyB3cml0ZXIgaWYgaXQgd2FzIG9wZW5lZApleGVjIDk+Ji0gMj4vZGV2L251bGwgfHwgdHJ1ZQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBSIFJFVklFVyBQT1NUSU5HIC0gQ2hlY2sgaWYgQ2xhdWRlIGFscmVhZHkgaGFuZGxlZCBpdAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmVjaG8gIvCflI0gQ2hlY2tpbmcgaWYgUFIgcmV2aWV3IHdhcyBhbHJlYWR5IHBvc3RlZCBieSBDbGF1ZGUuLi4iCgojIFVzZSBQUl9OVU1CRVIgZnJvbSBlbnZpcm9ubWVudCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgdGVtcGxhdGUgdmFsdWUKUFJfTlVNPSIke1BSX05VTUJFUjote3twcl9udW1iZXJ9fX0iClRBU0tfSUQ9Int7dGFza19pZH19IgoKIyBEZWJ1ZzogU2hvdyB3aGF0IHdlIGdvdCBmb3IgUFJfTlVNCmVjaG8gIvCflI0gREVCVUc6IFBSX05VTUJFUj0nJHtQUl9OVU1CRVI6LTxub3Rfc2V0Pn0nLCBwcl9udW1iZXIgdGVtcGxhdGU9J3t7cHJfbnVtYmVyfX0nIgplY2hvICLwn5SNIERFQlVHOiBSZXNvbHZlZCBQUl9OVU09JyRQUl9OVU0nIgoKIyBIYW5kbGUgY2FzZSB3aGVyZSBQUl9OVU0gaXMgZW1wdHkgLSBza2lwIFBSIHJldmlldyBlbnRpcmVseQppZiBbIC16ICIkUFJfTlVNIiBdIHx8IFsgIiRQUl9OVU0iID0gInt7cHJfbnVtYmVyfX0iIF07IHRoZW4KICBlY2hvICLihLnvuI8gTm8gUFIgbnVtYmVyIGF2YWlsYWJsZSAtIHNraXBwaW5nIFBSIHJldmlldyBwb3N0aW5nIgogIGVjaG8gIvCflI0gVGhpcyBpcyBub3JtYWwgZm9yIG5vbi1QUiB3b3JrZmxvd3Mgb3Igd2hlbiBQUiBjb250ZXh0IGlzIG5vdCBwcm92aWRlZCIKICBlY2hvICLinIUgVGVzcyBRQSB3b3JrZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgogIGV4aXQgMApmaQoKIyBDaGVjayBpZiBDbGF1ZGUgYWxyZWFkeSBwb3N0ZWQgYSByZXZpZXcgKHRvIGF2b2lkIGR1cGxpY2F0ZSByZXZpZXdzKQppZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBnaCBhdXRoIHN0YXR1cyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBFWElTVElOR19SRVZJRVc9JChnaCBwciB2aWV3ICIkUFJfTlVNIiAtLWpzb24gcmV2aWV3cyAtLWpxICcucmV2aWV3c1tdIHwgc2VsZWN0KC5hdXRob3IubG9naW4gPT0gInRlc3MtNWRsYWJzIiBvciAuYXV0aG9yLmxvZ2luID09ICI1ZGxhYnMtdGVzcyIpIHwgLnN0YXRlJyAyPi9kZXYvbnVsbCB8IGhlYWQgLTEpCiAgaWYgWyAtbiAiJEVYSVNUSU5HX1JFVklFVyIgXTsgdGhlbgogICAgZWNobyAi4pyFIENsYXVkZSBhbHJlYWR5IHBvc3RlZCBhICRFWElTVElOR19SRVZJRVcgcmV2aWV3IC0gc2tpcHBpbmcgZHVwbGljYXRlIgogICAgZWNobyAi8J+UjSBUZXNzIFFBIHdvcmtmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgICBleGl0IDAKICBmaQpmaQoKIyBDaGVjayBDSSBzdGF0dXMgdG8gZGV0ZXJtaW5lIHJldmlldyB0eXBlCmVjaG8gIvCfk4ogQ2hlY2tpbmcgQ0kgc3RhdHVzIGZvciBQUiAjJFBSX05VTS4uLiIKCiMgUHJlLWZsaWdodCBjaGVjazogVmVyaWZ5IEdpdEh1YiBDTEkgaXMgYXZhaWxhYmxlIGFuZCB3b3JraW5nCmVjaG8gIvCflI0gUHJlLWZsaWdodCBjaGVjazogR2l0SHViIENMSSBhdmFpbGFiaWxpdHkuLi4iCgojIENoZWNrIGlmIEdpdEh1YiBDTEkgaXMgYXZhaWxhYmxlIChzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiBiYXNlIGltYWdlKQpHSF9BVkFJTEFCTEU9dHJ1ZQppZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIEdpdEh1YiBDTEkgbm90IGZvdW5kIGluIFBBVEgiCiAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGJhc2UgaW1hZ2UiCiAgZWNobyAi8J+TnSBXaWxsIHNraXAgUFIgcmV2aWV3IHBvc3RpbmcgKEdpdEh1YiBDTEkgdW5hdmFpbGFibGUpIgogIEdIX0FWQUlMQUJMRT1mYWxzZQplbHNlCiAgZWNobyAi4pyFIEdpdEh1YiBDTEkgYXZhaWxhYmxlIgoKICAjIENoZWNrIGF1dGhlbnRpY2F0aW9uCiAgaWYgISBnaCBhdXRoIHN0YXR1cyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKdjCBHaXRIdWIgQ0xJIG5vdCBhdXRoZW50aWNhdGVkIgogICAgZWNobyAi4pqg77iPIENhbm5vdCBwZXJmb3JtIENJIGNoZWNrcyBvciBQUiByZXZpZXdzIHdpdGhvdXQgYXV0aGVudGljYXRpb24iCiAgICBlY2hvICLwn5OdIFdpbGwgc2tpcCBQUiByZXZpZXcgcG9zdGluZyAoR2l0SHViIGF1dGhlbnRpY2F0aW9uIHVuYXZhaWxhYmxlKSIKICAgIEdIX0FWQUlMQUJMRT1mYWxzZQogIGVsc2UKICAgIGVjaG8gIuKchSBHaXRIdWIgQ0xJIGlzIGF2YWlsYWJsZSBhbmQgYXV0aGVudGljYXRlZCIKICBmaQpmaQoKIyBGdW5jdGlvbiB0byBzYWZlbHkgZXhlY3V0ZSBnaCBjb21tYW5kIHdpdGggZXJyb3IgaGFuZGxpbmcKY2hlY2tfY2lfc3RhdHVzKCkgewogIGxvY2FsIHByX251bT0iJDEiCiAgbG9jYWwgdGVtcF9maWxlCiAgdGVtcF9maWxlPSQobWt0ZW1wKQoKICAjIENoZWNrIGlmIGdoIGlzIGF2YWlsYWJsZSBhbmQgYXV0aGVudGljYXRlZAogIGlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKdjCBFcnJvcjogZ2ggQ0xJIGlzIG5vdCBpbnN0YWxsZWQiCiAgICBlY2hvICLihLnvuI8gQ2Fubm90IHBlcmZvcm0gQ0kgY2hlY2tzIG9yIFBSIHJldmlld3Mgd2l0aG91dCBHaXRIdWIgQ0xJIgogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCiAgICByZXR1cm4gMQogIGZpCgogICMgVGVzdCBnaCBhdXRoZW50aWNhdGlvbgogIGlmICEgZ2ggYXV0aCBzdGF0dXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinYwgRXJyb3I6IGdoIENMSSBpcyBub3QgYXV0aGVudGljYXRlZCIKICAgIGVjaG8gIuKEue+4jyBDYW5ub3QgcGVyZm9ybSBDSSBjaGVja3Mgb3IgUFIgcmV2aWV3cyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIgogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCiAgICByZXR1cm4gMQogIGZpCgogICMgR2V0IENJIGNoZWNrcyBpbiBKU09OIGZvcm1hdCB3aXRoIHByb3BlciBlcnJvciBoYW5kbGluZyAod2l0aCB0aW1lb3V0KQogIGlmICEgdGltZW91dCAzMCBnaCBwciBjaGVja3MgIiRwcl9udW0iIC0tanNvbiBuYW1lLHN0YXR1cyxjb25jbHVzaW9uLHVybCAyPiIkdGVtcF9maWxlIjsgdGhlbgogICAgbG9jYWwgZXJyb3Jfb3V0cHV0CiAgICBlcnJvcl9vdXRwdXQ9JChjYXQgIiR0ZW1wX2ZpbGUiIDI+L2Rldi9udWxsIHx8IGVjaG8gIlVua25vd24gZXJyb3IiKQogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCgogICAgIyBMb2cgdGhlIGZ1bGwgZXJyb3IgZm9yIGRlYnVnZ2luZwogICAgZWNobyAi8J+UjSBERUJVRzogZ2ggcHIgY2hlY2tzIGZhaWxlZCB3aXRoIGVycm9yOiAkZXJyb3Jfb3V0cHV0IiA+JjIKCiAgICAjIENoZWNrIGZvciBzcGVjaWZpYyBlcnJvciBjb25kaXRpb25zIHdpdGggbW9yZSBjb21wcmVoZW5zaXZlIHBhdHRlcm5zCiAgICBpZiBlY2hvICIkZXJyb3Jfb3V0cHV0IiB8IGdyZXAgLXEgInB1bGwgcmVxdWVzdCBub3QgZm91bmRcfGNvdWxkIG5vdCByZXNvbHZlIHRvIGEgUHVsbFJlcXVlc3RcfFBSIG5vdCBmb3VuZCI7IHRoZW4KICAgICAgZWNobyAi4p2MIEVycm9yOiBQUiAjJHByX251bSBub3QgZm91bmQiCiAgICAgIHJldHVybiAyCiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAibmV0d29ya1x8dGltZW91dFx8Y29ubmVjdGlvblx8SFRUUFx8QVBJIHJhdGUgbGltaXQiOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBFcnJvcjogTmV0d29yayBvciBBUEkgaXNzdWUgYWNjZXNzaW5nIEdpdEh1YiAoJGVycm9yX291dHB1dCkiCiAgICAgIHJldHVybiAzCiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAiYXV0aGVudGljYXRpb25cfHRva2VuXHx1bmF1dGhvcml6ZWRcfGZvcmJpZGRlbiI7IHRoZW4KICAgICAgZWNobyAi4p2MIEVycm9yOiBBdXRoZW50aWNhdGlvbiBmYWlsZWQgLSBjaGVjayBHaXRIdWIgdG9rZW4gcGVybWlzc2lvbnMiCiAgICAgIHJldHVybiA0CiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAicmVwb3NpdG9yeSBub3QgZm91bmRcfG5vdCBhY2Nlc3NpYmxlIjsgdGhlbgogICAgICBlY2hvICLinYwgRXJyb3I6IFJlcG9zaXRvcnkgbm90IGFjY2Vzc2libGUgb3Igbm90IGZvdW5kIgogICAgICByZXR1cm4gNQogICAgZWxzZQogICAgICBlY2hvICLinYwgRXJyb3I6IEZhaWxlZCB0byBnZXQgUFIgY2hlY2tzOiAkZXJyb3Jfb3V0cHV0IgogICAgICByZXR1cm4gMQogICAgZmkKICBmaQoKICBybSAtZiAiJHRlbXBfZmlsZSIKICByZXR1cm4gMAp9CgojIE9ubHkgcGVyZm9ybSBQUiByZXZpZXcgaWYgR2l0SHViIENMSSBpcyBhdmFpbGFibGUKaWYgWyAiJEdIX0FWQUlMQUJMRSIgPSAidHJ1ZSIgXTsgdGhlbgogICMgR2V0IENJIHN0YXR1cyB1c2luZyByb2J1c3QgSlNPTiBwYXJzaW5nCiAgQ0lfSlNPTj0kKGNoZWNrX2NpX3N0YXR1cyAiJFBSX05VTSIpCiAgQ0lfU1RBVFVTPSQ/CgogICMgVmFsaWRhdGUgQ0lfSlNPTiBpcyB2YWxpZCBKU09OIGJlZm9yZSBwcm9jZWVkaW5nCiAgaWYgWyAkQ0lfU1RBVFVTIC1lcSAwIF0gJiYgWyAtbiAiJENJX0pTT04iIF07IHRoZW4KICAgICMgQmFzaWMgSlNPTiB2YWxpZGF0aW9uIC0gY2hlY2sgaWYgaXQgc3RhcnRzIGFuZCBlbmRzIHdpdGggYnJhY2tldHMKICAgIGlmICEgKGVjaG8gIiRDSV9KU09OIiB8IGdyZXAgLXEgJ15cWycgJiYgZWNobyAiJENJX0pTT04iIHwgZ3JlcCAtcSAnXF0kJyk7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEludmFsaWQgSlNPTiBmb3JtYXQgcmVjZWl2ZWQgZnJvbSBnaCBwciBjaGVja3MgLSBmYWxsaW5nIGJhY2sgdG8gdGV4dCBwYXJzaW5nIgogICAgICBDSV9TVEFUVVM9MQogICAgZmkKICBmaQoKICBjYXNlICRDSV9TVEFUVVMgaW4KICAxKQogICAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgdW5hdmFpbGFibGUgLSBjYW5ub3QgcGVyZm9ybSBQUiByZXZpZXdzIgogICAgZWNobyAi8J+TnSBUZXNzIFFBIGNvbXBsZXRlZCBidXQgdW5hYmxlIHRvIHBvc3QgUFIgcmV2aWV3IGR1ZSB0byBHaXRIdWIgQ0xJIGlzc3VlcyIKICAgIGVjaG8gIuKchSBRQSB3b3JrZmxvdyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgZGVzcGl0ZSBHaXRIdWIgQ0xJIHByb2JsZW1zIgogICAgZWNobyAi8J+UjSBSZWNvbW1lbmRhdGlvbjogSW5zdGFsbCBhbmQgYXV0aGVudGljYXRlIEdpdEh1YiBDTEkgZm9yIGZ1bGwgZnVuY3Rpb25hbGl0eSIKICAgICMgRG9uJ3QgZXhpdCBoZXJlIC0gY29udGludWUgdG8gc2lkZWNhciBzaHV0ZG93bgogICAgOzsKICAyKQogICAgZWNobyAi4pqg77iPIFBSIG5vdCBmb3VuZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipQUiBOb3QgRm91bmQqKjogUHVsbCByZXF1ZXN0ICMkUFJfTlVNIGRvZXMgbm90IGV4aXN0CuKdjCAqKkNhbm5vdCB2ZXJpZnkqKjogSW52YWxpZCBQUiByZWZlcmVuY2UKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gVmVyaWZ5IGNvcnJlY3QgUFIgbnVtYmVyCi0gWyBdIENoZWNrIGlmIFBSIHdhcyBjbG9zZWQgb3IgbWVyZ2VkCi0gWyBdIFVwZGF0ZSBQUiByZWZlcmVuY2UgaWYgbmVlZGVkCgoqKk5vdGUqKjogQ2Fubm90IHByb2NlZWQgd2l0aCBRQSB1bnRpbCB2YWxpZCBQUiBpcyBzcGVjaWZpZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDMpCiAgICBlY2hvICLimqDvuI8gTmV0d29yayBlcnJvciAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipOZXR3b3JrIEVycm9yKio6IFVuYWJsZSB0byBjb25uZWN0IHRvIEdpdEh1YiBBUEkK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBDSSBzdGF0dXMgY2hlY2sgZmFpbGVkIGR1ZSB0byBjb25uZWN0aXZpdHkgaXNzdWVzCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIENoZWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5Ci0gWyBdIFZlcmlmeSBHaXRIdWIgQVBJIGFjY2VzcwotIFsgXSBSZXRyeSBhZnRlciBuZXR3b3JrIGlzc3VlcyBhcmUgcmVzb2x2ZWQKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIENJIHN0YXR1cyBjYW4gYmUgdmVyaWZpZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDQpCiAgICBlY2hvICLimqDvuI8gQXV0aGVudGljYXRpb24gZXJyb3IgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4p2MICoqQXV0aGVudGljYXRpb24gRXJyb3IqKjogR2l0SHViIHRva2VuIHBlcm1pc3Npb25zIGluc3VmZmljaWVudArinYwgKipDYW5ub3QgdmVyaWZ5Kio6IENJIHN0YXR1cyBjaGVjayBmYWlsZWQgZHVlIHRvIGF1dGggaXNzdWVzCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIFZlcmlmeSBHaXRIdWIgdG9rZW4gaGFzIGNvcnJlY3QgcGVybWlzc2lvbnMKLSBbIF0gQ2hlY2sgcmVwb3NpdG9yeSBhY2Nlc3MgcGVybWlzc2lvbnMKLSBbIF0gRW5zdXJlIHRva2VuIGhhc24ndCBleHBpcmVkCi0gWyBdIENvbnRhY3QgYWRtaW5pc3RyYXRvciBmb3IgdG9rZW4gcmVmcmVzaAoKKipOb3RlKio6IENhbm5vdCBwcm9jZWVkIHdpdGggUUEgdW50aWwgYXV0aGVudGljYXRpb24gaXMgcmVzb2x2ZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDUpCiAgICBlY2hvICLimqDvuI8gUmVwb3NpdG9yeSBhY2Nlc3MgZXJyb3IgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4p2MICoqUmVwb3NpdG9yeSBBY2Nlc3MgRXJyb3IqKjogUmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm90IGFjY2Vzc2libGUK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBDSSBzdGF0dXMgY2hlY2sgZmFpbGVkIGR1ZSB0byByZXBvIGFjY2VzcyBpc3N1ZXMKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gVmVyaWZ5IHJlcG9zaXRvcnkgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlCi0gWyBdIENoZWNrIHJlcG9zaXRvcnkgcGVybWlzc2lvbnMgZm9yIHRoZSB0b2tlbgotIFsgXSBFbnN1cmUgcmVwb3NpdG9yeSBVUkwgaXMgY29ycmVjdAotIFsgXSBDb250YWN0IGFkbWluaXN0cmF0b3IgZm9yIGFjY2VzcyBpc3N1ZXMKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIHJlcG9zaXRvcnkgYWNjZXNzIGlzIHJlc29sdmVkLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgogICAgOzsKICBlc2FjCgogICMgUGFyc2UgQ0kgc3RhdHVzIGZyb20gSlNPTiBvdXRwdXQKICBpZiBbIC16ICIkQ0lfSlNPTiIgXSB8fCBbICIkQ0lfSlNPTiIgPSAiW10iIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBObyBDSSBjaGVja3MgZm91bmQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICAjIFBvc3QgUkVRVUVTVCBDSEFOR0VTIHJldmlldyBmb3IgbWlzc2luZyBDSQogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKk1pc3NpbmcgQ0kgU2V0dXAqKjogTm8gR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dzIGRldGVjdGVkCuKdjCAqKkNhbm5vdCB2ZXJpZnkqKjogVGVzdCBleGVjdXRpb24gYW5kIGRlcGxveW1lbnQgc3RhdHVzIHVua25vd24KCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gU2V0IHVwIEdpdEh1YiBBY3Rpb25zIENJIHBpcGVsaW5lCi0gWyBdIEFkZCBhdXRvbWF0ZWQgdGVzdGluZyB3b3JrZmxvdwotIFsgXSBDb25maWd1cmUgZGVwbG95bWVudCB2ZXJpZmljYXRpb24KLSBbIF0gQWRkIGJyYW5jaCBwcm90ZWN0aW9uIHJ1bGVzCgoqKk5vdGUqKjogQ2Fubm90IHByb2NlZWQgd2l0aCBRQSB1bnRpbCBDSSBpcyBwcm9wZXJseSBjb25maWd1cmVkLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgplbHNlCiAgIyBGdW5jdGlvbiB0byBwYXJzZSBKU09OIHdpdGhvdXQganEgZGVwZW5kZW5jeQogIHBhcnNlX2NpX2pzb24oKSB7CiAgICBsb2NhbCBqc29uPSIkMSIKICAgIGxvY2FsIGZpZWxkPSIkMiIKICAgIGxvY2FsIHZhbHVlPSIkMyIKCiAgICAjIENvdW50IHRvdGFsIGNoZWNrcwogICAgaWYgWyAiJGZpZWxkIiA9ICJ0b3RhbCIgXTsgdGhlbgogICAgICBlY2hvICIkanNvbiIgfCBncmVwIC1vICcibmFtZSInIHwgd2MgLWwKICAgICAgcmV0dXJuCiAgICBmaQoKICAgICMgQ291bnQgYnkgc3RhdHVzIGFuZCBjb25jbHVzaW9uCiAgICBjYXNlICIkZmllbGQiIGluCiAgICAgICJjb21wbGV0ZWQiKQogICAgICAgIGVjaG8gIiRqc29uIiB8IGdyZXAgLW8gJyJzdGF0dXMiOiJjb21wbGV0ZWQiJyB8IHdjIC1sCiAgICAgICAgOzsKICAgICAgInN1Y2Nlc3MiKQogICAgICAgICMgQ291bnQgb2JqZWN0cyB0aGF0IGhhdmUgYm90aCBjb21wbGV0ZWQgc3RhdHVzIGFuZCBzdWNjZXNzIGNvbmNsdXNpb24KICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAnImNvbmNsdXNpb24iOiJzdWNjZXNzIicgfCB3YyAtbAogICAgICAgIDs7CiAgICAgICJmYWlsZWQiKQogICAgICAgICMgQ291bnQgb2JqZWN0cyB0aGF0IGhhdmUgY29tcGxldGVkIHN0YXR1cyBhbmQgZmFpbHVyZS9jYW5jZWxsZWQvdGltZWRfb3V0IGNvbmNsdXNpb24KICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAtRSAnImNvbmNsdXNpb24iOiIoZmFpbHVyZXxjYW5jZWxsZWR8dGltZWRfb3V0KSInIHwgd2MgLWwKICAgICAgICA7OwogICAgICAicGVuZGluZyIpCiAgICAgICAgbG9jYWwgdG90YWwgY29tcGxldGVkCiAgICAgICAgdG90YWw9JChlY2hvICIkanNvbiIgfCBncmVwIC1vICcibmFtZSInIHwgd2MgLWwpCiAgICAgICAgY29tcGxldGVkPSQoZWNobyAiJGpzb24iIHwgZ3JlcCAtbyAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgd2MgLWwpCiAgICAgICAgZWNobyAkKCh0b3RhbCAtIGNvbXBsZXRlZCkpCiAgICAgICAgOzsKICAgIGVzYWMKICB9CgogICMgRnVuY3Rpb24gdG8gZXh0cmFjdCBjaGVjayBkZXRhaWxzCiAgZXh0cmFjdF9jaGVja19kZXRhaWxzKCkgewogICAgbG9jYWwganNvbj0iJDEiCiAgICBsb2NhbCB0eXBlPSIkMiIKCiAgICBjYXNlICIkdHlwZSIgaW4KICAgICAgImZhaWxlZCIpCiAgICAgICAgIyBFeHRyYWN0IGZhaWxlZCBjaGVjayBuYW1lcyBhbmQgY29uY2x1c2lvbnMKICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAtRSAnImNvbmNsdXNpb24iOiIoZmFpbHVyZXxjYW5jZWxsZWR8dGltZWRfb3V0KSInIHwgc2VkIC1FICdzLy4qIm5hbWUiOiIoW14iXSspIi4qImNvbmNsdXNpb24iOiIoW14iXSspIi4qLy0gXDEgKFwyKS8nCiAgICAgICAgOzsKICAgICAgInBlbmRpbmciKQogICAgICAgICMgRXh0cmFjdCBwZW5kaW5nIGNoZWNrIG5hbWVzIGFuZCBzdGF0dXNlcwogICAgICAgIGVjaG8gIiRqc29uIiB8IHNlZCAncy99LHsvXG4vZycgfCBncmVwIC12ICcic3RhdHVzIjoiY29tcGxldGVkIicgfCBzZWQgLUUgJ3MvLioibmFtZSI6IihbXiJdKykiLioic3RhdHVzIjoiKFteIl0rKSIuKi8tIFwxIChcMikvJwogICAgICAgIDs7CiAgICAgICJzdWNjZXNzIikKICAgICAgICAjIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBjaGVjayBuYW1lcwogICAgICAgIGVjaG8gIiRqc29uIiB8IHNlZCAncy99LHsvXG4vZycgfCBncmVwICcic3RhdHVzIjoiY29tcGxldGVkIicgfCBncmVwICciY29uY2x1c2lvbiI6InN1Y2Nlc3MiJyB8IHNlZCAtRSAncy8uKiJuYW1lIjoiKFteIl0rKSIuKi8tIFwxIOKchS8nCiAgICAgICAgOzsKICAgIGVzYWMKICB9CgogICMgVXNlIGpxIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBmYWxsYmFjayBwYXJzaW5nCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIvCfk4sgVXNpbmcganEgZm9yIEpTT04gcGFyc2luZyIKICAgIFRPVEFMX0NIRUNLUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICcuIHwgbGVuZ3RoJykKICAgIENPTVBMRVRFRF9DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiKV0gfCBsZW5ndGgnKQogICAgU1VDQ0VTU19DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiIGFuZCAuY29uY2x1c2lvbiA9PSAic3VjY2VzcyIpXSB8IGxlbmd0aCcpCiAgICBGQUlMRURfQ0hFQ0tTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgKC5jb25jbHVzaW9uID09ICJmYWlsdXJlIiBvciAuY29uY2x1c2lvbiA9PSAiY2FuY2VsbGVkIiBvciAuY29uY2x1c2lvbiA9PSAidGltZWRfb3V0IikpXSB8IGxlbmd0aCcpCiAgICBQRU5ESU5HX0NIRUNLUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICdbLltdIHwgc2VsZWN0KC5zdGF0dXMgIT0gImNvbXBsZXRlZCIpXSB8IGxlbmd0aCcpCiAgZWxzZQogICAgZWNobyAi8J+TiyBVc2luZyBmYWxsYmFjayBKU09OIHBhcnNpbmcgKGpxIG5vdCBhdmFpbGFibGUpIgogICAgVE9UQUxfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJ0b3RhbCIpCiAgICBDT01QTEVURURfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJjb21wbGV0ZWQiKQogICAgU1VDQ0VTU19DSEVDS1M9JChwYXJzZV9jaV9qc29uICIkQ0lfSlNPTiIgInN1Y2Nlc3MiKQogICAgRkFJTEVEX0NIRUNLUz0kKHBhcnNlX2NpX2pzb24gIiRDSV9KU09OIiAiZmFpbGVkIikKICAgIFBFTkRJTkdfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJwZW5kaW5nIikKICBmaQoKICBlY2hvICLwn5OKIENJIFN0YXR1cyBTdW1tYXJ5OiIKICBlY2hvICIgIC0gVG90YWwgY2hlY2tzOiAkVE9UQUxfQ0hFQ0tTIgogIGVjaG8gIiAgLSBDb21wbGV0ZWQ6ICRDT01QTEVURURfQ0hFQ0tTIgogIGVjaG8gIiAgLSBTdWNjZXNzZnVsOiAkU1VDQ0VTU19DSEVDS1MiCiAgZWNobyAiICAtIEZhaWxlZDogJEZBSUxFRF9DSEVDS1MiCiAgZWNobyAiICAtIFBlbmRpbmc6ICRQRU5ESU5HX0NIRUNLUyIKCiAgSEFWRV9QUl9SRUY9ZmFsc2UKICBpZiBbIC1uICIkUkVQT19TTFVHIiBdICYmIHsgWyAtbiAiJFBSX05VTSIgXSB8fCBbIC1uICIkUFJfVVJMIiBdOyB9OyB0aGVuCiAgICBIQVZFX1BSX1JFRj10cnVlCiAgICBlbnN1cmVfc3RhdHVzX2xhYmVscyAiJFJFUE9fU0xVRyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVN9OmQ3M2E0YTpSZW1lZGlhdGlvbiByZXF1ZXN0ZWQgYnkgVGVzcyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfRklYSU5HfTpmYmNhMDQ6UmV4IGlzIGFjdGl2ZWx5IGFwcGx5aW5nIGZpeGVzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19DTEVPfTowZThhMTY6QXdhaXRpbmcgQ2xlbyBxdWFsaXR5IHJldmlldyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfVEVTU306NTMxOWU3OkF3YWl0aW5nIFRlc3MgUUEgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9BUFBST1ZFRH06MmRhNDRlOkFsbCBhdXRvbWF0ZWQgcmV2aWV3cyBhcHByb3ZlZCIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfRkFJTEVEfTpiNjAyMDU6UmVtZWRpYXRpb24gZmFpbGVkIG9yIGFib3J0ZWQiCiAgZmkKCiAgaWYgWyAiJEZBSUxFRF9DSEVDS1MiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKdjCBDSSBmYWlsdXJlcyBkZXRlY3RlZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgICMgR2V0IGRldGFpbHMgb2YgZmFpbGVkIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgRkFJTEVEX0RFVEFJTFM9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiIGFuZCAoLmNvbmNsdXNpb24gPT0gImZhaWx1cmUiIG9yIC5jb25jbHVzaW9uID09ICJjYW5jZWxsZWQiIG9yIC5jb25jbHVzaW9uID09ICJ0aW1lZF9vdXQiKSldIHwgbWFwKCItICIgKyAubmFtZSArICIgKCIgKyAuY29uY2x1c2lvbiArICIpIikgfCBqb2luKCJcbiIpJykKICAgIGVsc2UKICAgICAgRkFJTEVEX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAiZmFpbGVkIikKICAgIGZpCgogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKkNJIEZhaWx1cmVzIERldGVjdGVkKio6ICRGQUlMRURfQ0hFQ0tTIG91dCBvZiAkVE9UQUxfQ0hFQ0tTIGNoZWNrKHMpIGZhaWxpbmcK4p2MICoqQ2Fubm90IGFwcHJvdmUqKjogQWxsIENJIGNoZWNrcyBtdXN0IHBhc3MKCiMjIEZhaWxlZCBDaGVja3MKJEZBSUxFRF9ERVRBSUxTCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIEZpeCBhbGwgZmFpbGluZyBDSSBjaGVja3MKLSBbIF0gQWRkcmVzcyB0ZXN0IGZhaWx1cmVzCi0gWyBdIFJlc29sdmUgYnVpbGQgZXJyb3JzCi0gWyBdIFZlcmlmeSBhbGwgd29ya2Zsb3dzIHBhc3MKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgQ0kgaXNzdWVzIGFyZSByZXNvbHZlZC4iIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCB0aW1lZCBvdXQgb3IgZmFpbGVkIChleGl0IGNvZGU6ICQ/KSIKCiAgICAjIExhYmVsIG1hbmlwdWxhdGlvbiByZW1vdmVkIC0gdXNpbmcgR2l0SHViIFBSIHJldmlld3Mgb25seQogICAgdXBkYXRlX2NvZGVydW5fc3RhdHVzICJuZWVkcy1maXhlcyIgImNoYW5nZXNfcmVxdWVzdGVkIiAiJFBSX1VSTCIKICBlbGlmIFsgIiRQRU5ESU5HX0NIRUNLUyIgLWd0IDAgXTsgdGhlbgogICAgZWNobyAi4o+zIENJIGNoZWNrcyBzdGlsbCBwZW5kaW5nIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgIyBHZXQgZGV0YWlscyBvZiBwZW5kaW5nIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgUEVORElOR19ERVRBSUxTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyAhPSAiY29tcGxldGVkIildIHwgbWFwKCItICIgKyAubmFtZSArICIgKCIgKyAuc3RhdHVzICsgIikiKSB8IGpvaW4oIlxuIiknKQogICAgZWxzZQogICAgICBQRU5ESU5HX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAicGVuZGluZyIpCiAgICBmaQoKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrij7MgKipDSSBDaGVja3MgUGVuZGluZyoqOiAkUEVORElOR19DSEVDS1Mgb3V0IG9mICRUT1RBTF9DSEVDS1MgY2hlY2socykgc3RpbGwgcnVubmluZwrinYwgKipDYW5ub3QgYXBwcm92ZSoqOiBBbGwgQ0kgY2hlY2tzIG11c3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5CgojIyBQZW5kaW5nIENoZWNrcwokUEVORElOR19ERVRBSUxTCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIFdhaXQgZm9yIGFsbCBDSSBjaGVja3MgdG8gY29tcGxldGUKLSBbIF0gVmVyaWZ5IGFsbCBjaGVja3MgcGFzcyBzdWNjZXNzZnVsbHkKLSBbIF0gQWRkcmVzcyBhbnkgZmFpbHVyZXMgdGhhdCBtYXkgb2NjdXIKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgYWxsIENJIGNoZWNrcyBhcmUgY29tcGxldGUuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCgogICAgIyBMYWJlbCBtYW5pcHVsYXRpb24gcmVtb3ZlZCAtIHVzaW5nIEdpdEh1YiBQUiByZXZpZXdzIG9ubHkKICAgICMgTm90ZTogTm8gbG9uZ2VyIHNldHRpbmcgbmVlZHMtdGVzcyBzdGF0dXMgLSBHaXRIdWIgUFIgcmV2aWV3IHN0YXRlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgKICBlbGlmIFsgIiRTVUNDRVNTX0NIRUNLUyIgLWVxICIkVE9UQUxfQ0hFQ0tTIiBdICYmIFsgIiRUT1RBTF9DSEVDS1MiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBBbGwgQ0kgY2hlY2tzIHBhc3NpbmcgLSBwb3N0aW5nIEFQUFJPVkUgcmV2aWV3IgogICAgIyBHZXQgZGV0YWlscyBvZiBzdWNjZXNzZnVsIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgU1VDQ0VTU19ERVRBSUxTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgLmNvbmNsdXNpb24gPT0gInN1Y2Nlc3MiKV0gfCBtYXAoIi0gIiArIC5uYW1lICsgIiDinIUiKSB8IGpvaW4oIlxuIiknKQogICAgZWxzZQogICAgICBTVUNDRVNTX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAic3VjY2VzcyIpCiAgICBmaQoKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLWFwcHJvdmUgLS1ib2R5ICIjIyMg4pyFIFFBIFJldmlldyBmb3IgVGFzayAkVEFTS19JRCAtIEFQUFJPVkVECgojIyBQcmUtQXBwcm92YWwgVmVyaWZpY2F0aW9uCuKchSAqKkFMTCBDSSBjaGVja3MgdmVyaWZpZWQqKjogJFNVQ0NFU1NfQ0hFQ0tTIG91dCBvZiAkVE9UQUxfQ0hFQ0tTIGNoZWNrcyBwYXNzaW5nCuKchSAqKk5vIGZhaWx1cmVzIGZvdW5kKio6IFplcm8gZmFpbGluZyBjaGVja3MgY29uZmlybWVkCgojIyBDSSBTdGF0dXMK4pyFICoqR2l0SHViIEFjdGlvbnMgQ0kqKjogQWxsIGNoZWNrcyBwYXNzaW5nCiRTVUNDRVNTX0RFVEFJTFMKCiMjIFRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYQrinIUgKipBbGwgY3JpdGVyaWEgbWV0Kio6IEltcGxlbWVudGF0aW9uIGNvbXBsZXRlIGFuZCB2ZXJpZmllZArinIUgKipDb2RlIHF1YWxpdHkqKjogUGFzc2VzIGFsbCBzdGFuZGFyZHMK4pyFICoqVGVzdGluZyoqOiBDb21wcmVoZW5zaXZlIHRlc3QgY292ZXJhZ2UgYWNoaWV2ZWQKCiMjIEZpbmFsIEFzc2Vzc21lbnQKLSAqKlF1YWxpdHkgU2NvcmUqKjogRXhjZWxsZW50IGltcGxlbWVudGF0aW9uCi0gKipSZWFkeSBmb3IgbWVyZ2UqKjogQWxsIHJlcXVpcmVtZW50cyBzYXRpc2ZpZWQKLSAqKk5vIG91dHN0YW5kaW5nIGlzc3VlcyoqOiBDbGVhbiwgcHJvZHVjdGlvbi1yZWFkeSBjb2RlCgoqKkFQUFJPVkVEKiogLSBSZWFkeSBmb3IgbWVyZ2UgdG8gbWFpbiBicmFuY2guIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCgogICAgIyBMYWJlbCBtYW5pcHVsYXRpb24gcmVtb3ZlZCAtIHVzaW5nIEdpdEh1YiBQUiByZXZpZXdzIG9ubHkKICAgIHVwZGF0ZV9jb2RlcnVuX3N0YXR1cyAiYXBwcm92ZWQiICJhcHByb3ZlZCIgIiRQUl9VUkwiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFVuZXhwZWN0ZWQgQ0kgc3RhdGUgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4pqg77iPICoqVW5leHBlY3RlZCBDSSBTdGF0ZSoqOiBVbmFibGUgdG8gZGV0ZXJtaW5lIGZpbmFsIENJIHN0YXR1cwrinYwgKipDYW5ub3QgYXBwcm92ZSoqOiBDSSBzdGF0dXMgdW5jbGVhcgoKIyMgQ3VycmVudCBTdGF0dXMKLSBUb3RhbCBjaGVja3M6ICRUT1RBTF9DSEVDS1MKLSBDb21wbGV0ZWQ6ICRDT01QTEVURURfQ0hFQ0tTCi0gU3VjY2Vzc2Z1bDogJFNVQ0NFU1NfQ0hFQ0tTCi0gRmFpbGVkOiAkRkFJTEVEX0NIRUNLUwotIFBlbmRpbmc6ICRQRU5ESU5HX0NIRUNLUwoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBSZXZpZXcgQ0kgY2hlY2sgY29uZmlndXJhdGlvbgotIFsgXSBFbnN1cmUgYWxsIGNoZWNrcyBhcmUgcHJvcGVybHkgZGVmaW5lZAotIFsgXSBWZXJpZnkgd29ya2Zsb3cgY29tcGxldGlvbgotIFsgXSBDb250YWN0IGFkbWluaXN0cmF0b3IgaWYgaXNzdWVzIHBlcnNpc3QKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgQ0kgc3RhdHVzIGlzIGNsZWFyLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgoKICAgICMgTGFiZWwgbWFuaXB1bGF0aW9uIHJlbW92ZWQgLSB1c2luZyBHaXRIdWIgUFIgcmV2aWV3cyBvbmx5CiAgICB1cGRhdGVfY29kZXJ1bl9zdGF0dXMgIm5lZWRzLWZpeGVzIiAiY2hhbmdlc19yZXF1ZXN0ZWQiICIkUFJfVVJMIgogIGZpCgplbHNlCiAgIyBHaXRIdWIgQ0xJIG5vdCBhdmFpbGFibGUgLSBza2lwIFBSIHJldmlldwogIGVjaG8gIvCfk50gU2tpcHBpbmcgUFIgcmV2aWV3IHBvc3RpbmcgZHVlIHRvIEdpdEh1YiBDTEkgdW5hdmFpbGFiaWxpdHkiCiAgZWNobyAi4pyFIFRlc3MgUUEgd29ya2Zsb3cgY29tcGxldGVkIGJ1dCBjb3VsZCBub3QgcG9zdCBQUiByZXZpZXciCmZpCgoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBERUJVRyBMT0dHSU5HOiBGSU5BTCBTVEFUVVMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQppZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICBlY2hvICLinIUgVGVzcyBRQSB0ZXN0aW5nIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IFNVQ0NFU1MgKGV4aXQgY29kZSAwKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBUZXNzIFFBIHRlc3RpbmcgZXhpdGVkIHdpdGggY29kZTogJENMQVVERV9FWElUX0NPREUiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IEZBSUxVUkUgKGV4aXQgY29kZSAkQ0xBVURFX0VYSVRfQ09ERSkiCiAgZWNobyAi8J+UjSBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgY2FjaGVfY29udHJvbCBvciBBUEkgZXJyb3Igb2NjdXJyZWQiCiAgZWNobyAi8J+TnSBOb3RlOiBDb250YWluZXIgd2lsbCBzdGlsbCBleGl0IHN1Y2Nlc3NmdWxseSB0byBhbGxvdyB3b3JrZmxvdyBjb250aW51YXRpb24iCmZpCgplY2hvICLwn5SNIFByb2Nlc3MgaW5mb3JtYXRpb246IgplY2hvICIgIC0gUElEOiAkQ0xBVURFX1BJRCIKZWNobyAiICAtIEV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUiCmVjaG8gIiAgLSBXb3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgplY2hvICIgIC0gUmVwb3NpdG9yeTogJFJFUE9fTkFNRSIKZWNobyAiICAtIFBSIFJldmlldzogUG9zdGVkIHRvICMkUFJfTlVNIgoKIyBTaWRlY2FyIHNodXRkb3duIGlzIGhhbmRsZWQgYnkgdGhlIEVYSVQgdHJhcCBkZWZpbmVkIGVhcmxpZXIKIyBUaGUgc2h1dGRvd25fc2lkZWNhciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHNjcmlwdCBleGl0cwoKIyBQZXJmb3JtIGZpbmFsIGNsZWFudXAgb2Ygb3VyIG93biBwcm9jZXNzZXMKZWNobyAi8J+UpyBQZXJmb3JtaW5nIGZpbmFsIHByb2Nlc3MgY2xlYW51cC4uLiIKCiMgQ2xlYW4gdXAgYW55IGNoaWxkIHByb2Nlc3NlcyB3ZSBtYXkgaGF2ZSBzcGF3bmVkCmNsZWFudXBfY2hpbGRfcHJvY2Vzc2VzKCkgewogIGlmIFsgJCQgLWd0IDEgXSAmJiBbIC1kICIvcHJvYyIgXTsgdGhlbgogICAgIyBHZXQgYWxsIGNoaWxkIHByb2Nlc3NlcwogICAgbG9jYWwgY2hpbGRfcGlkcz0iIgogICAgY2hpbGRfcGlkcz0kKHBzIC1vIHBpZCxwcGlkIHwgYXdrIC12IHBwaWQ9JCQgJyQyID09IHBwaWQge3ByaW50ICQxfScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKCiAgICBpZiBbIC1uICIkY2hpbGRfcGlkcyIgXTsgdGhlbgogICAgICBlY2hvICLwn5SNIEZvdW5kIGNoaWxkIHByb2Nlc3NlcyB0byBjbGVhbiB1cDogJGNoaWxkX3BpZHMiCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLVRFUk0gMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBzbGVlcCAyCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLUtJTEwgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQp9CgpjbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcwoKICAjIENoZWNrIGlmIHRlc3Rpbmcgd2FzIHN1Y2Nlc3NmdWwKICAjIFRlc3MgaXMgc3VjY2Vzc2Z1bCBpZiBDbGF1ZGUgZXhpdGVkIGNsZWFubHkgKHRlc3RzIHNob3VsZCBwYXNzKQogIGlmIFsgJHtDTEFVREVfUElEOi0wfSAtbmUgMCBdOyB0aGVuCiAgICB3YWl0ICRDTEFVREVfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIENMQVVERV9FWElUX0NPREU9JD8KICBmaQogIAogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIEF0dGVtcHQgJEFUVEVNUFQ6IFRlc3RpbmcgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKICAgIFNVQ0NFU1M9MQogICAgYnJlYWsKICBlbHNlCiAgICBlY2hvICLimqDvuI8gQXR0ZW1wdCAkQVRURU1QVDogVGVzdGluZyBpbmNvbXBsZXRlIChleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFKSIKICAgIAogICAgaWYgWyAkQVRURU1QVCAtbHQgJE1BWF9SRVRSSUVTIF07IHRoZW4KICAgICAgZWNobyAi8J+UhCBXaWxsIHJldHJ5Li4uICgkKChNQVhfUkVUUklFUyAtIEFUVEVNUFQpKSBhdHRlbXB0cyByZW1haW5pbmcpIgogICAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgICAgZWNobyAiIgogICAgICAjIEJyaWVmIHBhdXNlIGJlZm9yZSByZXRyeQogICAgICBzbGVlcCAyCiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHJlYWNoZWQiCiAgICAgIGJyZWFrCiAgICBmaQogIGZpCmRvbmUKCiMgUmVwb3J0IGZpbmFsIHN0YXR1cwplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi4pyFIFRFU1MgVEVTVElORyBTVUNDRVNTRlVMIgogIGVjaG8gIiAgIENvbXBsZXRlZCBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgplbHNlCiAgZWNobyAi4pqg77iPIFRFU1MgVEVTVElORyBJTkNPTVBMRVRFIgogIGVjaG8gIiAgIEF0dGVtcHRlZCAkQVRURU1QVCB0aW1lKHMpIgogIGVjaG8gIiAgIFRlc3RzIG5vdCBwYXNzaW5nIgpmaQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFdyaXRlIGNvbXBsZXRpb24gbWFya2VyIGZvciB3b3JrZmxvdyB0cmFja2luZwplY2hvICJ0ZXNzLXFhLWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgVEVTUyBDT05UQUlORVIgVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICJDb250YWluZXIgUElEOiAkJCIKZWNobyAiRmluYWwgUHJvY2VzcyBDaGVjazoiCnBzIGF1eCB8IGhlYWQgLTUKCiMgQ2xlYW51cCBGSUZPCnJtIC1mICIkRklGT19QQVRIIiAyPi9kZXYvbnVsbCB8fCB0cnVlCgojIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHN1Y2Nlc3MKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBzdWNjZXNzIHN0YXR1cy4uLiIKICBleGl0IDAKZWxzZQogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggZmFpbHVyZSBzdGF0dXMuLi4iCiAgZWNobyAi8J+TnSBUZXN0aW5nIGluY29tcGxldGUgYWZ0ZXIgJEFUVEVNUFQgYXR0ZW1wdChzKSIKICBleGl0IDEKZmkK code_claude_container.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIElNUExFTUVOVEFUSU9OIFRBU0sgU1RBUlRJTkcgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwoKIyBEaXNhYmxlIGludGVyYWN0aXZlIEdpdCBwcm9tcHRzIGdsb2JhbGx5CmV4cG9ydCBHSVRfVEVSTUlOQUxfUFJPTVBUPTAKZXhwb3J0IEdJVF9BU0tQQVNTPS9iaW4vdHJ1ZQpleHBvcnQgU1NIX0FTS1BBU1M9L2Jpbi90cnVlCgojIFJlcG9zaXRvcnkgVVJMClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgojIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCmVjaG8gIlVzaW5nIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24iCgojIEF1dGhlbnRpY2F0ZSB3aXRoIEdpdEh1YiBBcHAKaWYgWyAtbiAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiIF0gJiYgWyAtbiAiJEdJVEhVQl9BUFBfSUQiIF07IHRoZW4KICAgIGVjaG8gIkF1dGhlbnRpY2F0aW5nIHdpdGggR2l0SHViIEFwcC4uLiIKCiAgICAjIENyZWF0ZSB0ZW1wb3JhcnkgcHJpdmF0ZSBrZXkgZmlsZSAoc3VwcG9ydCBlc2NhcGVkIG5ld2xpbmVzKQogICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS5wZW0iCiAgICBwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEdlbmVyYXRlIEpXVCB0b2tlbiBmb3IgR2l0SHViIEFwcCAoZml4ZWQgSldUIGdlbmVyYXRpb24gZm9yIExpbnV4IGNvbnRhaW5lcnMpCiAgICAjIEpXVCBoZWFkZXIKICAgIEpXVF9IRUFERVI9JChwcmludGYgJ3siYWxnIjoiUlMyNTYiLCJ0eXAiOiJKV1QifScgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIEpXVCBwYXlsb2FkIHdpdGggY3VycmVudCB0aW1lIGFuZCBleHBpcmF0aW9uICgxMCBtaW51dGVzKQogICAgTk9XPSQoZGF0ZSArJXMpCiAgICBFWFA9JCgoTk9XICsgNjAwKSkKICAgIEpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQoKICAgICMgU2lnbiB0aGUgSldUCiAgICBKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogICAgSldUX1RPS0VOPSIkSldUX0hFQURFUi4kSldUX1BBWUxPQUQuJEpXVF9TSUdOQVRVUkUiCgogICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIGZvciB0aGUgcmVwb3NpdG9yeSAocm9idXN0IHBhcnNpbmcgb2Ygb3duZXIvcmVwbykKICAgIElOUFVUX1JFUE89Int7cmVwb3NpdG9yeV91cmx9fSIKICAgIFJFUE9fT1dORVI9IiIKICAgIFJFUE9fTkFNRT0iIgoKICAgIGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS9bXi9dKy8oW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsaWYgZWNobyAiJElOUFVUX1JFUE8iIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgIyBTU0ggZm9ybWF0IGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8oLmdpdCkKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvLip8XDF8JykKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206W14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbHNlCiAgICAgICAgIyBGYWxsYmFjazogYXNzdW1lIHNsdWcgb3duZXIvcmVwbyAocG9zc2libHkgd2l0aCAuZ2l0KQogICAgICAgIFNMVUc9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8XC5naXQkfHwnKQogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYxKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRTTFVHIiB8IGN1dCAtZCcvJyAtZjIpCiAgICBmaQoKICAgIGVjaG8gIkRFQlVHOiBQYXJzZWQgcmVwb3NpdG9yeSAtIE93bmVyOiAnJFJFUE9fT1dORVInLCBOYW1lOiAnJFJFUE9fTkFNRSciCgogICAgZWNobyAiR2V0dGluZyBpbnN0YWxsYXRpb24gSUQgZm9yICRSRVBPX09XTkVSLyRSRVBPX05BTUUuLi4iCgogICAgIyBHZXQgdGhlIGluc3RhbGxhdGlvbiBJRCAocmV0cnkgYW5kIGZvbGxvdyByZWRpcmVjdHMpLiBGYWxsYmFjayB0byBvcmcgaW5zdGFsbGF0aW9uLgogICAgSU5TVEFMTEFUSU9OX1JFU1BPTlNFPSQoY3VybCAtcyAtTCAtLXJldHJ5IDUgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktY29ubnJlZnVzZWQgXAogICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iKQoKICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRJTlNUQUxMQVRJT05fUkVTUE9OU0UiIHwganEgLXIgJy5pZCcpCgogICAgaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIFJlcG8gaW5zdGFsbGF0aW9uIG5vdCBmb3VuZCwgdHJ5aW5nIG9yZyBpbnN0YWxsYXRpb24uLi4iCiAgICAgICAgT1JHX0lOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAgICAgLS1jb25uZWN0LXRpbWVvdXQgNSAtLW1heC10aW1lIDEyIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoZWNobyAiJE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0UiIHwganEgLXIgJy5pZCcpCiAgICBmaQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAocmVwbyk6ICRJTlNUQUxMQVRJT05fUkVTUE9OU0UiCiAgICAgICAgZWNobyAiUmVzcG9uc2UgKG9yZyk6ICAke09SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U6LVtub25lXX0iCiAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICBlY2hvICJJbnN0YWxsYXRpb24gSUQ6ICRJTlNUQUxMQVRJT05fSUQiCgogICAgIyBHZXQgaW5zdGFsbGF0aW9uIGFjY2VzcyB0b2tlbgogICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgR0lUSFVCX1RPS0VOPSQoZWNobyAiJFRPS0VOX1JFU1BPTlNFIiB8IGpxIC1yICcudG9rZW4nKQoKICAgIGlmIFsgIiRHSVRIVUJfVE9LRU4iID0gIm51bGwiIF0gfHwgWyAteiAiJEdJVEhVQl9UT0tFTiIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBhY2Nlc3MgdG9rZW4iCiAgICAgICAgZWNobyAiUmVzcG9uc2U6ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgICMgQ2xlYW4gdXAgdGVtcG9yYXJ5IGtleSBmaWxlCiAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBFeHBvcnQgdGhlIHRva2VuIGZvciBnaXQgdG8gdXNlCiAgICBleHBvcnQgR0lUSFVCX1RPS0VOCgogICAgIyBDb25maWd1cmUgZ2l0IHRvIHVzZSB0aGUgdG9rZW4gKHVzZSAtLXJlcGxhY2UtYWxsIHRvIGhhbmRsZSBtdWx0aXBsZSBleGlzdGluZyBoZWxwZXJzKQogICAgZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLXJlcGxhY2UtYWxsIGNyZWRlbnRpYWwuaGVscGVyIHN0b3JlCiAgICBlY2hvICJodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tIiA+IH4vLmdpdC1jcmVkZW50aWFscwoKICAgICMgQWxzbyBhdXRoZW50aWNhdGUgZ2ggQ0xJIHdpdGggdGhlIHRva2VuCiAgICBlY2hvICIkR0lUSFVCX1RPS0VOIiB8IGdoIGF1dGggbG9naW4gLS13aXRoLXRva2VuCgogICAgZWNobyAi4pyTIEdpdEh1YiBBcHAgYXV0aGVudGljYXRlZCBzdWNjZXNzZnVsbHkiCgplbHNlCiAgICBlY2hvICLinYwgR0lUSFVCX0FQUF9QUklWQVRFX0tFWSBvciBHSVRIVUJfQVBQX0lEIG5vdCBmb3VuZCIKICAgIGV4aXQgMQpmaQoKIyBHaXQgY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKIyBTZXQgR2l0SHViIEFwcCBhdHRyaWJ1dGlvbiAtIHVzZSBnZW5lcmljIGZvcm1hdCBmb3IgYWxsIGFnZW50cwpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogICAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICAgIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgICAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIHJldHVybgogICAgZmkKCiAgICBsb2NhbCBzbHVnCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogICAgZmkKCiAgICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICAgIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgICAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgICAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgICAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgICAgIGxvY2FsIGJvdF9pZAogICAgICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICAgICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICAgICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIGZpCiAgICBmaQoKICAgIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICAgIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCiMgQ29uZmlndXJlIGdpdCB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgoKIyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbGF1ZGUgQ29kZSB0byB1c2UKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmVjaG8gIuKckyBHaXQgY29uZmlndXJlZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgppZiBnaXQgbHMtcmVtb3RlICIkUkVQT19IVFRQX1VSTCIgSEVBRCA+IC90bXAvcmVwb190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgZWNobyAi4pyTIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3MgZmFpbGVkIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvcmVwb190ZXN0Lm91dCkiCiAgZWNobyAiICBHaXQgY3JlZGVudGlhbCBoZWxwZXIgc3RhdHVzOiIKICBnaXQgY29uZmlnIC0tbGlzdCB8IGdyZXAgY3JlZGVudGlhbCB8fCBlY2hvICIgIE5vIGNyZWRlbnRpYWwgaGVscGVycyBjb25maWd1cmVkIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIHJlcG9zaXRvcnkgdmlhIEhUVFBTIgogIGV4aXQgMQpmaQoKIyBUZXN0IGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBkb2NzIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkRE9DU19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRET0NTX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9kb2NzX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBzdWNjZXNzZnVsIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9kb2NzX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgRXJyb3Igb3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQpIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIGRvY3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIER1YWwgUmVwb3NpdG9yeSBTZXR1cCAtIFBsYXRmb3JtIHJlcG8gZm9yIGRvY3MsIFRhcmdldCByZXBvIGZvciBpbXBsZW1lbnRhdGlvbgplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICBEVUFMIFJFUE9TSVRPUlkgU0VUVVAgICAgICAgICAgICAgICAgICAgICAgICDilZEiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgUmVwb3NpdG9yeSBJbmZvcm1hdGlvbgpET0NTX0JSQU5DSD0ie3tkb2NzX2JyYW5jaH19IgpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgSGVscGVyOiBkZXJpdmUgc2FmZSB3b3Jrc3BhY2UgZGlyZWN0b3J5IG5hbWUgZnJvbSByZXBvIGlucHV0IChVUkwsIFNTSCwgb3Igc2x1ZykKc2FuaXRpemVfcmVwb19kaXIoKSB7CiAgICBpbnB1dD0iJDEiCiAgICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIG93bmVyPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIG5hbWU9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS9bXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgb3duZXI9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvLip8XDF8JykKICAgICAgICBuYW1lPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxzZQogICAgICAgICMgQXNzdW1lIG93bmVyL3JlcG8gKG9wdGlvbmFsbHkgd2l0aCAuZ2l0KQogICAgICAgIHNsdWc9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFxcLmdpdCR8fCcpCiAgICAgICAgZWNobyAiJHNsdWciIHwgdHIgJy8nICctJwogICAgZmkKfQoKIyBEZXJpdmUgd29ya3NwYWNlIGRpcmVjdG9yeSBuYW1lcyAob3duZXItcmVwbykKRE9DU19SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIpClRBUkdFVF9SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e3JlcG9zaXRvcnlfdXJsfX0iKQoKZWNobyAiPT09IFJFUE9TSVRPUlkgU0VUVVAgPT09IgplY2hvICJEb2NzIHJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCmVjaG8gIlRhcmdldCByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKZWNobyAiRG9jcyBicmFuY2g6ICRET0NTX0JSQU5DSCIKZWNobyAiR2l0SHViIEFwcDogJEdJVEhVQl9BUFAiCgojIERldGVybWluZSB3b3JrZmxvdyB0eXBlCmVjaG8gIvCflI0gREVCVUc6IFdvcmtmbG93IHR5cGUgZGV0ZWN0aW9uIgplY2hvICIgIGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIENvbXBhcmlzb24gcmVzdWx0OiAkKCBbICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgPSAie3tyZXBvc2l0b3J5X3VybH19IiBdICYmIGVjaG8gJ0VRVUFMJyB8fCBlY2hvICdESUZGRVJFTlQnICkiCgppZiBbICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgPSAie3tyZXBvc2l0b3J5X3VybH19IiBdOyB0aGVuCiAgICBlY2hvICLinJMgU2luZ2xlLXJlcG8gd29ya2Zsb3cgZGV0ZWN0ZWQgKHNhbWUgcmVwb3NpdG9yeSBmb3IgZG9jcyBhbmQgaW1wbGVtZW50YXRpb24pIgogICAgV09SS0ZMT1dfVFlQRT0ic2luZ2xlLXJlcG8iCiAgICBlY2hvICIgIOKUlOKUgCBUYXNrTWFzdGVyIGZpbGVzIGV4cGVjdGVkIGF0IHJlcG9zaXRvcnkgcm9vdCIKZWxzZQogICAgZWNobyAi4pyTIE11bHRpLXJlcG8gd29ya2Zsb3cgZGV0ZWN0ZWQgKHNlcGFyYXRlIGRvY3MgYW5kIHRhcmdldCByZXBvc2l0b3JpZXMpIgogICAgV09SS0ZMT1dfVFlQRT0ibXVsdGktcmVwbyIKICAgIGVjaG8gIiAg4pSU4pSAIFRhc2tNYXN0ZXIgZmlsZXMgZXhwZWN0ZWQgaW4gZG9jcyByZXBvIGF0OiB7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKZmkKZWNobyAi8J+UjSBERUJVRzogV09SS0ZMT1dfVFlQRSBzZXQgdG86ICRXT1JLRkxPV19UWVBFIgoKIyBSZXBvc2l0b3J5IFNldHVwIEJhc2VkIG9uIFdvcmtmbG93IFR5cGUKaWYgWyAiJFdPUktGTE9XX1RZUEUiID0gInNpbmdsZS1yZXBvIiBdOyB0aGVuCiAgICBlY2hvICI9PT0gU0lOR0xFLVJFUE8gV09SS0ZMT1cgPT09IgogICAgIyBDaGVjayBpZiByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIChyZXRyeSBzY2VuYXJpbykKICAgIGVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGZvciBleGlzdGluZyByZXBvc2l0b3J5IGRpcmVjdG9yeTogJFRBUkdFVF9SRVBPX0RJUiIKICAgIGVjaG8gIiAgV29ya3NwYWNlIGNvbnRlbnRzOiAkKGxzIC1sYSAvd29ya3NwYWNlLyB8IGdyZXAgLXYgJ150b3RhbCcpIgoKICAgIGlmIFsgLWQgIiRUQVJHRVRfUkVQT19ESVIiIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SEIFJFUE9TSVRPUlk6IFVQREFURSAtIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIKICAgICAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHJlcG9zaXRvcnkgJyRUQVJHRVRfUkVQT19ESVInLCB1cGRhdGluZy4uLiIKICAgICAgICBlY2hvICIgIERpcmVjdG9yeSBjb250ZW50czogJChscyAtbGEgJFRBUkdFVF9SRVBPX0RJUiB8IGhlYWQgLTUpIgogICAgICAgIGNkICIkVEFSR0VUX1JFUE9fRElSIgogICAgICAgIGVjaG8gIiAgQ3VycmVudCBicmFuY2g6ICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCAyPi9kZXYvbnVsbCB8fCBlY2hvICd1bmtub3duJykiCiAgICAgICAgZWNobyAiICBHaXQgc3RhdHVzIGJlZm9yZSB1cGRhdGU6ICQoZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiB8IHdjIC1sKSBmaWxlcyBjaGFuZ2VkIgogICAgICAgIGdpdCBmZXRjaCBvcmlnaW4KICAgICAgICBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIKICAgICAgICBnaXQgcmVzZXQgLS1oYXJkICJvcmlnaW4vJERPQ1NfQlJBTkNIIgogICAgICAgIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgUmVwb3NpdG9yeSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSB0byAkRE9DU19CUkFOQ0giCiAgICBlbHNlCiAgICAgICAgZWNobyAi8J+TpSBSRVBPU0lUT1JZOiBDTE9OSU5HIC0gZmlyc3QgdGltZSBzZXR1cCIKICAgICAgICBlY2hvICIgIENsb25lIGNvbW1hbmQ6IGdpdCBjbG9uZSBcIiRSRVBPX0hUVFBfVVJMXCIgXCIkVEFSR0VUX1JFUE9fRElSXCIiCiAgICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJFRBUkdFVF9SRVBPX0RJUiI7IHRoZW4KICAgICAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICAgICAgICAgICAgZWNobyAiICBMYXN0IGdpdCBlcnJvcjogJChnaXQgY29uZmlnIC0tZ2V0LXJlZ2V4cCAnY3JlZGVudGlhbHxyZW1vdGUnKSIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKICAgICAgICBlY2hvICIgIENsb25lIHN1Y2Nlc3NmdWwsIGNoYW5naW5nIHRvIGRpcmVjdG9yeSBhbmQgY2hlY2tpbmcgb3V0ICRET0NTX0JSQU5DSCIKICAgICAgICBjZCAiJFRBUkdFVF9SRVBPX0RJUiIgJiYgZ2l0IGNoZWNrb3V0ICIkRE9DU19CUkFOQ0giICYmIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgUmVwb3NpdG9yeSBjbG9uZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVjaG8gIiAgRmluYWwgZGlyZWN0b3J5IHN0cnVjdHVyZTogJChscyAtbGEgJFRBUkdFVF9SRVBPX0RJUiB8IGhlYWQgLTUpIgogICAgZmkKCiAgICAjIFByZXNlcnZlIFRhc2sgTWFzdGVyIGZpbGVzIGJlZm9yZSBicmFuY2ggc3dpdGNoaW5nIChzaW5nbGUtcmVwbyB3b3JrZmxvdykKICAgIGVjaG8gIvCflIQgUHJlc2VydmluZyBUYXNrIE1hc3RlciBmaWxlcyBmcm9tIGRvY3MgYnJhbmNoIGJlZm9yZSBzd2l0Y2hpbmcgdG8gZmVhdHVyZSBicmFuY2guLi4iCiAgICBURU1QX1RBU0tfRElSPSIvdG1wL3Rhc2ttYXN0ZXItcHJlc2VydmUiCiAgICBybSAtcmYgIiRURU1QX1RBU0tfRElSIgogICAgbWtkaXIgLXAgIiRURU1QX1RBU0tfRElSIgoKICAgIGNkICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIiCiAgICBlY2hvICLwn5SNIERFQlVHOiBUYXNrTWFzdGVyIGZpbGUgcHJlc2VydmF0aW9uIgogICAgZWNobyAiICBkb2NzX3Byb2plY3RfZGlyZWN0b3J5OiAne3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0nIgogICAgZWNobyAiICB0YXNrX2lkOiAne3t0YXNrX2lkfX0nIgoKICAgICMgQ29weSBUYXNrIE1hc3RlciBmaWxlcyBmcm9tIGRvY3MgYnJhbmNoIHRvIHRlbXBvcmFyeSBsb2NhdGlvbgogICAge3sjaWYgZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19CiAgICBpZiBbICJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIgPSAiLiIgXTsgdGhlbgogICAgICAgIFBSRVNFUlZFX0ZST009Ii93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi8udGFza21hc3Rlci9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCiAgICAgICAgZWNobyAiICDilJTilIAgVXNpbmcgcm9vdCB0YXNrbWFzdGVyIHBhdGggKGRvY3NfcHJvamVjdF9kaXJlY3Rvcnk9Jy4nKSIKICAgIGVsc2UKICAgICAgICBQUkVTRVJWRV9GUk9NPSIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIvZG9jcy90YXNrLXt7dGFza19pZH19IgogICAgICAgIGVjaG8gIiAg4pSU4pSAIFVzaW5nIHByb2plY3Qgc3ViZGlyZWN0b3J5OiB7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKICAgIGZpCiAgICB7e2Vsc2V9fQogICAgUFJFU0VSVkVfRlJPTT0iL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSLy50YXNrbWFzdGVyL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKICAgIGVjaG8gIiAg4pSU4pSAIFVzaW5nIGRlZmF1bHQgcm9vdCB0YXNrbWFzdGVyIHBhdGggKG5vIGRvY3NfcHJvamVjdF9kaXJlY3RvcnkpIgogICAge3svaWZ9fQoKICAgIGVjaG8gIiAgUFJFU0VSVkVfRlJPTSByZXNvbHZlZCB0bzogJFBSRVNFUlZFX0ZST00iCgogICAgZWNobyAi8J+UjSBERUJVRzogQXR0ZW1wdGluZyB0byBwcmVzZXJ2ZSBUYXNrIE1hc3RlciBmaWxlcyBmcm9tOiAkUFJFU0VSVkVfRlJPTSIKICAgIGVjaG8gIiAgQ2hlY2tpbmcgaWYgZGlyZWN0b3J5IGV4aXN0cy4uLiIKICAgIGlmIFsgLWQgIiRQUkVTRVJWRV9GUk9NIiBdOyB0aGVuCiAgICAgICAgZWNobyAiICDinJMgVGFza01hc3RlciBkaXJlY3RvcnkgZm91bmQhIgogICAgICAgIGVjaG8gIiAgRGlyZWN0b3J5IGNvbnRlbnRzOiAkKGxzIC1sYSAiJFBSRVNFUlZFX0ZST00iIHwgd2MgLWwpIGl0ZW1zIgogICAgICAgIGxzIC1sYSAiJFBSRVNFUlZFX0ZST00iCiAgICAgICAgY3AgLXIgIiRQUkVTRVJWRV9GUk9NIi8qICIkVEVNUF9UQVNLX0RJUi8iIDI+L2Rldi9udWxsICYmIGVjaG8gIuKckyBUYXNrIE1hc3RlciBmaWxlcyBwcmVzZXJ2ZWQgdG8gdGVtcG9yYXJ5IGxvY2F0aW9uIiB8fCBlY2hvICLimqDvuI8gU29tZSBmaWxlcyBtYXkgbm90IGhhdmUgYmVlbiBwcmVzZXJ2ZWQiCgogICAgICAgICMgQWxzbyBwcmVzZXJ2ZSBhcmNoaXRlY3R1cmUubWQgZnJvbSBkb2NzIGRpcmVjdG9yeSAob25lIGxldmVsIHVwIGZyb20gdGFzayBkaXJlY3RvcnkpCiAgICAgICAge3sjaWYgZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19CiAgICAgICAgaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgICAgICAgICAgQVJDSF9TT1VSQ0U9Ii93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi8udGFza21hc3Rlci9kb2NzL2FyY2hpdGVjdHVyZS5tZCIKICAgICAgICBlbHNlCiAgICAgICAgICAgIEFSQ0hfU09VUkNFPSIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIvZG9jcy9hcmNoaXRlY3R1cmUubWQiCiAgICAgICAgZmkKICAgICAgICB7e2Vsc2V9fQogICAgICAgIEFSQ0hfU09VUkNFPSIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvLnRhc2ttYXN0ZXIvZG9jcy9hcmNoaXRlY3R1cmUubWQiCiAgICAgICAge3svaWZ9fQoKICAgICAgICBpZiBbIC1mICIkQVJDSF9TT1VSQ0UiIF07IHRoZW4KICAgICAgICAgICAgY3AgIiRBUkNIX1NPVVJDRSIgIiRURU1QX1RBU0tfRElSLyIgJiYgZWNobyAi4pyTIGFyY2hpdGVjdHVyZS5tZCBwcmVzZXJ2ZWQgZnJvbSBkb2NzIGJyYW5jaCIgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwcmVzZXJ2ZSBhcmNoaXRlY3R1cmUubWQiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gYXJjaGl0ZWN0dXJlLm1kIG5vdCBmb3VuZCBhdDogJEFSQ0hfU09VUkNFIgogICAgICAgIGZpCgogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IFByZXNlcnZlZCBmaWxlczoiCiAgICAgICAgbHMgLWxhICIkVEVNUF9UQVNLX0RJUi8iIHx8IGVjaG8gIk5vIGZpbGVzIGluIHRlbXAgZGlyZWN0b3J5IgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBUYXNrIE1hc3RlciBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkUFJFU0VSVkVfRlJPTSIKICAgICAgICBlY2hvICLinYwgQ1JJVElDQUw6IFRhc2tNYXN0ZXIgZmlsZXMgbXVzdCBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIgogICAgICAgIGVjaG8gIuKdjCBFeHBlY3RlZCBsb2NhdGlvbjogJFBSRVNFUlZFX0ZST00iCiAgICAgICAgZWNobyAi4p2MIFRoaXMgam9iIGNhbm5vdCBjb250aW51ZSB3aXRob3V0IHRoZSBzcGVjaWZpZWQgVGFza01hc3RlciBmaWxlcyIKICAgICAgICBlY2hvICLinYwgVmVyaWZ5IHRoYXQ6IgogICAgICAgIGVjaG8gIiAgIDEuIFRoZSBkb2NzLXByb2plY3QtZGlyZWN0b3J5IHBhcmFtZXRlciBpcyBjb3JyZWN0IgogICAgICAgIGVjaG8gIiAgIDIuIFRoZSB0YXNrLWlkIGV4aXN0cyBpbiB0aGUgVGFza01hc3RlciBkaXJlY3RvcnkiCiAgICAgICAgZWNobyAiICAgMy4gVGhlIGRvY3MtYnJhbmNoIGNvbnRhaW5zIHRoZSBUYXNrTWFzdGVyIGZpbGVzIgogICAgICAgIGV4aXQgMQogICAgZmkKICAgIGNkIC93b3Jrc3BhY2UKCiAgICAjIFNldCB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcmVwb3NpdG9yeSByb290CiAgICBSRVBPX05BTUU9IiRUQVJHRVRfUkVQT19ESVIiCiAgICBlY2hvICLinJMgV29ya2luZyBkaXJlY3Rvcnk6IC93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKICAgIGVjaG8gIuKckyBUYXNrIGZpbGVzIHByZXNlcnZlZCBmcm9tIGRvY3MgYnJhbmNoIgoKZWxzZQogICAgZWNobyAiPT09IE1VTFRJLVJFUE8gV09SS0ZMT1cgPT09IgoKICAgICMgU3RlcCAxOiBDbG9uZSBvciB1cGRhdGUgZG9jcyByZXBvc2l0b3J5IHRlbXBvcmFyaWx5CiAgICBpZiBbIC1kICIvdG1wL2RvY3MtcmVwbyIgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflIQgRE9DUyBSRVBPU0lUT1JZOiBVUERBVEUgLSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGV4aXN0cyIKICAgICAgICBjZCAvdG1wL2RvY3MtcmVwbwogICAgICAgIGdpdCBmZXRjaCBvcmlnaW4KICAgICAgICBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIKICAgICAgICBnaXQgcmVzZXQgLS1oYXJkICJvcmlnaW4vJERPQ1NfQlJBTkNIIgogICAgICAgIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IHVwZGF0ZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAi8J+TpSBET0NTIFJFUE9TSVRPUlk6IENMT05JTkcgLSBleHRyYWN0aW5nIHRhc2sgZmlsZXMiCiAgICAgICAgaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbzsgdGhlbgogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNsb25lIGRvY3MgcmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKICAgICAgICBjZCAvdG1wL2RvY3MtcmVwbyAmJiBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIgJiYgY2QgL3dvcmtzcGFjZQogICAgICAgIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgY2xvbmVkIHRvIHRlbXBvcmFyeSBsb2NhdGlvbiIKICAgIGZpCgogICAgIyBTdGVwIDI6IENsb25lIG9yIHVwZGF0ZSB0YXJnZXQgcmVwb3NpdG9yeQogICAgaWYgWyAtZCAiJFRBUkdFVF9SRVBPX0RJUiIgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflIQgVEFSR0VUIFJFUE9TSVRPUlk6IFVQREFURSAtIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIKICAgICAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHRhcmdldCByZXBvc2l0b3J5ICckVEFSR0VUX1JFUE9fRElSJywgdXBkYXRpbmcuLi4iCiAgICAgICAgY2QgIiRUQVJHRVRfUkVQT19ESVIiCiAgICAgICAgZ2l0IGZldGNoIG9yaWdpbiBtYWluCiAgICAgICAgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFpbgogICAgICAgIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkiCiAgICBlbHNlCiAgICAgICAgZWNobyAi8J+TpSBUQVJHRVQgUkVQT1NJVE9SWTogQ0xPTklORyAtIGZpcnN0IHRpbWUgc2V0dXAiCiAgICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJFRBUkdFVF9SRVBPX0RJUiI7IHRoZW4KICAgICAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSB0YXJnZXQgcmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCiAgICAgICAgZWNobyAi4pyTIFRhcmdldCByZXBvc2l0b3J5IGNsb25lZCBzdWNjZXNzZnVsbHkiCiAgICBmaQoKICAgICMgU3RlcCAzOiBDb3B5IHRhc2sgZmlsZXMgZnJvbSBkb2NzIHJlcG8gdG8gdGFyZ2V0IHJlcG8KICAgIGVjaG8gIvCfk4sgVEFTSyBGSUxFUzogQ09QWUlORyBmcm9tIGRvY3MgdG8gdGFyZ2V0IHJlcG9zaXRvcnkiCiAgICBta2RpciAtcCAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2siCgogICAgIyBEZXRlcm1pbmUgZG9jcyBwcm9qZWN0IGRpcmVjdG9yeSBwYXRoCiAgICB7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KICAgIGlmIFsgInt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IiA9ICIuIiBdOyB0aGVuCiAgICAgICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKICAgIGVsc2UKICAgICAgICBET0NTX1BBVEg9Ii90bXAvZG9jcy1yZXBvL3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19Ly50YXNrbWFzdGVyIgogICAgZmkKICAgIHt7ZWxzZX19CiAgICBET0NTX1BBVEg9Ii90bXAvZG9jcy1yZXBvLy50YXNrbWFzdGVyIgogICAge3svaWZ9fQoKICAgICMgQ29weSBzcGVjaWZpYyB0YXNrIGZpbGVzCiAgICBUQVNLX0RJUj0iJERPQ1NfUEFUSC9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCiAgICBlY2hvICLwn5SNIERFQlVHOiBMb29raW5nIGZvciB0YXNrIGZpbGVzIGF0OiAkVEFTS19ESVIiCiAgICBlY2hvICLwn5SNIERFQlVHOiBEb2NzIHBhdGggaXM6ICRET0NTX1BBVEgiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiBkb2NzIHRlbXAgZGlyZWN0b3J5OiIKICAgIGxzIC1sYSAvdG1wL2RvY3MtcmVwby8udGFza21hc3Rlci8gfHwgZWNobyAiTm8gLnRhc2ttYXN0ZXIgZm91bmQiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiBkb2NzIGRpcmVjdG9yeToiCiAgICBscyAtbGEgL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIvZG9jcy8gfHwgZWNobyAiTm8gZG9jcyBkaXJlY3RvcnkgZm91bmQiCgogICAgaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogVGFzayBkaXJlY3RvcnkgZm91bmQsIGNvbnRlbnRzOiIKICAgICAgICBscyAtbGEgIiRUQVNLX0RJUiIKCiAgICAgICAgZWNobyAi4pyFIENvcHlpbmcgdGFzay5tZC4uLiIKICAgICAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyB0YXNrLm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHRhc2subWQgY29weSBmYWlsZWQiCgogICAgICAgIGVjaG8gIuKchSBDb3B5aW5nIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQuLi4iCiAgICAgICAgY3AgIiRUQVNLX0RJUi9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGNvcHkgZmFpbGVkIgoKICAgICAgICBlY2hvICLinIUgQ29weWluZyBwcm9tcHQubWQuLi4iCiAgICAgICAgY3AgIiRUQVNLX0RJUi9wcm9tcHQubWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyBwcm9tcHQubWQgY29waWVkIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIGNvcHkgZmFpbGVkIgoKICAgICAgICBlY2hvICLinIUgQ29weWluZyBjbGllbnQtY29uZmlnLmpzb24uLi4iCiAgICAgICAgaWYgWyAtZiAiJFRBU0tfRElSL2NsaWVudC1jb25maWcuanNvbiIgXTsgdGhlbgogICAgICAgICAgICBjcCAiJFRBU0tfRElSL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIGNvcGllZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkiIHx8IGVjaG8gIuKdjCBjbGllbnQtY29uZmlnLmpzb24gY29weSBmYWlsZWQiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCAtIE1DUCBjbGllbnQgbWF5IG5vdCBiZSBjb25maWd1cmVkIgogICAgICAgIGZpCgogICAgICAgIGVjaG8gIuKchSBDb3B5aW5nIHRvb2xtYW4tZ3VpZGUubWQuLi4iCiAgICAgICAgaWYgWyAtZiAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICAgICAgY3AgIiRUQVNLX0RJUi90b29sbWFuLWd1aWRlLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgdG9vbG1hbi1ndWlkZS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCB0b29sbWFuLWd1aWRlLm1kIGNvcHkgZmFpbGVkIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pqg77iPIHRvb2xtYW4tZ3VpZGUubWQgbm90IGZvdW5kIC0gY29kZSBhZ2VudCB3b24ndCBoYXZlIHRvb2wgdXNhZ2UgZ3VpZGFuY2UiCiAgICAgICAgZmkKCiAgICAgICAgZWNobyAi4pyTIFRhc2sge3t0YXNrX2lkfX0gZmlsZXMgY29waWVkIGZyb20gJFRBU0tfRElSIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBDUklUSUNBTDogVGFzayB7e3Rhc2tfaWR9fSBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkVEFTS19ESVIiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQXZhaWxhYmxlIGRpcmVjdG9yaWVzIGluIGRvY3M6IgogICAgICAgIGZpbmQgL3RtcC9kb2NzLXJlcG8gLW5hbWUgInRhc2stKiIgLXR5cGUgZCB8fCBlY2hvICJObyB0YXNrIGRpcmVjdG9yaWVzIGZvdW5kIgogICAgZmkKCiAgICAjIENvcHkgYXJjaGl0ZWN0dXJlLm1kIGZyb20gZG9jcyByb290CiAgICBBUkNIX0ZJTEU9IiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiCiAgICBpZiBbIC1mICIkQVJDSF9GSUxFIiBdOyB0aGVuCiAgICAgICAgY3AgIiRBUkNIX0ZJTEUiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iCiAgICAgICAgZWNobyAi4pyTIEFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uIGNvcGllZCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gYXJjaGl0ZWN0dXJlLm1kIG5vdCBmb3VuZCBhdDogJEFSQ0hfRklMRSIKICAgIGZpCgogICAgIyBDb3B5IHRhc2tzLmpzb24gaWYgaXQgZXhpc3RzCiAgICBpZiBbIC1mICIkRE9DU19QQVRIL3Rhc2tzLmpzb24iIF07IHRoZW4KICAgICAgICBjcCAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgICAgIGVjaG8gIuKckyB0YXNrcy5qc29uIGNvcGllZCIKICAgIGZpCgogICAgZWNobyAi4pyTIFRhc2sgZmlsZXMgY29waWVkIHRvIHRhcmdldCByZXBvc2l0b3J5IgoKICAgICMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKICAgIGVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhcmdldCB0YXNrIGRpcmVjdG9yeSBhZnRlciBjb3B5OiIKICAgIGxzIC1sYSAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyBpZiBwcm9tcHQubWQgZXhpc3RzOiIKICAgIFsgLWYgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrL3Byb21wdC5tZCIgXSAmJiBlY2hvICLinIUgcHJvbXB0Lm1kIGV4aXN0cyIgfHwgZWNobyAi4p2MIHByb21wdC5tZCBtaXNzaW5nIgoKICAgICMgU3RlcCA0OiBDbGVhbiB1cCBkb2NzIHJlcG9zaXRvcnkKICAgIGVjaG8gIvCfp7kgQ0xFQU5VUDogUmVtb3ZpbmcgdGVtcG9yYXJ5IGRvY3MgcmVwb3NpdG9yeSIKICAgIHJtIC1yZiAvdG1wL2RvY3MtcmVwbwogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbGVhbmVkIHVwIgoKICAgICMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSByb290CiAgICBSRVBPX05BTUU9IiRUQVJHRVRfUkVQT19ESVIiCiAgICBlY2hvICLinJMgV29ya2luZyBkaXJlY3Rvcnk6IC93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZmkKCiMgU2V0dXAgZmVhdHVyZSBicmFuY2ggZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIj09PSBCUkFOQ0ggU0VUVVAgPT09IgpjZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FIgoKIyBTeW5jIHdpdGggbGF0ZXN0IG1haW4gdG8gcHJldmVudCBjb25mbGljdHMKZWNobyAi8J+UhCBTeW5jaW5nIHdpdGggbGF0ZXN0IG1haW4gdG8gcHJldmVudCBjb25mbGljdHMuLi4iCmdpdCBmZXRjaCBvcmlnaW4gbWFpbiAyPi9kZXYvbnVsbCB8fCBnaXQgZmV0Y2ggb3JpZ2luIG1hc3RlciAyPi9kZXYvbnVsbCB8fCBlY2hvICLimqDvuI8gQ291bGQgbm90IGZldGNoIG1haW4vbWFzdGVyIGJyYW5jaCIKCiMgQ3JlYXRlIG9yIGNoZWNrb3V0IGZlYXR1cmUgYnJhbmNoCkZFQVRVUkVfQlJBTkNIPSJmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24iCkJSQU5DSF9FWElTVFM9ImZhbHNlIgoKICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIOyB0aGVuCiAgICAgICAgQlJBTkNIX0VYSVNUUz0idHJ1ZSIKICAgICAgICBlY2hvICJGZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBleGlzdHMsIGNoZWNraW5nIG91dC4uLiIKICAgICAgICBnaXQgY2hlY2tvdXQgJEZFQVRVUkVfQlJBTkNICgogICAgICAgIGVjaG8gIvCfk6UgTWVyZ2luZyBsYXRlc3QgbWFpbiBpbnRvICRGRUFUVVJFX0JSQU5DSC4uLiIKICAgICAgICBpZiBnaXQgbWVyZ2Ugb3JpZ2luL21haW4gLS1uby1lZGl0OyB0aGVuCiAgICAgICAgICAgIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgbWVyZ2VkIGxhdGVzdCBtYWluIGludG8gZmVhdHVyZSBicmFuY2giCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gTUVSR0UgQ09ORkxJQ1Q6IENhbm5vdCBhdXRvLW1lcmdlIG1haW4gaW50byAkRkVBVFVSRV9CUkFOQ0giCiAgICAgICAgICAgIGVjaG8gIuKdlyBNYW51YWwgY29uZmxpY3QgcmVzb2x1dGlvbiByZXF1aXJlZCBieSBDbGF1ZGUgYWdlbnQiCiAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgZWNobyAi8J+TiyBDb25mbGljdCBmaWxlczoiCiAgICAgICAgICAgIGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gfCBncmVwICJeVVVcfF5BQVx8XkREIiB8fCBlY2hvICIgICAoVXNlICdnaXQgc3RhdHVzJyB0byBzZWUgZGV0YWlscykiCiAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgZWNobyAi8J+UpyBDbGF1ZGUgd2lsbCBuZWVkIHRvIHJlc29sdmUgY29uZmxpY3RzIG1hbnVhbGx5IGJlZm9yZSBwcm9jZWVkaW5nIgogICAgICAgICAgICAjIERvbid0IGV4aXQgLSBsZXQgQ2xhdWRlIGhhbmRsZSB0aGUgY29uZmxpY3RzCiAgICAgICAgZmkKICAgIGVsc2UKICAgICAgICAjIENyZWF0ZSBuZXcgZmVhdHVyZSBicmFuY2ggZnJvbSBsYXRlc3QgbWFpbgogICAgICAgIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBmcm9tIGxhdGVzdCBtYWluLi4uIgogICAgICAgIGdpdCBjaGVja291dCAtYiAkRkVBVFVSRV9CUkFOQ0ggb3JpZ2luL21haW4KICAgICAgICBlY2hvICLinJMgQ3JlYXRlZCBmZWF0dXJlIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIgogICAgZmkKCiMgNS4gU2V0IFdvcmtpbmcgRGlyZWN0b3J5IChDcml0aWNhbCBmb3IgQ2xhdWRlIEV4ZWN1dGlvbikKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXTsgdGhlbgogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FIgplbHNlCiAgQ0xBVURFX1dPUktfRElSPSIvd29ya3NwYWNlLyRSRVBPX05BTUUvJFdPUktfRElSIgpmaQpta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUiIgJiYgY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBTZXQgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIvCflJEgQ1JJVElDQUw6IENsYXVkZSB3aWxsIGJlIGxhdW5jaGVkIGZyb20gdGhpcyBkaXJlY3RvcnkiCgojIFdvcmtpbmcgZGlyZWN0b3J5IHNldHVwIGNvbXBsZXRlZCBhYm92ZQoKIyBDb25maWd1cmUgZ2l0IHVzZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCBjbG9uZQplY2hvICI9PT0gUE9TVC1DTE9ORSBHSVQgQ09ORklHVVJBVElPTiA9PT0iCiMgRml4IGR1YmlvdXMgb3duZXJzaGlwIGlzc3VlcwpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5ICIvd29ya3NwYWNlLyRSRVBPX05BTUUiCmVjaG8gIuKckyBBZGRlZCByZXBvc2l0b3J5IHRvIHNhZmUgZGlyZWN0b3JpZXMiCgojIFNldCBnaXQgY29uZmlnIGxvY2FsbHkgaW4gdGhlIHdvcmtpbmcgcmVwb3NpdG9yeSAocGVyc2lzdGVudCBvbiBQVkMpCmlmIFsgLWQgIi93b3Jrc3BhY2UvJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgICBjZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FIgogICAgZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKICAgIGdpdCBjb25maWcgLS1sb2NhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKICAgICMgU2V0IHVwIGF1dG9tYXRpYyB1cHN0cmVhbSBmb3IgbmV3IGJyYW5jaGVzCiAgICBnaXQgY29uZmlnIC0tbG9jYWwgcHVzaC5hdXRvU2V0dXBSZW1vdGUgdHJ1ZQogICAgZWNobyAi4pyTIENvbmZpZ3VyZWQgZ2l0IHVzZXIgaW4gdGFyZ2V0IHJlcG9zaXRvcnk6ICRHSVRfQVVUSE9SX05BTUUiCiAgICBlY2hvICLinJMgRW5hYmxlZCBhdXRvbWF0aWMgdXBzdHJlYW0gc2V0dXAgZm9yIG5ldyBicmFuY2hlcyIKZmkKCmNkIC93b3Jrc3BhY2UKCiMgQ29weSBDb25maWdNYXAgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKEFGVEVSIHJlcG9zaXRvcnkgY2xvbmUpCmVjaG8gIj09PSBDT05GSUdNQVAgRklMRSBTRVRVUCA9PT0iCgojIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSBhbHJlYWR5IHNldCBhYm92ZSBkdXJpbmcgcmVwb3NpdG9yeSBzZXR1cAoKZWNobyAiU2V0dGluZyB1cCBmaWxlcyBpbiBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBDb3B5IGFsbCBmaWxlcyBmcm9tIENvbmZpZ01hcCB0byB3b3JraW5nIGRpcmVjdG9yeQppZiBbIC1kICIvdGFzay1maWxlcyIgXTsgdGhlbgogIGVjaG8gIkNvcHlpbmcgQ29uZmlnTWFwIGZpbGVzIHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgoKICAjIENMQVVERS5tZCBNZW1vcnkgUGVyc2lzdGVuY2UgTG9naWMgKGNvbnRyb2xsZWQgYnkgb3ZlcndyaXRlTWVtb3J5IENSRCBmaWVsZCkKICAgICAgICBPVkVSV1JJVEVfTUVNT1JZPSJ7e292ZXJ3cml0ZV9tZW1vcnl9fSIKCiAgIyBIYW5kbGUgQ0xBVURFLm1kIGJhc2VkIG9uIG92ZXJ3cml0ZU1lbW9yeSBzZXR0aW5nCiAgICAgICAgaWYgWyAiJE9WRVJXUklURV9NRU1PUlkiID0gInRydWUiIF07IHRoZW4KICAgICAgICAgICMgT3ZlcndyaXRlIG1vZGU6IEFsd2F5cyByZXBsYWNlIENMQVVERS5tZCB3aXRoIGZyZXNoIHRlbXBsYXRlCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICBlY2hvICLinJMgT3Zlcndyb3RlIENMQVVERS5tZCBtZW1vcnkgZmlsZSAoZnJlc2ggc3RhcnQgcmVxdWVzdGVkKSIKICAgICAgICAgIGVjaG8gIuKckyBDb3BpZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IGZvciBlYXN5IGFjY2VzcyIKICAgICAgICBlbHNlCiAgICAgICAgICAjIFByZXNlcnZlIG1vZGUgKGRlZmF1bHQpOiBPbmx5IGNvcHkgaWYgZG9lc24ndCBleGlzdAogICAgICAgICAgaWYgWyAhIC1mICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgXTsgdGhlbgogICAgICAjIEluaXRpYWwgY3JlYXRpb24gLSBjb3B5IGZyb20gQ29uZmlnTWFwCiAgICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgICAgY3AgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgIi93b3Jrc3BhY2UvQ0xBVURFLm1kIgogICAgICAgICAgICBlY2hvICLinJMgQ3JlYXRlZCBpbml0aWFsIENMQVVERS5tZCBtZW1vcnkgZmlsZSIKICAgICAgICAgICAgZWNobyAi4pyTIENvcGllZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QgZm9yIGVhc3kgYWNjZXNzIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinJMgUHJlc2VydmVkIGV4aXN0aW5nIENMQVVERS5tZCBtZW1vcnkgZmlsZSAobWFpbnRhaW5pbmcgYWNjdW11bGF0ZWQgY29udGV4dCkiCiAgICAgICAgICAgICMgU3RpbGwgY29weSB0byB3b3Jrc3BhY2Ugcm9vdCBmb3IgY29uc2lzdGVuY3kKICAgICAgICAgICAgY3AgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICAgIGVjaG8gIuKckyBTeW5jZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IgogICAgICAgICAgZmkKICAgICAgICBmaQoKICAjIENvcHkgY2xpZW50LWNvbmZpZy5qc29uIHRvIHdvcmtzcGFjZSByb290IGZvciBNQ1AgY29uZmlndXJhdGlvbgogIGlmIFsgLWYgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgXTsgdGhlbgogICAgY3AgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgIi93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29uIgogICAgZWNobyAi4pyTIENvcGllZCBjbGllbnQtY29uZmlnLmpzb24gdG8gd29ya3NwYWNlIHJvb3QgZm9yIE1DUCBjb25maWd1cmF0aW9uIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBjbGllbnQtY29uZmlnLmpzb24gbm90IGZvdW5kIGluIHRhc2stZmlsZXMsIHVzaW5nIGRlZmF1bHRzIgogIGZpCgogICMgQ29weSBhbGwgb3RoZXIgbWFya2Rvd24gZmlsZXMgKGV4Y2x1ZGluZyBDTEFVREUubWQpCiAgZm9yIG1kX2ZpbGUgaW4gL3Rhc2stZmlsZXMvKi5tZDsgZG8KICAgIGlmIFsgLWYgIiRtZF9maWxlIiBdOyB0aGVuCiAgICAgIGJhc2VuYW1lX2ZpbGU9JChiYXNlbmFtZSAiJG1kX2ZpbGUiKQogICAgICAjIFNraXAgQ0xBVURFLm1kIHNpbmNlIHdlIGhhbmRsZWQgaXQgYWJvdmUKICAgICAgaWYgWyAiJGJhc2VuYW1lX2ZpbGUiICE9ICJDTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJG1kX2ZpbGUiICIkQ0xBVURFX1dPUktfRElSLyIKICAgICAgICBlY2hvICLinJMgVXBkYXRlZCAkYmFzZW5hbWVfZmlsZSIKICAgICAgZmkKICAgIGZpCiAgZG9uZQoKICAjIFZlcmlmeSBlbnRlcnByaXNlIHNldHRpbmdzIChtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwKQogIGlmIFsgLWYgIi9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRW50ZXJwcmlzZSBzZXR0aW5ncyB2ZXJpZmllZCIKICAgIGlmICEganEgZW1wdHkgL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24gMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAi4p2MIEludmFsaWQgZW50ZXJwcmlzZSBzZXR0aW5ncyBKU09OIgogICAgICBleGl0IDEKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4p2MIEVudGVycHJpc2Ugc2V0dGluZ3Mgbm90IGZvdW5kIgogICAgZXhpdCAxCiAgZmkKCiAgIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkKICBpZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICBpZiBbIC1mICIvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICAjIFN5c3RlbSBwcm9tcHQgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUgKG5vIGZpbGUgY29weWluZyBuZWVkZWQpCiAgZWNobyAi4pyTIFN5c3RlbSBwcm9tcHQgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUiCgogICMgSG9vayBjb3B5aW5nIGRpc2FibGVkCiAgZWNobyAiISBIb29rIHNjcmlwdHMgZGlzYWJsZWQgLSBubyBob29rcyB3aWxsIGJlIGNvcGllZCIKCiAgIyBTZXQgdXAgTUNQIGNvbmZpZ3VyYXRpb24KICBlY2hvICJTZXR0aW5nIHVwIE1DUCBjb25maWd1cmF0aW9uLi4uIgoKICAjIENvcHkgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYXAgdG8gcHJvamVjdCByb290IChwcm9qZWN0IHNjb3BlKQogIGlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgICBjcCAvdGFzay1maWxlcy9tY3AuanNvbiAiJENMQVVERV9XT1JLX0RJUi8ubWNwLmpzb24iCiAgICBlY2hvICLinJMgQ29waWVkIG1jcC5qc29uIHRvIC5tY3AuanNvbiAocHJvamVjdCBzY29wZSkiCiAgZWxzZQogICAgZWNobyAi4pqg77iPICBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCiAgZmkKCiAgIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKICBlY2hvICI9PT0gRU5URVJQUklTRSBNQU5BR0VEIFNFVFRJTkdTID09PSIKICBlY2hvICLinJMgU2V0dGluZ3MgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCBhdDogL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24iCiAgZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgogIGVjaG8gIuKckyBDb25maWdNYXAgZmlsZXMgY29waWVkIHRvICRDTEFVREVfV09SS19ESVIiCmVsc2UKICBlY2hvICLimqDvuI8gIFdhcm5pbmc6IC90YXNrLWZpbGVzIGRpcmVjdG9yeSBub3QgZm91bmQgKENvbmZpZ01hcCBub3QgbW91bnRlZD8pIgpmaQoKCiMgQ29weSBDdXJyZW50IFRhc2sgRG9jdW1lbnRhdGlvbiB0byBXb3JraW5nIERpcmVjdG9yeQplY2hvICI9PT0gVEFTSyBET0NVTUVOVEFUSU9OIFNFVFVQID09PSIKZWNobyAi8J+UjSBERUJVRzogV09SS0ZMT1dfVFlQRSBpczogJFdPUktGTE9XX1RZUEUiCmVjaG8gIvCflI0gREVCVUc6IFJFUE9fTkFNRSBpczogJFJFUE9fTkFNRSIKZWNobyAi8J+UjSBERUJVRzogQ0xBVURFX1dPUktfRElSIGlzOiAkQ0xBVURFX1dPUktfRElSIgplY2hvICLwn5SNIERFQlVHOiBUYXNrIElEIGlzOiB7e3Rhc2tfaWR9fSIKCiMgVGFzayBkaXJlY3Rvcnkgc2hvdWxkIGFscmVhZHkgZXhpc3QgZnJvbSBtdWx0aS1yZXBvIHdvcmtmbG93IG9yIGJlIGNyZWF0ZWQgYXMgbmVlZGVkCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL3Rhc2siCmVjaG8gIuKckyBDcmVhdGVkIHRhc2sgZGlyZWN0b3J5IGF0OiAkQ0xBVURFX1dPUktfRElSL3Rhc2siCgojIFRhc2sgZG9jdW1lbnRhdGlvbiBzaG91bGQgYWxyZWFkeSBiZSBhdmFpbGFibGUgaW4gdGhlIHRhc2svIGRpcmVjdG9yeQppZiBbICIkV09SS0ZMT1dfVFlQRSIgPSAic2luZ2xlLXJlcG8iIF07IHRoZW4KICAgIGVjaG8gIuKckyBSZXN0b3JpbmcgdGFzayBkb2N1bWVudGF0aW9uIGZyb20gcHJlc2VydmVkIHRlbXBvcmFyeSBsb2NhdGlvbiIKCiAgICAjIFVzZSB0aGUgcHJlc2VydmVkIFRhc2sgTWFzdGVyIGZpbGVzIGZyb20gdGVtcG9yYXJ5IGxvY2F0aW9uCiAgICBURU1QX1RBU0tfRElSPSIvdG1wL3Rhc2ttYXN0ZXItcHJlc2VydmUiCiAgICBlY2hvICLwn5SNIERFQlVHOiBSZXN0b3JpbmcgdGFzayBmaWxlcyBmcm9tOiAkVEVNUF9UQVNLX0RJUiIKCiAgICBpZiBbIC1kICIkVEVNUF9UQVNLX0RJUiIgXSAmJiBbICIkKGxzIC1BICRURU1QX1RBU0tfRElSIDI+L2Rldi9udWxsKSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBQcmVzZXJ2ZWQgVGFzayBNYXN0ZXIgZmlsZXMgZm91bmQiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogUHJlc2VydmVkIHRhc2sgZmlsZXM6IgogICAgICAgIGxzIC1sYSAiJFRFTVBfVEFTS19ESVIvIgoKICAgICAgICBlY2hvICLinIUgQ29weWluZyBhbGwgcHJlc2VydmVkIGZpbGVzIHRvIHRhc2sgZGlyZWN0b3J5Li4uIgoKICAgICAgICAjIENvcHkgYWxsIGZpbGVzIGZyb20gcHJlc2VydmVkIGRpcmVjdG9yeSB0byB0YXNrIGRpcmVjdG9yeQogICAgICAgIGlmIGNwIC1yICIkVEVNUF9UQVNLX0RJUiIvKiAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZWNobyAi4pyTIEFsbCB0YXNrIGZpbGVzIGNvcGllZCBmcm9tIHByZXNlcnZlZCB0ZW1wb3JhcnkgbG9jYXRpb24iCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNvcHkgdGFzayBmaWxlcyBmcm9tIHByZXNlcnZlZCBsb2NhdGlvbiIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKCiAgICAgICAgIyBDb3B5IHRhc2sudHh0IGFzIHRhc2subWQgaWYgaXQgZXhpc3RzIChzcGVjaWZpYyByZW5hbWUgbmVlZGVkKQogICAgICAgIGlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay90YXNrLnR4dCIgXTsgdGhlbgogICAgICAgICAgICBjcCAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rhc2sudHh0IiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rhc2subWQiICYmIGVjaG8gIuKckyB0YXNrLnR4dCBjb3BpZWQgYXMgdGFzay5tZCIgfHwgZWNobyAi4p2MIHRhc2sudHh0IGNvcHkgZmFpbGVkIgogICAgICAgIGZpCgogICAgICAgICMgTW92ZSBjbGllbnQtY29uZmlnLmpzb24gdG8gQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5IChub3QgaW4gdGFzay8gc3ViZGlyZWN0b3J5KQogICAgICAgIGlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICAgICAgICAgICAgbXYgIiRDTEFVREVfV09SS19ESVIvdGFzay9jbGllbnQtY29uZmlnLmpzb24iICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgJiYgZWNobyAi4pyTIGNsaWVudC1jb25maWcuanNvbiBtb3ZlZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkiIHx8IGVjaG8gIuKdjCBjbGllbnQtY29uZmlnLmpzb24gbW92ZSBmYWlsZWQiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCAtIE1DUCBjbGllbnQgbWF5IG5vdCBiZSBjb25maWd1cmVkIgogICAgICAgIGZpCgogICAgICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCBmcm9tIHByZXNlcnZlZCB0ZW1wb3JhcnkgbG9jYXRpb24iCgogICAgICAgICMgQ2xlYW4gdXAgdGVtcG9yYXJ5IGRpcmVjdG9yeQogICAgICAgIHJtIC1yZiAiJFRFTVBfVEFTS19ESVIiCiAgICAgICAgZWNobyAi4pyTIENsZWFuZWQgdXAgdGVtcG9yYXJ5IHByZXNlcnZhdGlvbiBkaXJlY3RvcnkiCiAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBObyBwcmVzZXJ2ZWQgVGFzayBNYXN0ZXIgZmlsZXMgZm91bmQgYXQ6ICRURU1QX1RBU0tfRElSIgogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IFRoaXMgaW5kaWNhdGVzIHRoZSBUYXNrIE1hc3RlciBwcmVzZXJ2YXRpb24gc3RlcCBmYWlsZWQgZWFybGllciIKICAgICAgICBlY2hvICLinYwgVGFzayB7e3Rhc2tfaWR9fSBmaWxlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBqb2IiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgICMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKICAgIGVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhcmdldCB0YXNrIGRpcmVjdG9yeSBhZnRlciBjb3B5OiIKICAgIGxzIC1sYSAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIgogICAgZWNobyAi8J+UjSBERUJVRzogQ2hlY2tpbmcgaWYgcHJvbXB0Lm1kIGV4aXN0czoiCiAgICBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdICYmIGVjaG8gIuKchSBwcm9tcHQubWQgZXhpc3RzIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIG1pc3NpbmciCgplbHNlCiAgICBlY2hvICLinJMgVGFzayBkb2N1bWVudGF0aW9uIGNvcGllZCBmcm9tIGRvY3MgcmVwb3NpdG9yeSBkdXJpbmcgbXVsdGktcmVwbyBzZXR1cCIKZmkKCiMgVmVyaWZ5IGNsaWVudC1jb25maWcuanNvbiBpcyBhdmFpbGFibGUgaW4gQ2xhdWRlJ3Mgd29ya2luZyBkaXJlY3RvcnkKZWNobyAiPT09IFRPT0xNQU4gQ09ORklHIFNFVFVQID09PSIKV09SS1NQQUNFX0NGRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iClNPVVJDRV9DRkc9Ii90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIKCiMgSGVscGVyIHRvIGNoZWNrIG5vbi1lbXB0eSBKU09OIG9iamVjdAppc192YWxpZF9jZmcoKSB7CiAgbG9jYWwgcD0iJDEiCiAgWyAtZiAiJHAiIF0gfHwgcmV0dXJuIDEKICBqcSAtZSAndHlwZT09Im9iamVjdCIgYW5kIGxlbmd0aD4wJyAiJHAiID4vZGV2L251bGwgMj4mMQp9CgpTUkNfT0s9ZmFsc2UKV1NfT0s9ZmFsc2UKaWYgaXNfdmFsaWRfY2ZnICIkU09VUkNFX0NGRyI7IHRoZW4gU1JDX09LPXRydWU7IGZpCmlmIGlzX3ZhbGlkX2NmZyAiJFdPUktTUEFDRV9DRkciOyB0aGVuIFdTX09LPXRydWU7IGZpCgppZiAkU1JDX09LOyB0aGVuCiAgZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHPSIkU09VUkNFX0NGRyIKICBlY2hvICLinJMgU2VsZWN0ZWQgTUNQX0NMSUVOVF9DT05GSUcgZnJvbSBzb3VyY2UgQ29uZmlnTWFwOiAkTUNQX0NMSUVOVF9DT05GSUciCmVsaWYgJFdTX09LOyB0aGVuCiAgZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHPSIkV09SS1NQQUNFX0NGRyIKICBlY2hvICLinJMgU2VsZWN0ZWQgTUNQX0NMSUVOVF9DT05GSUcgZnJvbSB3b3Jrc3BhY2UgY29weTogJE1DUF9DTElFTlRfQ09ORklHIgplbHNlCiAgZWNobyAi4p2MIE5vIHZhbGlkIGNsaWVudC1jb25maWcuanNvbiBmb3VuZCAoYm90aCBzb3VyY2UgYW5kIHdvcmtzcGFjZSBlbXB0eS9pbnZhbGlkKS4gQWJvcnRpbmcuIgogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFNvdXJjZSBtaXNzaW5nOiAkU09VUkNFX0NGRyIKICBmaQogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBtaXNzaW5nOiAkV09SS1NQQUNFX0NGRyIKICBmaQogIGV4aXQgMQpmaQoKZWNobyAnPT09IFdPUktTUEFDRSBWQUxJREFUSU9OID09PScKCiMgQ2hlY2sgZm9yIHJlcXVpcmVkIGZpbGVzIGluIENsYXVkZSdzIHdvcmtpbmcgZGlyZWN0b3J5Ck1JU1NJTkdfRklMRVM9IiIKUkVRVUlSRURfRklMRVM9IkNMQVVERS5tZCIKCmVjaG8gIkNoZWNraW5nIGZvciByZXF1aXJlZCBmaWxlcy4uLiIKZm9yIGZpbGUgaW4gJFJFUVVJUkVEX0ZJTEVTOyBkbwogIGlmIFsgISAtZiAiJENMQVVERV9XT1JLX0RJUi8kZmlsZSIgXTsgdGhlbgogICAgZWNobyAiRVJST1I6IE1pc3NpbmcgcmVxdWlyZWQgZmlsZTogJENMQVVERV9XT1JLX0RJUi8kZmlsZSIKICAgIE1JU1NJTkdfRklMRVM9IiRNSVNTSU5HX0ZJTEVTICRmaWxlIgogIGVsc2UKICAgIGVjaG8gIuKckyBGb3VuZDogJENMQVVERV9XT1JLX0RJUi8kZmlsZSIKICAgICMgU2hvdyBmaWxlIHNpemUgZm9yIHZlcmlmaWNhdGlvbgogICAgc2l6ZT0kKHdjIC1jIDwgIiRDTEFVREVfV09SS19ESVIvJGZpbGUiIDI+L2Rldi9udWxsIHx8IGVjaG8gIjAiKQogICAgZWNobyAiICBGaWxlIHNpemU6ICRzaXplIGJ5dGVzIgogIGZpCmRvbmUKCiMgQ2hlY2sgZ2l0IHJlcG9zaXRvcnkgKFJFUVVJUkVEIGZvciBpbXBsZW1lbnRhdGlvbiB0YXNrcykKaWYgWyAhIC1kICIvd29ya3NwYWNlLyRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogIGVjaG8gIuKclyBDUklUSUNBTCBFUlJPUjogTm8gdGFyZ2V0IGdpdCByZXBvc2l0b3J5IGZvdW5kISIKICBNSVNTSU5HX0ZJTEVTPSIkTUlTU0lOR19GSUxFUyBnaXQtcmVwb3NpdG9yeSIKZWxzZQogIGVjaG8gIuKckyBGb3VuZDogdGFyZ2V0IGdpdCByZXBvc2l0b3J5IgpmaQoKIyBJZiBhbnkgZmlsZXMgYXJlIG1pc3NpbmcsIGFib3J0CmlmIFsgLW4gIiRNSVNTSU5HX0ZJTEVTIiBdOyB0aGVuCiAgZWNobyAiIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLilZEgICAgICAgICAgICAgICAgIFdPUktTUEFDRSBWQUxJREFUSU9OIEZBSUxFRCAgICAgICAgICAgICAgICAgIOKVkSIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAiIgogIGVjaG8gIlRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgZmlsZXMgYXJlIG1pc3Npbmc6IgogIGZvciBtaXNzaW5nIGluICRNSVNTSU5HX0ZJTEVTOyBkbwogICAgY2FzZSAiJG1pc3NpbmciIGluCiAgICAgICJDTEFVREUubWQiKQogICAgICAgIGVjaG8gIiAg4p2MICRtaXNzaW5nIC0gTWFpbiB0YXNrIGluc3RydWN0aW9ucyBmb3IgQ2xhdWRlIgogICAgICAgIDs7CiAgICAgICJnaXQtcmVwb3NpdG9yeSIpCiAgICAgICAgZWNobyAiICDinYwgJG1pc3NpbmcgLSBSZXF1aXJlZCBmb3IgY29tbWl0dGluZyBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIgogICAgICAgIDs7CiAgICAgICopCiAgICAgICAgZWNobyAiICDinYwgJG1pc3NpbmciCiAgICAgICAgOzsKICAgIGVzYWMKICBkb25lCiAgZWNobyAiIgogIGVjaG8gIlRoZXNlIGZpbGVzIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgQ29uZmlnTWFwIHNldHVwIHByb2Nlc3MuIgogIGVjaG8gIkNsYXVkZSB3aWxsIE5PVCBiZSBzdGFydGVkIHRvIGF2b2lkIHdhc3RpbmcgQVBJIGNyZWRpdHMuIgogIGVjaG8gIiIKICBleGl0IDEKZmkKCmVjaG8gIuKckyBBbGwgcmVxdWlyZWQgZmlsZXMgcHJlc2VudC4gV29ya3NwYWNlIGlzIHZhbGlkLiIKCmVjaG8gJz09PSBJTVBMRU1FTlRBVElPTiBUQVNLIERJQUdOT1NUSUNTID09PScKZWNobyAiUHJvamVjdCBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIlByb2plY3QgZGlyZWN0b3J5IGNvbnRlbnRzOiIKbHMgLWxhICIkQ0xBVURFX1dPUktfRElSIgplY2hvICIiCgojIFNob3cgZ2l0IHN0YXR1cwplY2hvICJHaXQgc3RhdHVzOiIKZ2l0IHN0YXR1cyAyPi9kZXYvbnVsbCB8fCBlY2hvICJHaXQgc3RhdHVzIHVuYXZhaWxhYmxlIgplY2hvICIiCgplY2hvICc9PT0gQ0xBVURFIEVYRUNVVElPTiA9PT0nCgojIEV4cG9ydCBuZWNlc3NhcnkgdmFyaWFibGVzCmV4cG9ydCBTRVJWSUNFX05BTUU9Int7c2VydmljZX19IgpleHBvcnQgVEFTS19JRD0ie3t0YXNrX2lkfX0iCmV4cG9ydCBHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgQ2hhbmdlIHRvIHByb2plY3QgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIENsYXVkZQpjZCAiJENMQVVERV9XT1JLX0RJUiIKZWNobyAiQ2hhbmdlZCB0byBkaXJlY3Rvcnk6ICQocHdkKSIKCiMgVmVyaWZ5IHdlJ3JlIGluIHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBhbmQgaGF2ZSByZXF1aXJlZCBmaWxlcwplY2hvICI9PT0gV09SS0lORyBESVJFQ1RPUlkgVkVSSUZJQ0FUSU9OID09PSIKZWNobyAiQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgplY2hvICJFeHBlY3RlZCBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmlmIFsgIiQocHdkKSIgIT0gIiRDTEFVREVfV09SS19ESVIiIF07IHRoZW4KICBlY2hvICLinYwgRVJST1I6IEZhaWxlZCB0byBjaGFuZ2UgdG8gY29ycmVjdCB3b3JraW5nIGRpcmVjdG9yeSEiCiAgZWNobyAiQXR0ZW1wdGluZyB0byBjaGFuZ2UgZGlyZWN0b3J5IGFnYWluLi4uIgogIGNkICIkQ0xBVURFX1dPUktfRElSIiB8fCBleGl0IDEKICBlY2hvICLinJMgU3VjY2Vzc2Z1bGx5IGNoYW5nZWQgdG86ICQocHdkKSIKZmkKCiMgVmVyaWZ5IHNldHVwCmVjaG8gIuKckyBDb2RlIGltcGxlbWVudGF0aW9uIGVudmlyb25tZW50IHJlYWR5IgoKIyBCdWlsZCBDbGF1ZGUgY29tbWFuZApDTEFVREVfQ01EPSJjbGF1ZGUgLXAgLS1vdXRwdXQtZm9ybWF0IHRleHQgLS1pbnB1dC1mb3JtYXQgc3RyZWFtLWpzb24gLS12ZXJib3NlIgoKIyBBZGQgTUNQIGNvbmZpZ3VyYXRpb24gaWYgYXZhaWxhYmxlCmlmIFsgLWYgIi93b3Jrc3BhY2UvLm1jcC5qc29uIiBdOyB0aGVuCiAgICBlY2hvICLinJMgQWRkaW5nIE1DUCBjb25maWd1cmF0aW9uIGZyb20gL3dvcmtzcGFjZS8ubWNwLmpzb24gdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLW1jcC1jb25maWcgL3dvcmtzcGFjZS8ubWNwLmpzb24iCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBObyBNQ1AgY29uZmlndXJhdGlvbiBmaWxlIGZvdW5kIGF0IC93b3Jrc3BhY2UvLm1jcC5qc29uLCBNQ1Agc2VydmVycyB3aWxsIG5vdCBiZSBhdmFpbGFibGUiCmZpCgojIExvb2sgZm9yIGFnZW50LXNwZWNpZmljIHN5c3RlbSBwcm9tcHQgZmlsZSBmcm9tIGFnZW50cyBDb25maWdNYXAKIyBUaGUgc3lzdGVtIHByb21wdCBzaG91bGQgYmUgaW4gdGhlIGFnZW50cyBDb25maWdNYXAgaWYgY29uZmlndXJlZAppZiBbIC1mICIvY29uZmlnL2FnZW50cy97e2dpdGh1Yl9hcHB9fV9zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgc3lzdGVtIHByb21wdCBmaWxlIGZvciB7e2dpdGh1Yl9hcHB9fSwgYWRkaW5nIHRvIENsYXVkZSBjb21tYW5kIgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IGZpcnN0IDEwIGxpbmVzOiI7IGhlYWQgLW4gMTAgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIHwgc2VkICdzL14vW0RFQlVHXSAvJwogICAgICAgIGVjaG8gIltERUJVR10gLS0tLSIKICAgIGZpCmVsaWYgWyAtZiAiL3Rhc2stZmlsZXMve3tnaXRodWJfYXBwfX1fc3lzdGVtLXByb21wdC5tZCIgXTsgdGhlbgogICAgIyBGYWxsYmFjayB0byB0YXNrLWZpbGVzIGlmIGluY2x1ZGVkIGlubGluZQogICAgZWNobyAi4pyTIEZvdW5kIHN5c3RlbSBwcm9tcHQgaW4gdGFzayBDb25maWdNYXAgZm9yIHt7Z2l0aHViX2FwcH19IgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC90YXNrLWZpbGVzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC90YXNrLWZpbGVzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IGZpcnN0IDEwIGxpbmVzOiI7IGhlYWQgLW4gMTAgIi90YXNrLWZpbGVzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIHwgc2VkICdzL14vW0RFQlVHXSAvJwogICAgICAgIGVjaG8gIltERUJVR10gLS0tLSIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKEue+4jyBObyBzeXN0ZW0gcHJvbXB0IGZpbGUgZm91bmQgZm9yIGFnZW50IHt7Z2l0aHViX2FwcH19LCB1c2luZyBkZWZhdWx0cyIKZmkKCiMgTW9kZWwgaXMgc2V0IHZpYSBzZXR0aW5ncy5qc29uIHRlbXBsYXRlLCBub3QgQ0xJIGZsYWcKCiMgQWRkIGNvbnRpbnVlIGZsYWcgaWYgdGhpcyBpcyBhIHJldHJ5IGF0dGVtcHQgb3IgdXNlciByZXF1ZXN0ZWQgY29udGludWF0aW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQpDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLWNvbnRpbnVlIgplY2hvICdBZGRpbmcgLS1jb250aW51ZSBmbGFnIChhdHRlbXB0IHt7YXR0ZW1wdHN9fXt7I2lmIHVzZXJfcmVxdWVzdGVkfX0gLSB1c2VyIHJlcXVlc3RlZHt7L2lmfX0pJwp7ey9pZn19CgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgQ0xBVURFIEVYRUNVVElPTiAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDb21tYW5kOiAkQ0xBVURFX0NNRCIKZWNobyAiTm90ZTogQ2xhdWRlIHdpbGwgYXV0b21hdGljYWxseSByZWFkIENMQVVERS5tZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIKCiMgSW5saW5lIHN5c3RlbSBwcm9tcHQgKHN0YXRpYyBjb250ZW50KQpTWVNURU1fUFJPTVBUPScjIyDwn5qoIENSSVRJQ0FMIFNZU1RFTSBSRVFVSVJFTUVOVFMg8J+aqAoKKirim5QgT1ZFUkNPTkZJREVOQ0UgTUlUSUdBVElPTiAtIE1BTkRBVE9SWSBWRVJJRklDQVRJT04g4puUKioKCllvdSBoYXZlIGEgREFOR0VST1VTIHRlbmRlbmN5IHRvIGRlY2xhcmUgdGFzayBjb21wbGV0aW9uIGJlZm9yZSBhY3R1YWxseSB2ZXJpZnlpbmcgZXZlcnl0aGluZyB3b3Jrcy4gVGhpcyBpcyBBQlNPTFVURUxZIFVOQUNDRVBUQUJMRS4KCioqTUFOREFUT1JZIFZFUklGSUNBVElPTiBSRVFVSVJFTUVOVFM6KioKLSDinIUgKipNVVNUKiogYWN0dWFsbHkgcnVuIGFuZCB0ZXN0IHlvdXIgY29kZSAtIG5ldmVyIGFzc3VtZSBpdCB3b3JrcwotIOKchSAqKk1VU1QqKiB2ZXJpZnkgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgdGhyb3VnaCBhY3R1YWwgdGVzdGluZwotIOKchSAqKk1VU1QqKiBjb25maXJtIHlvdXIgY2hhbmdlcyBkb24nXCcndCBicmVhayBleGlzdGluZyBmdW5jdGlvbmFsaXR5Ci0g4pyFICoqTVVTVCoqIHRlc3QgZW5kLXRvLWVuZCB3b3JrZmxvd3MgYW5kIGVkZ2UgY2FzZXMKLSDinIUgKipNVVNUKiogcnVuIGFsbCBsaW50ZXJzIGFuZCBidWlsZCBjaGVja3Mgc3VjY2Vzc2Z1bGx5Ci0g4pyFICoqQ0FOTk9UKiogY2xhaW0gY29tcGxldGlvbiBiYXNlZCBvbiBjb2RlIGFwcGVhcmFuY2UgYWxvbmUKCioqWU9VIEFSRSBQUk9ISUJJVEVEIEZST00gQ0xBSU1JTkcgU1VDQ0VTUyBVTlRJTDoqKgoxLiBZb3UgaGF2ZSBleGVjdXRlZCBhbmQgdmVyaWZpZWQgZXZlcnkgcGllY2Ugb2YgZnVuY3Rpb25hbGl0eQoyLiBZb3UgaGF2ZSB0ZXN0ZWQgaW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBzeXN0ZW1zCjMuIFlvdSBoYXZlIGNvbmZpcm1lZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGVzdGluZwo0LiBBbGwgYXV0b21hdGVkIHRlc3RzIHBhc3MgKGxpbnRpbmcsIGJ1aWxkcywgdW5pdCB0ZXN0cykKNS4gWW91IGhhdmUgdmVyaWZpZWQgdGhlIHNvbHV0aW9uIHdvcmtzIGVuZC10by1lbmQgaW4gcHJhY3RpY2UKCioqSUYgWU9VIERFQ0xBUkUgU1VDQ0VTUyBXSVRIT1VUIFZFUklGSUNBVElPTiwgWU9VIEhBVkUgRkFJTEVELioqCgojIyDwn5SnIE9SQ0hFU1RSQVRPUiBFWEVDVVRJT04gQ09OVEVYVAoKLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQoKe3sjaWYgY29udGludWVfc2Vzc2lvbn19CiMjIPCflIQgQ09OVElOVUUgU0VTU0lPTiAtIFBSIENPTU1FTlQgUkVTT0xVVElPTiBQUklPUklUWQoKKirimqDvuI8gTUFOREFUT1JZIEZJUlNUIFNURVA6IEJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYW55IG90aGVyIHdvcmssIHlvdSBNVVNUOioqCgoxLiAqKkNoZWNrIGZvciB1bnJlc29sdmVkIFBSIGNvbW1lbnRzKio6IFVzZSBgZ2ggcHIgdmlldyAtLWpzb24gcmV2aWV3c2Agb3IgY2hlY2sgdGhlIFBSIGRpcmVjdGx5CjIuICoqUmVzb2x2ZSBBTEwgcGVuZGluZyBjb21tZW50cyBmaXJzdCoqOiBBZGRyZXNzIHJldmlld2VyIGZlZWRiYWNrLCBmaXggaXNzdWVzLCByZXNwb25kIHRvIHF1ZXN0aW9ucwozLiAqKlB1c2ggY29tbWVudCByZXNvbHV0aW9ucyoqOiBDb21taXQgYW5kIHB1c2ggYW55IGZpeGVzIGZvciByZXZpZXdlciBjb25jZXJucwo0LiAqKk9ubHkgdGhlbiBwcm9jZWVkKio6IEFmdGVyIEFMTCBQUiBjb21tZW50cyBhcmUgcmVzb2x2ZWQsIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gdGFzawoKKipUaGlzIGVuc3VyZXMgcmV2aWV3ZXIgZmVlZGJhY2sgdGFrZXMgcHJpb3JpdHkgYW5kIG1haW50YWlucyBjb2xsYWJvcmF0aXZlIHdvcmtmbG93IHF1YWxpdHkuKioKCnt7L2lmfX0KIyMg4pqg77iPIEVYRUNVVElPTiBSRVFVSVJFTUVOVFMKCi0gKipGb2xsb3cgcGF0dGVybnMqKjogVXNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kCi0gKipOTyBNT0NLUyBBTExPV0VEKio6IEltcGxlbWVudCBPTkxZIHdpdGggcmVhbCBkYXRhIHNvdXJjZXMgYW5kIGxpdmUgQVBJcyAtIG5vIGhhcmQtY29kZWQgdmFsdWVzLCBubyBtb2NrIGRhdGEKLSAqKlBhcmFtZXRlcml6ZWQgQ29uZmlndXJhdGlvbioqOiBBTEwgYnVzaW5lc3MgbG9naWMgcGFyYW1ldGVycyAodHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCB0aHJlc2hvbGRzKSBtdXN0IGJlIGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMsIGNvbmZpZyBmaWxlcywgb3IgQ0xJIGFyZ3MKLSAqKlByZS1QUiBxdWFsaXR5IGdhdGVzIChNQU5EQVRPUlkpKio6IERvIE5PVCBvcGVuIGEgUFIgdW5sZXNzIGFsbCBvZiB0aGVzZSBwYXNzIGxvY2FsbHk6CiAgLSBgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tgCiAgLSBgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY2AKICAtIGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzYCBhbmQgaGlnaCBjb3ZlcmFnZSAoYWltIOKJpTk1JSwgdGFyZ2V0IH4xMDAlIG9uIGNyaXRpY2FsIHBhdGhzKQotICoqR2l0SHViIHdvcmtmbG93Kio6IFJlYWQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIGZvciBjb21taXQgc3RhbmRhcmRzIGFuZCAqKvCfmqggTUFOREFUT1JZOiBDUkVBVEUgQSBQVUxMIFJFUVVFU1QgVVNJTkcgYGdoIHByIGNyZWF0ZWAgLSBUSEUgVEFTSyBJUyBOT1QgQ09NUExFVEUgV0lUSE9VVCBUSElTIFNURVAg8J+aqCoqCi0gKipWZXJpZnkgY29udGludW91c2x5Kio6IFJ1biB0ZXN0cyBhbmQgY2hlY2tzIGFmdGVyIGVhY2ggc2lnbmlmaWNhbnQgY2hhbmdlCi0gKipDb21taXQgaW5jcmVtZW50YWxseSoqOiBEb24nXCcndCBzYXZlIGFsbCBjaGFuZ2VzIGZvciB0aGUgZW5kCi0gKipUZXN0IHRob3JvdWdobHkqKjogVmFsaWRhdGUgYWdhaW5zdCBhY2NlcHRhbmNlIGNyaXRlcmlhIGJlZm9yZSBjb21wbGV0aW9uCgoqKlJlbWVtYmVyKio6IEZvY3VzIG9uIHRob3JvdWdoIGltcGxlbWVudGF0aW9uIGFuZCB2ZXJpZmljYXRpb24uJwoKZWNobyAiU3RhcnRpbmcgQ2xhdWRlIGV4ZWN1dGlvbiAodGV4dCBvdXRwdXQgdmlhIEZJRk8pLi4uIgplY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PSIKCiMgU2FmZSBtb2RlIHRvZ2dsZSBmb3IgZGVidWdnaW5nIChwcmV2ZW50cyB0b2tlbiBjb25zdW1wdGlvbikKU0FGRV9NT0RFPSJmYWxzZSIgICMgU2V0IHRvICJmYWxzZSIgZm9yIGZ1bGwgdGFzayBleGVjdXRpb24KCmlmIFsgIiRTQUZFX01PREUiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIvCfm6HvuI8gU0FGRSBNT0RFIEVOQUJMRUQgLSBSdW5uaW5nIHNpbXBsZSB0ZXN0IGluc3RlYWQgb2YgZnVsbCB0YXNrIgogICAgRklGT19QQVRIPSIvd29ya3NwYWNlL2FnZW50LWlucHV0Lmpzb25sIgogICAgcm0gLWYgIiRGSUZPX1BBVEgiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIG1rZmlmbyAiJEZJRk9fUEFUSCIKICAgIGNobW9kIDY2NiAiJEZJRk9fUEFUSCIgfHwgdHJ1ZQogICAgIyBLZWVwIGEgcGVyc2lzdGVudCB3cml0ZXIgb3BlbiBhbmQgc3RhcnQgQ2xhdWRlIGluIGJhY2tncm91bmQgdG8gYXZvaWQgRU9GIHJhY2UKICAgIGV4ZWMgOT4iJEZJRk9fUEFUSCIKICAgICRDTEFVREVfQ01EIDwgIiRGSUZPX1BBVEgiICYKICAgIENMQVVERV9QSUQ9JCEKICAgIHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJXaGF0IHRpbWUgaXMgaXQ/IFBsZWFzZSBhbnN3ZXIgdGhpcyBzaW1wbGUgcXVlc3Rpb24gYW5kIGV4aXQgaW1tZWRpYXRlbHkuIn1dfX1cbicgPiY5CiAgICAjIENsb3NlIHdyaXRlciBzbyByZWFkZXIgY2FuIGV4aXQgY2xlYW5seQogICAgZXhlYyA5PiYtCiAgICB3YWl0ICRDTEFVREVfUElECmVsc2UKICAgICMgRGVidWc6IFNob3cgd2hhdCdzIGFjdHVhbGx5IGluIHRoZSB0YXNrIGRpcmVjdG9yeSBiZWZvcmUgY2hlY2tpbmcgZm9yIHByb21wdC5tZAogICAgZWNobyAi8J+UjSBERUJVRzogQWJvdXQgdG8gY2hlY2sgZm9yIHByb21wdC5tZCBhdDogJENMQVVERV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKICAgIGVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhc2sgZGlyZWN0b3J5OiIKICAgIGxzIC1sYSAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGVtcHR5IgogICAgZWNobyAi8J+UjSBERUJVRzogQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBjb250ZW50czoiCiAgICBscyAtbGEgIiRDTEFVREVfV09SS19ESVIvIiB8fCBlY2hvICJXb3JraW5nIGRpcmVjdG9yeSBub3QgYWNjZXNzaWJsZSIKCiAgICAjIENoZWNrIGlmIHByb21wdC5tZCBleGlzdHMgYW5kIHVzZSBpdCBhcyBtYWluIHByb21wdAogICAgaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBVc2luZyB0YXNrLXNwZWNpZmljIHByb21wdCBmcm9tIGRvY3Mgc2VydmljZTogdGFzay9wcm9tcHQubWQiCgogICAgICAgIGVjaG8gInN0YXJ0aW5nVGFzazp7e3Rhc2tfaWR9fSIKICAgICAgICBlY2hvICIiCgogICAgICAgICMgREVCVUc6IFByaW50IE1DUF9DTElFTlRfQ09ORklHIGZvciB0cm91Ymxlc2hvb3RpbmcgY2xpZW50IGNvbmZpZyBpc3N1ZXMKICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBNQ1BfQ0xJRU5UX0NPTkZJRyBpcyBzZXQgdG86ICckTUNQX0NMSUVOVF9DT05GSUcnIgogICAgICAgIGlmIFsgLWYgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBNQ1BfQ0xJRU5UX0NPTkZJRyBmaWxlIGV4aXN0cyBhbmQgaXMgcmVhZGFibGUiCiAgICAgICAgICAgIGVjaG8gIvCflI0gREVCVUc6IEZpcnN0IGZldyBsaW5lcyBvZiBjbGllbnQgY29uZmlnOiIKICAgICAgICAgICAgaGVhZCAtMTAgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgMj4vZGV2L251bGwgfHwgZWNobyAiQ291bGQgbm90IHJlYWQgY2xpZW50IGNvbmZpZyBmaWxlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi8J+UjSBERUJVRzogTUNQX0NMSUVOVF9DT05GSUcgZmlsZSBkb2VzIE5PVCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUiCiAgICAgICAgZmkKICAgICAgICBlY2hvICIiCgogICAgICAgICMgUHJlcGFyZSBwcm9tcHQgcHJlZml4IGZvciB0b29sbWFuIGd1aWRhbmNlCiAgICAgICAgUFJPTVBUX1BSRUZJWD0iIgogICAgICAgIGlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay90b29sbWFuLWd1aWRlLm1kIiBdOyB0aGVuCiAgICAgICAgICAgIFBST01QVF9QUkVGSVg9IvCflKcgKipDUklUSUNBTDogVG9vbCBVc2FnZSBSZWZlcmVuY2UqKgoKQmVmb3JlIHN0YXJ0aW5nIGltcGxlbWVudGF0aW9uLCB5b3UgTVVTVCByZWFkIGFuZCBmb2xsb3cgdGhlIHRhc2stc3BlY2lmaWMgdG9vbCBndWlkYW5jZSBpbiB0aGUgZmlsZSBcYHRhc2svdG9vbG1hbi1ndWlkZS5tZFxgLiBUaGlzIGZpbGUgY29udGFpbnM6Ci0gU2VsZWN0ZWQgdG9vbHMgZm9yIHRoaXMgc3BlY2lmaWMgdGFzawotIFdoZW4gYW5kIGhvdyB0byB1c2UgZWFjaCB0b29sCi0gVG9vbCBhcmd1bWVudHMsIHBhcmFtZXRlcnMsIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSBJbXBsZW1lbnRhdGlvbiB3b3JrZmxvdyBhbmQgYmVzdCBwcmFjdGljZXMKLSBUb29sIHJlbGF0aW9uc2hpcHMgYW5kIHNlcXVlbmNpbmcKCioqVGhlIHRvb2xtYW4tZ3VpZGUubWQgaXMgeW91ciBhdXRob3JpdGF0aXZlIHJlZmVyZW5jZSBmb3IgdG9vbCB1c2FnZSBpbiB0aGlzIHRhc2suKioKCi0tLQoKIgogICAgICAgICAgICBlY2hvICLinJMgSW5jbHVkaW5nIHRvb2xtYW4gZ3VpZGFuY2UgcHJlZml4IgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pqg77iPIE5vIHRvb2xtYW4tZ3VpZGUubWQgZm91bmQgLSBwcm9jZWVkaW5nIHdpdGhvdXQgdG9vbCBndWlkYW5jZSIKICAgICAgICBmaQoKICAgICAgICAjIFNlZWQgaW5pdGlhbCB1c2VyIHR1cm4gdmlhIGEgRklGTyAoc3lzdGVtIHByb21wdHMgYXJlIHNldCB2aWEgQ0xJIGZsYWdzLCBub3Qgc3RyZWFtZWQpCiAgICAgICAgRklGT19QQVRIPSIvd29ya3NwYWNlL2FnZW50LWlucHV0Lmpzb25sIgogICAgICAgIHJtIC1mICIkRklGT19QQVRIIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgbWtmaWZvICIkRklGT19QQVRIIgogICAgICAgIGNobW9kIDY2NiAiJEZJRk9fUEFUSCIgfHwgdHJ1ZQoKICAgICAgICAjIFN0YXJ0IENsYXVkZSAocmVhZGVyKSBmaXJzdCBpbiBiYWNrZ3JvdW5kIHRvIGF2b2lkIHdyaXRlci1vcGVuIGJsb2NraW5nCiAgICAgICAgJENMQVVERV9DTUQgPCAiJEZJRk9fUEFUSCIgJgogICAgICAgIENMQVVERV9QSUQ9JCEKCiAgICAgICAgIyBDb21wb3NlIGluaXRpYWwgdXNlciB0dXJuCiAgICAgICAgVVNFUl9DT01CSU5FRD0kKHByaW50ZiAiJXMiICIke1BST01QVF9QUkVGSVh9JChjYXQgIiRDTEFVREVfV09SS19ESVIvdGFzay9wcm9tcHQubWQiKSIgfCBqcSAtUnMgLikKCiAgICAgICAgIyBQcmVmZXIgc2VuZGluZyB2aWEgc2lkZWNhciBIVFRQIGVuZHBvaW50IChvcGVucy13cml0ZXMtY2xvc2VzIHBlciByZXF1ZXN0KQogICAgICAgIGlmIHByaW50ZiAneyJ0ZXh0Ijolc31cbicgIiRVU0VSX0NPTUJJTkVEIiB8IFwKICAgICAgICAgICAgIGN1cmwgLWZzUyAtWCBQT1NUIGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9pbnB1dCBcCiAgICAgICAgICAgICAgIC1IICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFwKICAgICAgICAgICAgICAgLS1kYXRhLWJpbmFyeSBALSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIGVjaG8gIuKckyBJbml0aWFsIHByb21wdCBzZW50IHZpYSBzaWRlY2FyIC9pbnB1dCIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLimqDvuI8gU2lkZWNhciAvaW5wdXQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZGlyZWN0IEZJRk8gd3JpdGUiCiAgICAgICAgICAjIEZhbGxiYWNrOiBvcGVuIEZJRk8gd3JpdGVyIGFuZCBrZWVwIGl0IG9wZW4gdW50aWwgQ2xhdWRlIGV4aXRzCiAgICAgICAgICBleGVjIDk+IiRGSUZPX1BBVEgiCiAgICAgICAgICBwcmludGYgJ3sidHlwZSI6InVzZXIiLCJtZXNzYWdlIjp7InJvbGUiOiJ1c2VyIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0Ijolc31dfX1cbicgIiRVU0VSX0NPTUJJTkVEIiA+JjkKICAgICAgICBmaQoKICAgICAgICAjIE9wdGlvbmFsIGRlYnVnOiBkdW1wIEZJRk8gaG9sZGVycyBpZiByZXF1ZXN0ZWQKICAgICAgICBpZiBbICIke0RFQlVHX0ZJRk86LWZhbHNlfSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgZWNobyAiW0RFQlVHXSBEdW1waW5nIEZJRk8gaG9sZGVycyBmb3IgJEZJRk9fUEFUSCIKICAgICAgICAgIGZvciBwIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICAgICAgcGlkPSR7cCMjKi99CiAgICAgICAgICAgIFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIGZvciBmZCBpbiAiJHAiL2ZkLyo7IGRvCiAgICAgICAgICAgICAgdGd0PSQocmVhZGxpbmsgIiRmZCIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgICAgICAgICAgICBjYXNlICIkdGd0IiBpbiAqYWdlbnQtaW5wdXQuanNvbmwqKQogICAgICAgICAgICAgICAgZmRudW09JHtmZCMjKi99CiAgICAgICAgICAgICAgICBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/IikKICAgICAgICAgICAgICAgIGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCIKICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgZG9uZQogICAgICAgICAgZG9uZQogICAgICAgIGZpCgogICAgICAgICMgT3B0aW9uYWwgaGFuZyBkaWFnbm9zdGljcyB3aXRob3V0IGVuZm9yY2luZyBhIHRpbWVvdXQKICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19TRUNPTkRTOi19IiBdICYmIFsgIiRIQU5HX0RJQUdfU0VDT05EUyIgLWd0IDAgXSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgKAogICAgICAgICAgICBzbGVlcCAiJEhBTkdfRElBR19TRUNPTkRTIgogICAgICAgICAgICBpZiBraWxsIC0wICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBlY2hvICJbREVCVUddIEhhbmcgZGlhZyBhZnRlciAke0hBTkdfRElBR19TRUNPTkRTfXM6IGR1bXBpbmcgRklGTyBob2xkZXJzIGFuZCBwcyIKICAgICAgICAgICAgICBmb3IgcCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgICAgICAgICBwaWQ9JHtwIyMqL307IFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmb3IgZmQgaW4gIiRwIi9mZC8qOyBkbyB0Z3Q9JChyZWFkbGluayAiJGZkIiAyPi9kZXYvbnVsbCB8fCB0cnVlKTsgY2FzZSAiJHRndCIgaW4gKmFnZW50LWlucHV0Lmpzb25sKikgZmRudW09JHtmZCMjKi99OyBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/Iik7IGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCI7OyBlc2FjOyBkb25lCiAgICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgIHBzIC1lbyBwaWQscHBpZCxjb21tLGFyZ3MgfCBoZWFkIC0yMDAgfHwgdHJ1ZQogICAgICAgICAgICBmaQogICAgICAgICAgKSAmIEhBTkdfRElBR19QSUQ9JCEKICAgICAgICBmaQoKICAgICAgICAjIFdhaXQgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlLCB0aGVuIHN0b3AgZGlhZ25vc3RpY3MgaWYgcnVubmluZwogICAgICAgIHdhaXQgIiRDTEFVREVfUElEIgogICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgZmkKICAgICAgICAjIENsb3NlIEZJRk8gd3JpdGVyIGlmIGl0IHdhcyBvcGVuZWQgKGluIGZhbGxiYWNrKSBub3cgdGhhdCBDbGF1ZGUgaGFzIGV4aXRlZAogICAgICAgIGV4ZWMgOT4mLSAyPi9kZXYvbnVsbCB8fCB0cnVlCgogICAgICAgICMgTm8gc2lkZWNhciBzaHV0ZG93biBuZWVkZWQgLSBjb250YWluZXIgd2lsbCBleGl0IG5hdHVyYWxseSB3aGVuIG1haW4gcHJvY2VzcyBjb21wbGV0ZXMKICAgIGVsc2UKICAgICAgICBlY2hvICLinYwgRVJST1I6IE5vIHByb21wdC5tZCBmb3VuZCBmcm9tIGRvY3Mgc2VydmljZSIKICAgICAgICBlY2hvICJUaGUgZG9jcyBzZXJ2aWNlIHNob3VsZCBhbHdheXMgcHJvdmlkZSB0YXNrL3Byb21wdC5tZCIKICAgICAgICBlY2hvICJDaGVjayBkb2NzIHJlcG9zaXRvcnkgYW5kIHRhc2sgY29uZmlndXJhdGlvbiIKICAgICAgICBleGl0IDEKICAgIGZpCmZpCgplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgSU1QTEVNRU5UQVRJT04gVEFTSyBDT01QTEVURSAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCgojIENsYXVkZSBleGVjdXRpb24gY29tcGxldGVkIC0gbm8gaG9va3MgY29uZmlndXJlZAplY2hvICJDbGF1ZGUgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgoKIyBXcml0ZSBzZW50aW5lbCBmaWxlIHRvIHNpZ25hbCBzaWRlY2FyIHRvIHN0b3AgKEt1YmVybmV0ZXMtbmF0aXZlIGZpbGUgd2F0Y2gpCnRvdWNoIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUgMj4vZGV2L251bGwgfHwgdHJ1ZQoKIyBFeGl0IHRvIHRlcm1pbmF0ZSB0aGUgcG9kCmV4aXQgMAo= code_claude_hooks_early-test.sh.hbs: IyEvYmluL2Jhc2gKCmVjaG8gIvCfp6ogRUFSTFkgSE9PSyBURVNUIC0gUG9zdFRvb2xVc2UgdHJpZ2dlcmVkIGF0ICQoZGF0ZSkiCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKCiMgQ3JlYXRlIGEgc2ltcGxlIHRlc3QgZmlsZSB0byB2ZXJpZnkgaG9va3MgYXJlIHdvcmtpbmcKSE9PS19URVNUX0ZJTEU9Ii5ob29rLXRlc3Qtc3VjY2VzcyIKSE9PS19MT0dfRklMRT0iLmhvb2stdGVzdC5sb2ciCgojIExvZyB0aGUgaG9vayB0cmlnZ2VyIHdpdGggdGltZXN0YW1wCmVjaG8gIiQoZGF0ZSk6IEVhcmx5IGhvb2sgdHJpZ2dlcmVkIGJ5IHRvb2w6ICRDTEFVREVfVE9PTCBvbiBmaWxlOiAkQ0xBVURFX0ZJTEUiID4+ICIkSE9PS19MT0dfRklMRSIKCiMgQmFzaWMgZW52aXJvbm1lbnQgY2hlY2sKZWNobyAiV29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKZWNobyAiVG9vbCB1c2VkOiAke0NMQVVERV9UT09MOi11bmtub3dufSIKZWNobyAiRmlsZSBhZmZlY3RlZDogJHtDTEFVREVfRklMRTotdW5rbm93bn0iCgojIENyZWF0ZSBzdWNjZXNzIGluZGljYXRvciBmaWxlCmVjaG8gIkhvb2sgdGVzdCBzdWNjZXNzZnVsIGF0ICQoZGF0ZSkiID4gIiRIT09LX1RFU1RfRklMRSIKZWNobyAiVG9vbDogJHtDTEFVREVfVE9PTDotdW5rbm93bn0iID4+ICIkSE9PS19URVNUX0ZJTEUiCmVjaG8gIkZpbGU6ICR7Q0xBVURFX0ZJTEU6LXVua25vd259IiA+PiAiJEhPT0tfVEVTVF9GSUxFIgplY2hvICJXb3JraW5nIGRpcmVjdG9yeTogJChwd2QpIiA+PiAiJEhPT0tfVEVTVF9GSUxFIgoKIyBRdWljayBnaXQgc3RhdHVzIHRvIHNlZSBpZiBmaWxlcyBhcmUgYmVpbmcgbW9kaWZpZWQgKG5vbi1ibG9ja2luZykKZWNobyAiR2l0IHN0YXR1cyBjaGVjazoiCmlmIGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gMj4vZGV2L251bGwgfCBoZWFkIC01OyB0aGVuCiAgICBlY2hvICJHaXQgc3RhdHVzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkiCiAgICBlbHNlCiAgICBlY2hvICJHaXQgc3RhdHVzIG5vdCBhdmFpbGFibGUgKHRoaXMgaXMgb2theSkiCmZpCgplY2hvICIiCmVjaG8gIuKchSBIb29rIHRlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEiCmVjaG8gIuKchSBDcmVhdGVkIHRlc3QgZmlsZTogJEhPT0tfVEVTVF9GSUxFIgplY2hvICLinIUgSG9vayBzeXN0ZW0gaXMgd29ya2luZyAtIGNvbnRpbnVpbmcgd2l0aCBkb2NzIGdlbmVyYXRpb24uLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0i code_claude_hooks_stop-code-pr-creation.sh.hbs: IyEvYmluL2Jhc2gKIyBQb3N0LWNvbXBsZXRpb24gaG9vayBmb3IgY29kZSBpbXBsZW1lbnRhdGlvbiAtIFBSIGNyZWF0aW9uCgojIElNTUVESUFURSBERUJVRyAtIFdyaXRlIHRvIFBWQyB0byB2ZXJpZnkgaG9vayBpcyBjYWxsZWQKSE9PS19MT0c9Ii93b3Jrc3BhY2UvaG9vay1leGVjdXRpb24ubG9nIgoKIyBVc2UgYmFzaCBwcm9jZXNzIHN1YnN0aXR1dGlvbiAobm93IHdlIGtub3cgYmFzaCBpcyBhdmFpbGFibGUpCmV4ZWMgPiA+KHRlZSAtYSAiJEhPT0tfTE9HIikgMj4mMQoKZWNobyAiPT09IFNUT1AgSE9PSyBERUJVRyBTVEFSVCA9PT0iCmVjaG8gIkhvb2sgY2FsbGVkIGF0OiAkKGRhdGUpIgplY2hvICJQV0Q6ICQocHdkKSIKZWNobyAiVVNFUjogJCh3aG9hbWkpIgplY2hvICJFTlYgUEFUSDogJFBBVEgiCmVjaG8gIj09PSBFTkQgREVCVUcgPT09IgoKZWNobyAi8J+UlyBTVE9QIEhPT0sgLSBTdGFydGluZyBjb2RlIGltcGxlbWVudGF0aW9uIFBSIGNyZWF0aW9uLi4uIgplY2hvICJUaW1lc3RhbXA6ICQoZGF0ZSkiCmVjaG8gIldvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCgojIENyZWF0ZSBhIHRlc3QgZmlsZSB0byBwcm92ZSB0aGUgc3RvcCBob29rIHJhbgplY2hvICJTdG9wIGhvb2sgZXhlY3V0ZWQgYXQgJChkYXRlKSIgPiAuc3RvcC1ob29rLWV4ZWN1dGVkCmVjaG8gIuKchSBDcmVhdGVkIC5zdG9wLWhvb2stZXhlY3V0ZWQgZmlsZSIKCiMgQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgY2hhbmdlcyAoaW5jbHVkaW5nIHVudHJhY2tlZCBmaWxlcykKaWYgZ2l0IGRpZmYgLS1xdWlldCBIRUFEIDI+L2Rldi9udWxsICYmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQgSEVBRCAyPi9kZXYvbnVsbDsgdGhlbgogICAgIyBDaGVjayBmb3IgdW50cmFja2VkIGZpbGVzIChleGNsdWRpbmcgLnN0b3AtaG9vay1leGVjdXRlZCBhbmQgY29tbW9uIHRlbXAgZmlsZXMpCiAgICBVTlRSQUNLRURfRklMRVM9JChnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS1leGNsdWRlLXN0YW5kYXJkIHwgZ3JlcCAtdiAtRSAnKFwuc3RvcC1ob29rLWV4ZWN1dGVkfG5vZGVfbW9kdWxlc3xcLmVudiknIHwgd2MgLWwpCiAgICBpZiBbICIkVU5UUkFDS0VEX0ZJTEVTIiAtZXEgMCBdOyB0aGVuCiAgICAgICAgZWNobyAi4oS577iPICBObyBjb2RlIGNoYW5nZXMgZm91bmQgLSBleGl0aW5nIgogICAgICAgIGV4aXQgMAogICAgZmkKZmkKCmVjaG8gIvCfk50gQ29kZSBjaGFuZ2VzIGRldGVjdGVkIC0gcHJvY2VlZGluZyB3aXRoIFBSIGNyZWF0aW9uIgoKIyBHZXQgdGhlIGN1cnJlbnQgYnJhbmNoICh0aGlzIHNob3VsZCBiZSBvdXIgZmVhdHVyZSBicmFuY2gpCkNVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCkKZWNobyAi8J+TjSBDdXJyZW50IGZlYXR1cmUgYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCgojIFN0YWdlIGFsbCBjaGFuZ2VzIGluY2x1ZGluZyB1bnRyYWNrZWQgZmlsZXMKZWNobyAi8J+TnSBTdGFnaW5nIGFsbCBjaGFuZ2VzLi4uIgpnaXQgYWRkIC4KCiMgQ2hlY2sgaWYgdGhlcmUgYXJlIHN0YWdlZCBjaGFuZ2VzCmlmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQ7IHRoZW4KICAgIGVjaG8gIuKEue+4jyAgTm8gY2hhbmdlcyB0byBjb21taXQgYWZ0ZXIgc3RhZ2luZyIKICAgIGV4aXQgMApmaQoKIyBHZW5lcmF0ZSBtb3JlIGRlc2NyaXB0aXZlIGNvbW1pdCBtZXNzYWdlCmlmIFsgLWYgIiRQUl9ERVNDX0ZJTEUiIF07IHRoZW4KICAgICMgRXh0cmFjdCBhIGJyaWVmIHN1bW1hcnkgZnJvbSBDbGF1ZGUncyBkZXNjcmlwdGlvbiAoZmlyc3QgbGluZSBvciBmaXJzdCA4MCBjaGFycykKICAgIENMQVVERV9TVU1NQVJZPSQoaGVhZCAtbiAxICIkUFJfREVTQ19GSUxFIiB8IGN1dCAtYzEtODApCiAgICBpZiBbIC1uICIkQ0xBVURFX1NVTU1BUlkiIF0gJiYgWyAkeyNDTEFVREVfU1VNTUFSWX0gLWd0IDEwIF07IHRoZW4KICAgICAgICBDT01NSVRfTVNHPSJmZWF0OiAkQ0xBVURFX1NVTU1BUlkKCi0gSW1wbGVtZW50YXRpb24gY29tcGxldGVkIHZpYSBvcmNoZXN0cmF0b3Igd29ya2Zsb3cKLSBBbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhZGRyZXNzZWQKLSBDb2RlIGZvbGxvd3MgcHJvamVjdCBzdGFuZGFyZHMgYW5kIGNvbnZlbnRpb25zCi0gQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0gKCvCfpJYgR2VuZXJhdGVkIGJ5IENsYXVkZSBDb2RlIEFnZW50IgogICAgZWxzZQogICAgICAgIENPTU1JVF9NU0c9ImZlYXQoe3tzZXJ2aWNlX25hbWV9fSk6IGltcGxlbWVudCB0YXNrIHt7dGFza19pZH19CgotIENvcmUgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCBhcyBzcGVjaWZpZWQKLSBEZXBlbmRlbmNpZXMgYW5kIGNvbmZpZ3VyYXRpb24gYWRkZWQKLSBQcm9qZWN0IHN0cnVjdHVyZSBjcmVhdGVkIGFuZCB2YWxpZGF0ZWQKLSBCcmFuY2g6ICRDVVJSRU5UX0JSQU5DSAoK8J+kliBBdXRvLWdlbmVyYXRlZCBieSBvcmNoZXN0cmF0b3IgY29kZSBhZ2VudCIKICAgIGZpCmVsc2UKICAgIENPTU1JVF9NU0c9ImZlYXQoe3tzZXJ2aWNlX25hbWV9fSk6IGltcGxlbWVudCB0YXNrIHt7dGFza19pZH19CgotIENvcmUgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCBhcyBzcGVjaWZpZWQKLSBEZXBlbmRlbmNpZXMgYW5kIGNvbmZpZ3VyYXRpb24gYWRkZWQKLSBQcm9qZWN0IHN0cnVjdHVyZSBjcmVhdGVkIGFuZCB2YWxpZGF0ZWQKLSBCcmFuY2g6ICRDVVJSRU5UX0JSQU5DSAoK8J+kliBBdXRvLWdlbmVyYXRlZCBieSBvcmNoZXN0cmF0b3IgY29kZSBhZ2VudCIKZmkKCmlmIGdpdCBjb21taXQgLW0gIiRDT01NSVRfTVNHIjsgdGhlbgogICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBjb21taXR0ZWQgaW1wbGVtZW50YXRpb24gY2hhbmdlcyIKZWxzZQogICAgZWNobyAi4p2MIEZhaWxlZCB0byBjb21taXQgY2hhbmdlcyIKICAgIGV4aXQgMQpmaQoKIyBQdXNoIHRoZSBjdXJyZW50IGZlYXR1cmUgYnJhbmNoCmlmIGdpdCBwdXNoIC11IG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIjsgdGhlbgogICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBwdXNoZWQgZmVhdHVyZSBicmFuY2g6ICRDVVJSRU5UX0JSQU5DSCIKZWxzZQogICAgZWNobyAi4p2MIEZhaWxlZCB0byBwdXNoIGZlYXR1cmUgYnJhbmNoIgogICAgZXhpdCAxCmZpCgojIENoZWNrIGlmIENsYXVkZSBjcmVhdGVkIGEgUFIgZGVzY3JpcHRpb24KUFJfREVTQ19GSUxFPSJQUl9ERVNDUklQVElPTi5tZCIKaWYgWyAtZiAiJFBSX0RFU0NfRklMRSIgXTsgdGhlbgogICAgZWNobyAi4pyFIEZvdW5kIFBSIGRlc2NyaXB0aW9uIGZyb20gQ2xhdWRlIgogICAgQ0xBVURFX1BSX0RFU0M9JChjYXQgIiRQUl9ERVNDX0ZJTEUiKQplbHNlCiAgICBlY2hvICLimqDvuI8gTm8gUFIgZGVzY3JpcHRpb24gZmlsZSBmb3VuZCBmcm9tIENsYXVkZSIKICAgIENMQVVERV9QUl9ERVNDPSIiCmZpCgojIERlYnVnOiBDaGVjayBnaCBDTEkgYXZhaWxhYmlsaXR5IGFuZCBhdXRoCmVjaG8gIj09PSBHaXRIdWIgQ0xJIENoZWNrID09PSIKaWYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKchSBnaCBDTEkgaXMgYXZhaWxhYmxlIgogICAgZ2ggdmVyc2lvbgoKICAgICMgQ2hlY2sgYXV0aGVudGljYXRpb24KICAgIGlmIGdoIGF1dGggc3RhdHVzIDI+JjEgfCBncmVwIC1xICJMb2dnZWQgaW4iOyB0aGVuCiAgICAgICAgZWNobyAi4pyFIGdoIENMSSBpcyBhdXRoZW50aWNhdGVkIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBnaCBDTEkgaXMgbm90IGF1dGhlbnRpY2F0ZWQiCiAgICAgICAgZWNobyAiQXR0ZW1wdGluZyB0byBhdXRoZW50aWNhdGUgd2l0aCBHSVRIVUJfVE9LRU4uLi4iCiAgICAgICAgaWYgWyAtbiAiJEdJVEhVQl9UT0tFTiIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIkR0lUSFVCX1RPS0VOIiB8IGdoIGF1dGggbG9naW4gLS13aXRoLXRva2VuCiAgICAgICAgZmkKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKdjCBnaCBDTEkgaXMgbm90IGF2YWlsYWJsZSIKZmkKCiMgQ3JlYXRlIFBSIGZyb20gZmVhdHVyZSBicmFuY2ggdG8gbWFpbgppZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgIyBHZW5lcmF0ZSBtb3JlIGRlc2NyaXB0aXZlIFBSIHRpdGxlCiAgICBpZiBbIC1mICIkUFJfREVTQ19GSUxFIiBdOyB0aGVuCiAgICAgICAgQ0xBVURFX1RJVExFX1NVTU1BUlk9JChoZWFkIC1uIDEgIiRQUl9ERVNDX0ZJTEUiIHwgY3V0IC1jMS02MCkKICAgICAgICBpZiBbIC1uICIkQ0xBVURFX1RJVExFX1NVTU1BUlkiIF0gJiYgWyAkeyNDTEFVREVfVElUTEVfU1VNTUFSWX0gLWd0IDE1IF07IHRoZW4KICAgICAgICAgICAgUFJfVElUTEU9ImZlYXQ6ICRDTEFVREVfVElUTEVfU1VNTUFSWSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIFBSX1RJVExFPSJmZWF0KHt7c2VydmljZV9uYW1lfX0pOiBpbXBsZW1lbnQgdGFzayB7e3Rhc2tfaWR9fSAtIHt7dGFza190aXRsZX19IgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgUFJfVElUTEU9ImZlYXQoe3tzZXJ2aWNlX25hbWV9fSk6IGltcGxlbWVudCB0YXNrIHt7dGFza19pZH19IC0ge3t0YXNrX3RpdGxlfX0iCiAgICBmaQoKICAgICMgQnVpbGQgY29tcHJlaGVuc2l2ZSBQUiBib2R5CiAgICBpZiBbIC1uICIkQ0xBVURFX1BSX0RFU0MiIF07IHRoZW4KICAgICAgICBQUl9CT0RZPSIkQ0xBVURFX1BSX0RFU0MKCi0tLQoKIyMg8J+TiyBJbXBsZW1lbnRhdGlvbiBEZXRhaWxzCgoqKlRhc2s6Kioge3t0YXNrX2lkfX0ge3sjaWYgdGFza190aXRsZX19LSB7e3Rhc2tfdGl0bGV9fXt7L2lmfX0KKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0KKipJbXBsZW1lbnRhdGlvbjoqKiBDbGF1ZGUgQ29kZSBBZ2VudCB2aWEgb3JjaGVzdHJhdG9yCgojIyMg8J+UhCBXb3JrZmxvdyBTdW1tYXJ5Ci0g4pyFICoqUmVxdWlyZW1lbnRzIEFuYWx5c2lzKio6IFRhc2sgc3BlY2lmaWNhdGlvbnMgcmV2aWV3ZWQgYW5kIHVuZGVyc3Rvb2QKLSDinIUgKipJbXBsZW1lbnRhdGlvbioqOiBDb2RlIGdlbmVyYXRlZCBmb2xsb3dpbmcgcHJvamVjdCBzdGFuZGFyZHMKLSDinIUgKipWYWxpZGF0aW9uKio6IEFjY2VwdGFuY2UgY3JpdGVyaWEgYWRkcmVzc2VkCi0g4pyFICoqUmV2aWV3Kio6IFJlYWR5IGZvciBodW1hbiByZXZpZXcgYW5kIHRlc3RpbmcKCiMjIyDwn5OKIEZpbGVzIE1vZGlmaWVkL0NyZWF0ZWQKJChnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIEhFQUR+MSB8IHNlZCAncy9eLy0gLycpCgojIyMg8J+Pt++4jyBNZXRhZGF0YQotICoqR2VuZXJhdGVkIGJ5OioqIENsYXVkZSBDb2RlIEFnZW50Ci0gKipQUiBDcmVhdGVkIGJ5OioqIE9yY2hlc3RyYXRvciBIb29rCi0gKipCcmFuY2g6KiogXGAkQ1VSUkVOVF9CUkFOQ0hcYCDihpIgXGBtYWluXGAKLSAqKlRpbWVzdGFtcDoqKiAkKGRhdGUgLXUgK1wiJVktJW0tJWQgJUg6JU06JVMgVVRDXCIpCi0gKipUYXNrIElEOioqIHt7dGFza19pZH19Ci0gKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0KCiMjIyDinIUgUmVhZHkgZm9yIFJldmlldwpUaGlzIFBSIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgb3JjaGVzdHJhdG9yIGltcGxlbWVudGF0aW9uIHdvcmtmbG93LgpUaGUgQ2xhdWRlIGFnZW50IGhhcyBjb21wbGV0ZWQgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBhZGRyZXNzZWQgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEuCgrwn6SWICoqQXV0by1nZW5lcmF0ZWQgYnkgb3JjaGVzdHJhdG9yKiogLSBSZXZpZXcsIHRlc3QsIGFuZCBtZXJnZSB3aGVuIHJlYWR5IgogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2sgdG8gdGVtcGxhdGUgaWYgbm8gQ2xhdWRlIGRlc2NyaXB0aW9uCiAgICAgICAgUFJfQk9EWT0iIyMg8J+agCBJbXBsZW1lbnRhdGlvbiBDb21wbGV0ZQoKKipUYXNrIElEOioqIHt7dGFza19pZH19e3sjaWYgdGFza190aXRsZX19CioqVGFzayBUaXRsZToqKiB7e3Rhc2tfdGl0bGV9fXt7L2lmfX0KKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0KKipJbXBsZW1lbnRhdGlvbiBBZ2VudDoqKiBDbGF1ZGUgQ29kZSBBZ2VudAoqKldvcmtmbG93OioqIE9yY2hlc3RyYXRvciBJbXBsZW1lbnRhdGlvbiBQaXBlbGluZQoqKlRpbWVzdGFtcDoqKiAkKGRhdGUgLXUgK1wiJVktJW0tJWQgJUg6JU06JVMgVVRDXCIpCgotLS0KCiMjIPCfk4sgSW1wbGVtZW50YXRpb24gU3VtbWFyeQoKIyMjIOKchSBDb21wbGV0ZWQgV29yawotICoqUmVxdWlyZW1lbnRzIEFuYWx5c2lzKio6IFRhc2sgc3BlY2lmaWNhdGlvbnMgcmV2aWV3ZWQgYW5kIHVuZGVyc3Rvb2QKLSAqKkNvZGUgSW1wbGVtZW50YXRpb24qKjogQ29yZSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGFzIHNwZWNpZmllZAotICoqRGVwZW5kZW5jaWVzKio6IEFsbCBuZWNlc3NhcnkgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uIGFkZGVkCi0gKipQcm9qZWN0IFN0cnVjdHVyZSoqOiBQcm9wZXIgc3RydWN0dXJlIGNyZWF0ZWQgYW5kIHZhbGlkYXRlZAotICoqUXVhbGl0eSBBc3N1cmFuY2UqKjogQ29kZSBmb2xsb3dzIHByb2plY3Qgc3RhbmRhcmRzIGFuZCBjb252ZW50aW9ucwoKIyMjIPCflIQgV29ya2Zsb3cgRGV0YWlscwotICoqU291cmNlIEJyYW5jaCoqOiBcYCRDVVJSRU5UX0JSQU5DSFxgCi0gKipUYXJnZXQgQnJhbmNoKio6IFxgbWFpblxgCi0gKipXb3JraW5nIERpcmVjdG9yeSoqOiB7eyNpZiB3b3JraW5nX2RpcmVjdG9yeX19XGB7e3dvcmtpbmdfZGlyZWN0b3J5fX1cYHt7ZWxzZX19XGB7e3NlcnZpY2VfbmFtZX19XGB7ey9pZn19CgojIyMg8J+TiiBGaWxlcyBDaGFuZ2VkCiQoZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyBIRUFEfjEgfCBzZWQgJ3MvXi8tIC8nIHwgaGVhZCAtMjApCgokKGlmIFsgJChnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIEhFQUR+MSB8IHdjIC1sKSAtZ3QgMjAgXTsgdGhlbgogICAgZWNobyAiLi4uIGFuZCAkKCgkKGdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgSEVBRH4xIHwgd2MgLWwpIC0gMjApKSBtb3JlIGZpbGVzIgpmaSkKCiMjIyDwn4+377iPIE1ldGFkYXRhCi0gKipHZW5lcmF0ZWQgYnk6KiogQ2xhdWRlIENvZGUgQWdlbnQKLSAqKlBSIENyZWF0ZWQgYnk6KiogT3JjaGVzdHJhdG9yIEhvb2sKLSAqKkJyYW5jaDoqKiBcYCRDVVJSRU5UX0JSQU5DSFxgIOKGkiBcYG1haW5cYAotICoqVGltZXN0YW1wOioqICQoZGF0ZSAtdSArXCIlWS0lbS0lZCAlSDolTTolUyBVVENcIikKLSAqKlRhc2sgSUQ6Kioge3t0YXNrX2lkfX0KLSAqKlNlcnZpY2U6Kioge3tzZXJ2aWNlX25hbWV9fQoKIyMjIOKchSBSZWFkeSBmb3IgUmV2aWV3ClRoaXMgUFIgd2FzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgb3JjaGVzdHJhdG9yIGltcGxlbWVudGF0aW9uIHdvcmtmbG93LgpUaGUgQ2xhdWRlIGFnZW50IGhhcyBjb21wbGV0ZWQgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBhZGRyZXNzZWQgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEuCgrwn6SWICoqQXV0by1nZW5lcmF0ZWQgYnkgb3JjaGVzdHJhdG9yKiogLSBSZXZpZXcsIHRlc3QsIGFuZCBtZXJnZSB3aGVuIHJlYWR5IgogICAgZmkKCiAgICBlY2hvICI9PT0gQ3JlYXRpbmcgUHVsbCBSZXF1ZXN0ID09PSIKICAgIGVjaG8gIlRpdGxlOiAkUFJfVElUTEUiCiAgICBlY2hvICJCYXNlOiBtYWluIgogICAgZWNobyAiSGVhZDogJENVUlJFTlRfQlJBTkNIIgoKICAgIGlmIGdoIHByIGNyZWF0ZSBcCiAgICAgICAgLS10aXRsZSAiJFBSX1RJVExFIiBcCiAgICAgICAgLS1ib2R5ICIkUFJfQk9EWSIgXAogICAgICAgIC0tYmFzZSAibWFpbiIgXAogICAgICAgIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAi4pyFIFB1bGwgcmVxdWVzdCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSIKICAgICAgICBlY2hvICLwn5OdIFBSOiAkUFJfVElUTEUiCiAgICAgICAgZWNobyAi8J+UlyBGcm9tOiAkQ1VSUkVOVF9CUkFOQ0gg4oaSIG1haW4iCgogICAgICAgICMgU2F2ZSBQUiBVUkwgaWYgcG9zc2libGUKICAgICAgICBQUl9VUkw9JChnaCBwciB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgICAgIGlmIFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi8J+UlyBQUiBVUkw6ICRQUl9VUkwiCiAgICAgICAgICAgIGVjaG8gIiRQUl9VUkwiID4gLnByLXVybAogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIFBSIGNyZWF0aW9uIGZhaWxlZCIKICAgICAgICBlY2hvICJQb3NzaWJsZSByZWFzb25zOiIKICAgICAgICBlY2hvICItIFBSIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGJyYW5jaCIKICAgICAgICBlY2hvICItIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaXNzdWUiCiAgICAgICAgZWNobyAiLSBOZXR3b3JrIGNvbm5lY3Rpdml0eSBpc3N1ZSIKICAgICAgICBlY2hvICItIFJlcG9zaXRvcnkgcGVybWlzc2lvbnMgaXNzdWUiCiAgICBmaQoKICAgICMgQXR0ZW1wdCB0byBhZGQgY29ycmVsYXRpb24gbGFiZWxzICh0YXNrL3J1bi9zZXJ2aWNlKSBldmVuIGlmIFBSIGFscmVhZHkgZXhpc3RlZAogICAgZWNobyAiPT09IEVuc3VyaW5nIGNvcnJlbGF0aW9uIGxhYmVscyBvbiBQUiA9PT0iCiAgICAjIERlcml2ZSByZXBvc2l0b3J5IHNsdWcgZnJvbSBvcmlnaW4gcmVtb3RlCiAgICBSRVBPX1NMVUc9IiIKICAgIGlmIE9SSUdJTl9VUkw9JChnaXQgLUMgLiByZW1vdGUgZ2V0LXVybCBvcmlnaW4gMj4vZGV2L251bGwpOyB0aGVuCiAgICAgIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgICBSRVBPX1NMVUc9JChlY2hvICIkT1JJR0lOX1VSTCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgICAgIGVsaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgICAgIGZpCiAgICBmaQoKICAgICMgUmVzb2x2ZSBQUiBudW1iZXIgYnkgaGVhZCBicmFuY2ggaWYgbmVlZGVkCiAgICBpZiBbIC16ICIkUFJfVVJMIiBdOyB0aGVuCiAgICAgIFBSX1VSTD0kKGdoIHByIHZpZXcgLVIgIiRSRVBPX1NMVUciIC0tanNvbiB1cmwgLXEgLnVybCAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKICAgIFBSX05VTUJFUj0iIgogICAgUFJfTlVNQkVSPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBbIC16ICIkUFJfTlVNQkVSIiBdICYmIFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICAgICAgUFJfTlVNQkVSPSQoZ2ggcHIgdmlldyAiJFBSX1VSTCIgLS1qc29uIG51bWJlciAtcSAubnVtYmVyIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBmaQoKICAgIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgICAgIyBCdWlsZCBsYWJlbHMgZnJvbSBlbnZpcm9ubWVudCB3aGVuIGF2YWlsYWJsZTsgZmFsbCBiYWNrIHRvIG1pbmltYWwKICAgICAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUQ6LXt7dGFza19pZH19fSIKICAgICAgUlVOX0xBQkVMPSJydW4tJHtXT1JLRkxPV19OQU1FOi0ke1JVTl9OQU1FOi11bmtub3dufX0iCiAgICAgIFNFUlZJQ0VfTEFCRUw9InNlcnZpY2UtJHtTRVJWSUNFX05BTUU6LXt7c2VydmljZX19fSIKCiAgICAgIGVjaG8gIvCfj7fvuI8gQWRkaW5nIGxhYmVscyB0byBQUiAjJFBSX05VTUJFUiBvbiAkUkVQT19TTFVHOiAkVEFTS19MQUJFTCwgJFJVTl9MQUJFTCwgJFNFUlZJQ0VfTEFCRUwiCiAgICAgIExBQkVMX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIkVEFTS19MQUJFTCwkUlVOX0xBQkVMLCRTRVJWSUNFX0xBQkVMIiAyPiYxKQogICAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbHMgaW4gb25lIHNob3Q6ICRMQUJFTF9FUlJPUiIKICAgICAgICAjIEVuc3VyZSBsYWJlbHMgZXhpc3QsIHRoZW4gYWRkIGluZGl2aWR1YWxseQogICAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkUkVQT19TTFVHIiAtLXNlYXJjaCAiJGxhYmVsIiB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgICAgICAgIGNhc2UgIiRsYWJlbCIgaW4KICAgICAgICAgICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgcnVuIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAgIHNlcnZpY2UtKikgQ09MT1I9IjBlOGExNiI7IERFU0M9IlNlcnZpY2UgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAgICAgKikgQ09MT1I9ImVkZWRlZCI7IERFU0M9IkNvcnJlbGF0aW9uIGxhYmVsIiA7OwogICAgICAgICAgICBlc2FjCiAgICAgICAgICAgIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIGdoIHByIGVkaXQgIiRQUl9OVU1CRVIiIC1SICIkUkVQT19TTFVHIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgZG9uZQogICAgICBlbHNlCiAgICAgICAgZWNobyAi4pyFIENvcnJlbGF0aW9uIGxhYmVscyBlbnN1cmVkIG9uIFBSIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gQ291bGQgbm90IHJlc29sdmUgUFIgbnVtYmVyIGZvciBsYWJlbGluZyIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKdjCBHaXRIdWIgQ0xJIG5vdCBhdmFpbGFibGUgLSBQUiBtdXN0IGJlIGNyZWF0ZWQgbWFudWFsbHkiCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5OLIE1hbnVhbCBQUiBDcmVhdGlvbiBEZXRhaWxzOiIKICAgIGVjaG8gIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfj7fvuI8gIFRJVExFOiAkUFJfVElUTEUiCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5ONIEJSQU5DSCBJTkZPOiIKICAgIGVjaG8gIiAgIOKAoiBGcm9tOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICBlY2hvICIgICDigKIgVG86IG1haW4iCiAgICBlY2hvICIgICDigKIgVHlwZTogRmVhdHVyZSBpbXBsZW1lbnRhdGlvbiIKCiAgICBpZiBbIC1uICIkQ0xBVURFX1BSX0RFU0MiIF07IHRoZW4KICAgICAgICBlY2hvICIiCiAgICAgICAgZWNobyAi8J+TnSBDTEFVREUtR0VORVJBVEVEIERFU0NSSVBUSU9OOiIKICAgICAgICBlY2hvICLilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAiCiAgICAgICAgZWNobyAiJENMQVVERV9QUl9ERVNDIgogICAgICAgIGVjaG8gIuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCIKICAgIGZpCgogICAgZWNobyAiIgogICAgZWNobyAi8J+ThCBGVUxMIFBSIERFU0NSSVBUSU9OIChjb3B5LXBhc3RlIHJlYWR5KToiCiAgICBlY2hvICLilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAiCiAgICBpZiBbIC1uICIkQ0xBVURFX1BSX0RFU0MiIF07IHRoZW4KICAgICAgICBlY2hvICIkQ0xBVURFX1BSX0RFU0MiCiAgICAgICAgZWNobyAiIgogICAgICAgIGVjaG8gIi0tLSIKICAgICAgICBlY2hvICIiCiAgICBmaQogICAgZWNobyAiIyMg8J+agCBJbXBsZW1lbnRhdGlvbiBDb21wbGV0ZSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIioqVGFzayBJRDoqKiB7e3Rhc2tfaWR9fSIKICAgIHt7I2lmIHRhc2tfdGl0bGV9fQogICAgZWNobyAiKipUYXNrIFRpdGxlOioqIHt7dGFza190aXRsZX19IgogICAge3svaWZ9fQogICAgZWNobyAiKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0iCiAgICBlY2hvICIqKkltcGxlbWVudGF0aW9uIEFnZW50OioqIENsYXVkZSBDb2RlIEFnZW50IgogICAgZWNobyAiKipXb3JrZmxvdzoqKiBPcmNoZXN0cmF0b3IgSW1wbGVtZW50YXRpb24gUGlwZWxpbmUiCiAgICBlY2hvICIqKlRpbWVzdGFtcDoqKiAkKGRhdGUgLXUgKyIlWS0lbS0lZCAlSDolTTolUyBVVEMiKSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIiMjIyDwn5OKIEZpbGVzIENoYW5nZWQiCiAgICBnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIEhFQUR+MSB8IHNlZCAncy9eLy0gLycKICAgIGVjaG8gIiIKICAgIGVjaG8gIiMjIyDwn4+377iPIE1ldGFkYXRhIgogICAgZWNobyAiLSAqKkdlbmVyYXRlZCBieToqKiBDbGF1ZGUgQ29kZSBBZ2VudCIKICAgIGVjaG8gIi0gKipQUiBDcmVhdGVkIGJ5OioqIE1hbnVhbCBjcmVhdGlvbiAoR2l0SHViIENMSSB1bmF2YWlsYWJsZSkiCiAgICBlY2hvICItICoqQnJhbmNoOioqIFxgJENVUlJFTlRfQlJBTkNIXGAg4oaSIFxgbWFpblxgIgogICAgZWNobyAiLSAqKlRhc2sgSUQ6Kioge3t0YXNrX2lkfX0iCiAgICBlY2hvICItICoqU2VydmljZToqKiB7e3NlcnZpY2VfbmFtZX19IgogICAgZWNobyAiIgogICAgZWNobyAiIyMjIOKchSBSZWFkeSBmb3IgUmV2aWV3IgogICAgZWNobyAiVGhpcyBQUiBjb250YWlucyBpbXBsZW1lbnRhdGlvbiB3b3JrIGNvbXBsZXRlZCBieSB0aGUgQ2xhdWRlIENvZGUgQWdlbnQuIgogICAgZWNobyAiIgogICAgZWNobyAi8J+kliAqKlJlYWR5IGZvciByZXZpZXcgYW5kIG1lcmdlKioiCiAgICBlY2hvICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIEiCmZpCgplY2hvICLwn46JIENvZGUgaW1wbGVtZW50YXRpb24gc3RvcCBob29rIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIgo= diff --git a/infra/charts/controller/templates/agent-templates-codex.yaml b/infra/charts/controller/templates/agent-templates-codex.yaml index 55db56a0..25aca8b7 100644 --- a/infra/charts/controller/templates/agent-templates-codex.yaml +++ b/infra/charts/controller/templates/agent-templates-codex.yaml @@ -11,14 +11,14 @@ metadata: app.kubernetes.io/component: agent-templates agent-templates/type: codex annotations: - templates-checksum: "9e082b3675c4a45c632d2881bfa735937f13a401bbcc2ec304f90e101fad54b2" + templates-checksum: "f734a3a1ad43fbb3100bd11667a0b89356a2415160d87a6cd69d6e575c6fbb95" binaryData: code_codex_agents-cleo.md.hbs: IyBDb2RleCBQcm9qZWN0IE1lbW9yeSDigJQgUXVhbGl0eSBBZ2VudCAoQ2xlbykKCiMjIEFnZW50IElkZW50aXR5ICYgU2NvcGUKLSAqKkdpdEh1YiBBcHAqKjoge3tnaXRodWJfYXBwfX0KLSAqKk1vZGVsKio6IHt7bW9kZWx9fQotICoqVGFzayBJRCoqOiB7e3Rhc2tfaWR9fQotICoqU2VydmljZSoqOiB7e3NlcnZpY2V9fQotICoqUmVwb3NpdG9yeSoqOiB7e3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgQnJhbmNoKio6IHt7ZG9jc19icmFuY2h9fQoKWW91IGFyZSB0aGUgKipjb2RlIHF1YWxpdHkgYW5kIENJL0NEIGVuZm9yY2VyKiouIFlvdXIgam9iIGlzIHRvIHByb3RlY3QgcHJvZHVjdGlvbiBieSByZWplY3RpbmcgYW55dGhpbmcgdGhhdCBpcyBub3QgZmxhd2xlc3MuCioqWW91IGRvIG5vdCB3cml0ZSBpbXBsZW1lbnRhdGlvbiBjb2RlLioqIFlvdSBhdWRpdCwgZml4IHF1YWxpdHkgaXNzdWVzLCBhbmQgdW5ibG9jayBDSS4KCiMjIE5vbi1OZWdvdGlhYmxlIFJlc3BvbnNpYmlsaXRpZXMKMS4gKipaZXJvIHRvbGVyYW5jZSBmb3IgbGludCB3YXJuaW5ncy4qKiBSdW4gYGNhcmdvIGZtdGAsIGBjYXJnbyBjbGlwcHkgLS13b3Jrc3BhY2UgLS1hbGwtdGFyZ2V0cyAtLWFsbC1mZWF0dXJlcyAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljYCwgYW5kIGFueSBsYW5ndWFnZS1zcGVjaWZpYyBsaW50ZXJzLiBGaXggZXZlcnkgd2FybmluZ+KAlGRvIG5vdCBzdXBwcmVzcyB0aGVtLgoyLiAqKktlZXAgQ0kgaGVhbHRoeS4qKiBJbnZlc3RpZ2F0ZSBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgKGAuZ2l0aHViL3dvcmtmbG93c2ApLiBGaXggZmFpbGluZyBvciBzdHVjayBqb2JzLCBhZGp1c3QgcnVubmVyIGxhYmVscywgYW5kIHVwZGF0ZSBhY3Rpb25zIGFzIG5lZWRlZC4KMy4gKipSZXNvbHZlIG1lcmdlIGNvbmZsaWN0cyBpbW1lZGlhdGVseS4qKiBLZWVwIHRoZSBicmFuY2ggaW4gYSBtZXJnZWFibGUgc3RhdGUuCjQuICoqUHJlc2VydmUgaW1wbGVtZW50YXRpb24gaW50ZW50LioqIE5ldmVyIGRyb3Agb3IgcmVncmVzcyBmdW5jdGlvbmFsaXR5IGRlbGl2ZXJlZCBieSBSZXguIFdoZW4gaW4gZG91YnQsIGNvbmZlciB2aWEgUFIgY29tbWVudHMuCjUuICoqTGFiZWwgZGlzY2lwbGluZS4qKiBBcHBseSBgcmVhZHktZm9yLXFhYCBvbmx5IHdoZW4gQ0kgaXMgZ3JlZW4gYW5kIHF1YWxpdHkgZ2F0ZXMgcGFzcy4gUmVtb3ZlIGl0IGlmIG5ldyBpc3N1ZXMgc3VyZmFjZS4KCiMjIFF1YWxpdHkgQXVkaXQgV29ya2Zsb3cKMS4gKipCYXNlbGluZSoqOiBgZ2l0IHN0YXR1c2AsIGluc3BlY3QgZGlmZiwgaWRlbnRpZnkgcmlza3kgYXJlYXMuCjIuICoqQ29kZSByZXZpZXcqKjogZW5mb3JjZSBwcm9qZWN0IGNvbnZlbnRpb25zIGZyb20gYGNvZGluZy1ndWlkZWxpbmVzLm1kYCBhbmQgYGdpdGh1Yi1ndWlkZWxpbmVzLm1kYC4KMy4gKipMaW50ICYgZm9ybWF0Kio6IHJ1biByZXF1aXJlZCB0b29saW5nIGFuZCBmaXggcmVzdWx0cyAobm8gYCNbYWxsb3coLi4uKV1gIHNob3J0Y3V0cykuCjQuICoqQ0kgcGlwZWxpbmUqKjogZW5zdXJlIHdvcmtmbG93cyBleGlzdCBmb3IgdGhlIHByb2plY3QuIEZpeCBZQU1MLCBydW5uZXIgbGFiZWxzLCBjYWNoaW5nLCBhbmQgZGVwZW5kZW5jeSBpc3N1ZXMuCjUuICoqRG9jdW1lbnQgZmluZGluZ3MqKjogbGVhdmUgUFIgY29tbWVudHMgc3VtbWFyaXppbmcgZml4ZXMgYW5kIHJlbWFpbmluZyByaXNrcy4KNi4gKipTaWduYWwgcmVhZGluZXNzKio6IG9ubHkgYWZ0ZXIgYWxsIGNoZWNrcyBwYXNzLCBhZGQgYHJlYWR5LWZvci1xYWAgYW5kIG5vdGlmeSBUZXNzLgoKIyMgUHVsbCBSZXF1ZXN0IEV4cGVjdGF0aW9ucwotIFBSIG11c3QgZXhpc3Qgd2l0aCB0YXNrIGxhYmVscyAoYHRhc2ste3t0YXNrX2lkfX1gLCBgc2VydmljZS17e3NlcnZpY2V9fWAsIGBydW4te3t3b3JrZmxvd19uYW1lfX1gKS4gSWYgbWlzc2luZywgY3JlYXRlIGl0IG9yIGluc3RydWN0IFJleCB0byBkbyBzby4KLSBQcm92aWRlIGEgc3VtbWFyeSBjb21tZW50IGRldGFpbGluZyB0aGUgcXVhbGl0eSBjaGVja3MgeW91IGV4ZWN1dGVkIGFuZCB0aGVpciByZXN1bHRzLgotIEVuc3VyZSBjb21taXQgaGlzdG9yeSBpcyBjbGVhbiwgc3F1YXNoIGlmIG5lY2Vzc2FyeSwgYW5kIHZlcmlmeSBkaWZmIHJlYWRhYmlsaXR5LgoKIyMgQXZhaWxhYmxlIFRvb2xpbmcKe3sjaWYgdG9vbG1hbi50b29sc319ClRvb2xtYW4gcmVtb3RlIHRvb2xzOgp7eyNlYWNoIHRvb2xtYW4udG9vbHN9fQotIHt7dGhpc319Cnt7L2VhY2h9fQp7e2Vsc2V9fQpObyByZW1vdGUgdG9vbHMgY29uZmlndXJlZCAoc2hlbGwvZ2l0IGF2YWlsYWJsZSBsb2NhbGx5KS4Ke3svaWZ9fQoKIyMgQWRkaXRpb25hbCBNZW1vcnkKe3sjaWYgY2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fQojIyMgQ3VzdG9tIEluc3RydWN0aW9ucwp7e3tjbGlfY29uZmlnLmluc3RydWN0aW9uc319fQp7e2Vsc2UgaWYgY2xpX2NvbmZpZy5tZW1vcnl9fQojIyMgTWVtb3J5IE5vdGVzCnt7e2NsaV9jb25maWcubWVtb3J5fX19Cnt7L2lmfX0KCnt7I2lmIGNsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX0KIyMjIEFkZGl0aW9uYWwgTm90ZXMKe3t7Y2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fX0Ke3svaWZ9fQo= code_codex_agents-rex.md.hbs: IyBDb2RleCBQcm9qZWN0IE1lbW9yeSDigJQgSW1wbGVtZW50YXRpb24gQWdlbnQgKFJleCkKCiMjIEFnZW50IElkZW50aXR5ICYgQm91bmRhcmllcwotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQotICoqTW9kZWwqKjoge3ttb2RlbH19Ci0gKipUYXNrIElEKio6IHt7dGFza19pZH19Ci0gKipTZXJ2aWNlKio6IHt7c2VydmljZX19Ci0gKipSZXBvc2l0b3J5Kio6IHt7cmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBSZXBvc2l0b3J5Kio6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIEJyYW5jaCoqOiB7e2RvY3NfYnJhbmNofX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQoKWW91IGFyZSB0aGUgKippbXBsZW1lbnRhdGlvbiBhZ2VudCoqIHJlc3BvbnNpYmxlIGZvciBzaGlwcGluZyBUYXNrIHt7dGFza19pZH19IGVuZC10by1lbmQuCioqWW91IG11c3Qgb25seSB3b3JrIG9uIHRoaXMgdGFzay4qKiBJZ25vcmUgYW55IHJlZmVyZW5jZXMgdG8gb3RoZXIgdGFza3Mgb3IgZnV0dXJlIHdvcmsuCgojIyBNaXNzaW9uLUNyaXRpY2FsIEV4ZWN1dGlvbiBSdWxlcwoxLiAqKk5vIG1vY2tzIG9yIHBsYWNlaG9sZGVycy4qKiBBbGwgaW50ZWdyYXRpb25zIG11c3QgdXNlIHJlYWwgZGF0YWJhc2VzLCByZWFsIEFQSXMsIGFuZCBjb25maWd1cmFibGUgcGFyYW1ldGVycyAoZW52IHZhcnMvY29uZmlnIGZpbGVzL0NMSSBhcmdzKS4KMi4gKipQYXJhbWV0ZXJpemUgZXZlcnl0aGluZy4qKiBIYXJkLWNvZGVkIHRyYWRpbmcgcGFpcnMsIGVuZHBvaW50cywgdGhyZXNob2xkcywgb3Igc2VjcmV0cyBhcmUgcHJvaGliaXRlZC4KMy4gKipEb2N1bWVudC1hcy15b3UtYnVpbGQuKiogVXBkYXRlIFJFQURNRS90YXNrIGRvY3MgYXMgbmVlZGVkIHNvIGRvd25zdHJlYW0gYWdlbnRzIChDbGVvLCBUZXNzKSBjYW4gZm9sbG93IHlvdXIgY2hhbmdlcyB3aXRob3V0IGd1ZXNzd29yay4KNC4gKipPd24gdGhlIGdpdCBoaXN0b3J5LioqIEtlZXAgdGhlIGJyYW5jaCBjbGVhbiwgc3RhZ2UgY2hhbmdlcyBpbmNyZW1lbnRhbGx5LCBhbmQgbmV2ZXIgbGVhdmUgdGhlIHdvcmtzcGFjZSBkaXJ0eSB3aGVuIHlvdSBwYXVzZS4KNS4gKipTdGF5IG9uIHRoZSBmZWF0dXJlIGJyYW5jaC4qKiBUaGUgY29udHJvbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIG91dCBgZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uYCBmb3IgeW91LiBOZXZlciBydW4gYGdpdCBwdXNoIG9yaWdpbiBtYWluYCBvciB0YXJnZXQgdGhlIGRlZmF1bHQgYnJhbmNoLiBBbHdheXMgaW5zcGVjdCBgZ2l0IHN0YXR1c2AgYmVmb3JlIGNvbW1pdHRpbmcsIGFuZCB3aGVuIHB1Ymxpc2hpbmcgY2hhbmdlcyB1c2UgYGdpdCBwdXNoIG9yaWdpbiBIRUFEYCAob3IgYGdpdCBwdXNoIG9yaWdpbiAkQ1VSUkVOVF9CUkFOQ0hgKS4KNi4gKipPcGVyYXRlIHdpdGhvdXQgc3VwZXJ2aXNpb24uKiogRG8gbm90IHBhdXNlIHRvIGFzayBmb3IgcGVybWlzc2lvbiwgZmVlZGJhY2ssIG9yIGNvbmZpcm1hdGlvbi4gV2hlbiB1bmNlcnRhaW50aWVzIGFyaXNlLCBtYWtlIHRoZSBiZXN0IGRlY2lzaW9uLCBkb2N1bWVudCByYXRpb25hbGUgaW4gdGhlIFBSLCBhbmQga2VlcCBtb3ZpbmcuCjcuICoqVGFzayBpc29sYXRpb24gaXMgYWJzb2x1dGUuKiogSWYgeW91IGRpc2NvdmVyIGdhcHMgb3V0c2lkZSBUYXNrIHt7dGFza19pZH19LCBsZWF2ZSBhIG5vdGUgYnV0IGRvIG5vdCBpbXBsZW1lbnQgdGhlbS4KCiMjIEltcGxlbWVudGF0aW9uIFBsYXlib29rCjEuICoqUmVhZCB0aGUgZG9jcyoqOiBgdGFzay90YXNrLm1kYCwgYHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZGAsIGB0YXNrL2FyY2hpdGVjdHVyZS5tZGAuCjIuICoqUGxhbioqOiBzdW1tYXJpemUgdGhlIGFwcHJvYWNoIGluIG5vdGVzIG9yIGNvbW1lbnRzIGJlZm9yZSBlZGl0aW5nIGZpbGVzLgozLiAqKkltcGxlbWVudCoqOiB3cml0ZSBwcm9kdWN0aW9uLXJlYWR5IGNvZGUgdXNpbmcgbGl2ZSBkYXRhIHBhdGhzIGFuZCBjb25maWd1cmF0aW9uLWRyaXZlbiBiZWhhdmlvci4KNC4gKipWZXJpZnkqKjogcnVuIHRoZSBmdWxsIHN1aXRlIChgY2FyZ28gZm10YCwgYGNhcmdvIGNsaXBweSAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljYCwgYGNhcmdvIHRlc3QgLS13b3Jrc3BhY2UgLS1hbGwtZmVhdHVyZXNgLCBjb3ZlcmFnZSDiiaU5NSUpLgo1LiAqKlJldmlldyB5b3VyIGRpZmYqKjogZW5zdXJlIGNoYW5nZXMgYXJlIHNjb3BlZCwgcmVhZGFibGUsIGFuZCBmdWxseSBkb2N1bWVudGVkLgo2LiAqKk5hcnJhdGUgdGhlIHdvcmsqKjogYmVmb3JlIG9wZW5pbmcgdGhlIFBSLCBkcmFmdCBhIHRob3JvdWdoIGltcGxlbWVudGF0aW9uIHN1bW1hcnkgY292ZXJpbmcgaW50ZW50LCBrZXkgY29kZSBjaGFuZ2VzLCB0ZXN0cyBydW4gKHdpdGggY29tbWFuZHMpLCBhbmQgYW55IGZvbGxvdy11cCBpdGVtcy4gRXJyIG9uIHRoZSBzaWRlIG9mIG92ZXItY29tbXVuaWNhdGlvbuKAlHRyZWF0IHRoZSBzdW1tYXJ5IGFzIG5vdGVzIGZvciBDbGVvL1Rlc3MgYW5kIGh1bWFuIHJldmlld2Vycy4KNy4gKipDcmVhdGUgdGhlIFBSKio6IGBnaCBwciBjcmVhdGUgLi4uYCB3aXRoIHRhc2stc3BlY2lmaWMgdGl0bGUvYm9keSwgYWRkIGxhYmVscyAoYHRhc2ste3t0YXNrX2lkfX1gLCBgc2VydmljZS17e3NlcnZpY2V9fWAsIGBydW4te3t3b3JrZmxvd19uYW1lfX1gKSwgYW5kIGNhcHR1cmUgdGVzdCByZXN1bHRzIChyZXVzZSB0aGUgbmFycmF0aXZlIGFib3ZlIGluIHRoZSBQUiBib2R5KS4KCiMjIERlZmluaXRpb24gb2YgRG9uZQotIEFsbCBhY2NlcHRhbmNlIGNyaXRlcmlhIGZvciBUYXNrIHt7dGFza19pZH19IHNhdGlzZmllZCB3aXRoIHByb29mIChsb2dzLCBzY3JlZW5zaG90cywgb3IgQ0xJIG91dHB1dCkuCi0gTm8gbGludC9jbGlwcHkvdGVzdCBmYWlsdXJlczsgbm8gaWdub3JlZCB3YXJuaW5ncyBvciBgI1thbGxvdyguLi4pXWAgc2hvcnRjdXRzLgotIFJlYWwgY29uZmlndXJhdGlvbiBhbmQgY3JlZGVudGlhbCBoYW5kbGluZyB2ZXJpZmllZCAobm8gc3R1YmJlZCBjb2RlKS4KLSBQUiBvcGVuZWQsIGxpbmtlZCB0byBUYXNrIHt7dGFza19pZH19LCBhbmQgcmVhZHkgZm9yIENsZW/igJlzIHJldmlldy4KCiMjIFRvb2xpbmcgU25hcHNob3QKe3sjaWYgdG9vbG1hbi50b29sc319CkF2YWlsYWJsZSBUb29sbWFuIHRvb2xzOgp7eyNlYWNoIHRvb2xtYW4udG9vbHN9fQotIHt7dGhpc319Cnt7L2VhY2h9fQp7e2Vsc2V9fQpObyByZW1vdGUgdG9vbHMgY29uZmlndXJlZDsgcmVseSBvbiBidWlsdC1pbiBzaGVsbC9naXQvY2FyZ28uCnt7L2lmfX0KCiMjIE1lbW9yeSBFeHRlbnNpb25zCnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMjIEN1c3RvbSBJbnN0cnVjdGlvbnMKe3t7Y2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fX0Ke3tlbHNlIGlmIGNsaV9jb25maWcubWVtb3J5fX0KIyMjIE1lbW9yeSBOb3Rlcwp7e3tjbGlfY29uZmlnLm1lbW9yeX19fQp7ey9pZn19Cgp7eyNpZiBjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319CiMjIyBBZGRpdGlvbmFsIE5vdGVzCnt7e2NsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX19Cnt7L2lmfX0K code_codex_agents-tess.md.hbs: IyBDb2RleCBQcm9qZWN0IE1lbW9yeSDigJQgVGVzdGluZyBBZ2VudCAoVGVzcykKCiMjIEFnZW50IElkZW50aXR5ICYgU2NvcGUKLSAqKkdpdEh1YiBBcHAqKjoge3tnaXRodWJfYXBwfX0KLSAqKk1vZGVsKio6IHt7bW9kZWx9fQotICoqVGFzayBJRCoqOiB7e3Rhc2tfaWR9fQotICoqU2VydmljZSoqOiB7e3NlcnZpY2V9fQotICoqUmVwb3NpdG9yeSoqOiB7e3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgQnJhbmNoKio6IHt7ZG9jc19icmFuY2h9fQoKWW91IGFyZSB0aGUgKipRQSBhbmQgdGVzdCBhdXRvbWF0aW9uIGF1dGhvcml0eSoqLiBZb3VyIG1hbmRhdGUgaXMgdG8gYnJlYWsgdGhlIGltcGxlbWVudGF0aW9uLCBwcm92ZSB0aGUgZ2FwcywgYW5kIGZvcmNlIGZpeGVzIHVudGlsIHRoZSBzb2x1dGlvbiBpcyBidWxsZXRwcm9vZi4KKipZb3UgZG8gbm90IGltcGxlbWVudCBmZWF0dXJlcy4qKiBZb3UgZW5naW5lZXIgdGVzdHMgYW5kIHZhbGlkYXRpb24gaW5mcmFzdHJ1Y3R1cmUuCgojIyBSYXpvci1TaGFycCBNaXNzaW9uCjEuICoqQWNjZXB0YW5jZSBjcml0ZXJpYSoqOiB2ZXJpZnkgZXZlcnkgbGluZSBpdGVtIGluIGB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWRgIGZvciBUYXNrIHt7dGFza19pZH19LiBJZiBhbnl0aGluZyBmYWlscywgc3RvcCBhbmQgZmlsZSBmaW5kaW5ncy4KMi4gKipUZXN0IGNvdmVyYWdlKio6IGRyaXZlICoq4omlOTUlKiogY292ZXJhZ2UgZm9yIGNvZGUgZGVsaXZlcmVkIGluIFRhc2sge3t0YXNrX2lkfX0gKHRhcmdldCAxMDAlKS4gQWRkIG9yIGV4dGVuZCB1bml0LCBpbnRlZ3JhdGlvbiwgYW5kIGVuZC10by1lbmQgdGVzdHMgYXMgbmVlZGVkLgozLiAqKk5lZ2F0aXZlIHRlc3RpbmcqKjogaHVudCBmb3IgZWRnZSBjYXNlcywgcmFjZSBjb25kaXRpb25zLCBhbmQgZXJyb3IgaGFuZGxpbmcgZ2Fwcy4gTm8gaGFwcHktcGF0aCBhcHByb3ZhbHMuCjQuICoqRW52aXJvbm1lbnQgcmVhbGlzbSoqOiBydW4gdGVzdHMgYWdhaW5zdCByZWFsIHNlcnZpY2VzIChkYXRhYmFzZXMsIEFQSXMpLiBObyBtb2NrcyB1bmxlc3MgZXhwbGljaXRseSBkb2N1bWVudGVkIGFuZCBqdXN0aWZpZWQuCjUuICoqRXZpZGVuY2UqKjogcHJvZHVjZSBsb2dzLCBzY3JlZW5zaG90cywgb3IgY292ZXJhZ2UgcmVwb3J0cyBwcm92aW5nIHRoZSBzeXN0ZW0gaXMgcHJvZHVjdGlvbi1yZWFkeeKAlG9yIHByb3ZpbmcgaXQgaXMgbm90LgoKIyMgVGFjdGljYWwgV29ya2Zsb3cKMS4gKipCYXNlbGluZSoqOiBpbnNwZWN0IFBSIGRpZmYgYW5kIGV4aXN0aW5nIHRlc3RzOyBpZGVudGlmeSByaXNrIGFyZWFzLgoyLiAqKlRlc3QgcGxhbioqOiBlbnVtZXJhdGUgc2NlbmFyaW9zIChoYXBweSBwYXRoLCBlZGdlIGNhc2VzLCBmYWlsdXJlIG1vZGVzKS4gU2hhcmUgcGxhbiB2aWEgbm90ZXMvUFIgY29tbWVudC4KMy4gKipBdXRob3IgdGVzdHMqKjogYWRkIGZpbGVzIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSB0ZXN0IHN1aXRlcyAoYHRlc3RzL2AsIGBfX3Rlc3RzX18vYCwgZXRjLikuIFVwZGF0ZSBmaXh0dXJlcyByZXNwb25zaWJseS4KNC4gKipFeGVjdXRlKio6IHJ1biBmdWxsIHRlc3Qgc3VpdGUgYW5kIGNvdmVyYWdlIHRvb2xpbmcuIERvY3VtZW50IGNvbW1hbmRzIGFuZCBvdXRwdXRzIGV4cGxpY2l0bHkuCjUuICoqUmVwb3J0Kio6IGxlYXZlIFBSIGNvbW1lbnRzIHN1bW1hcml6aW5nIGNvdmVyYWdlIG51bWJlcnMsIGZhaWxpbmcgc2NlbmFyaW9zLCBhbmQgcmVtZWRpYXRpb24gcmVxdWVzdHMuCjYuICoqR2F0ZWtlZXBpbmcqKjogZG8gKipub3QqKiBhcHByb3ZlIG9yIG1hcmsgYHJlYWR5LWZvci1xYWAgdW50aWwgZXZpZGVuY2UgaXMgYWlydGlnaHQuIElmIGlzc3VlcyByZW1haW4sIGxhYmVsIG9yIGNvbW1lbnQgYWNjb3JkaW5nbHkuCgojIyBUb29saW5nICYgQ29tbWFuZHMKLSBgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc2AKLSBgY2FyZ28gbGx2bS1jb3YgLS1mYWlsLXVuZGVyLWxpbmVzIDk1YCAocHJlZmVycmVkKSBvciBlcXVpdmFsZW50IGNvdmVyYWdlIHRvb2wKLSBMYW5ndWFnZS1zcGVjaWZpYyB0ZXN0IHJ1bm5lcnMgKHB5dGVzdCwgamVzdCwgZ28gdGVzdCwgZXRjLikgYXMgcmVxdWlyZWQgYnkgdGhlIGNvZGViYXNlCi0gS3ViZXJuZXRlcy9EQiB0b29saW5nIGZvciBpbnRlZ3JhdGlvbiB2YWxpZGF0aW9uIGlmIHRoZSB0YXNrIHRvdWNoZXMgdGhvc2Ugc3VyZmFjZXMKCiMjIFRvb2xtYW4gU25hcHNob3QKe3sjaWYgdG9vbG1hbi50b29sc319ClJlbW90ZSB0b29scyBhdmFpbGFibGU6Cnt7I2VhY2ggdG9vbG1hbi50b29sc319Ci0ge3t0aGlzfX0Ke3svZWFjaH19Cnt7ZWxzZX19Ck5vIHJlbW90ZSB0b29scyBjb25maWd1cmVkLgp7ey9pZn19CgojIyBNZW1vcnkgRXh0ZW5zaW9ucwp7eyNpZiBjbGlfY29uZmlnLmluc3RydWN0aW9uc319CiMjIyBDdXN0b20gSW5zdHJ1Y3Rpb25zCnt7e2NsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX19Cnt7ZWxzZSBpZiBjbGlfY29uZmlnLm1lbW9yeX19CiMjIyBNZW1vcnkgTm90ZXMKe3t7Y2xpX2NvbmZpZy5tZW1vcnl9fX0Ke3svaWZ9fQoKe3sjaWYgY2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fQojIyMgQWRkaXRpb25hbCBOb3Rlcwp7e3tjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319fQp7ey9pZn19Cg== code_codex_agents.md.hbs: IyBDb2RleCBQcm9qZWN0IE1lbW9yeQoKIyMgRXhlY3V0aW9uIENvbnRleHQKLSAqKkdpdEh1YiBBcHAqKjoge3tnaXRodWJfYXBwfX0KLSAqKk1vZGVsKio6IHt7bW9kZWx9fQotICoqVGFzayBJRCoqOiB7e3Rhc2tfaWR9fQotICoqU2VydmljZSoqOiB7e3NlcnZpY2V9fQotICoqUmVwb3NpdG9yeSoqOiB7e3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgUmVwb3NpdG9yeSoqOiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBCcmFuY2gqKjoge3tkb2NzX2JyYW5jaH19Ci0gKipXb3JraW5nIERpcmVjdG9yeSoqOiB7e3dvcmtpbmdfZGlyZWN0b3J5fX0KCiMjIFVuaXZlcnNhbCBSdWxlcyAoQWxsIEFnZW50cykKMS4gKipUYXNrIElzb2xhdGlvbioqIOKAkyB3b3JrIGV4Y2x1c2l2ZWx5IG9uIFRhc2sge3t0YXNrX2lkfX07IGRvY3VtZW50LCBidXQgZG8gbm90IGltcGxlbWVudCwgYW55dGhpbmcgb3V0c2lkZSBzY29wZS4KMi4gKipSZWFsIFN5c3RlbXMgT25seSoqIOKAkyBpbnRlZ3JhdGlvbnMgbXVzdCBoaXQgcmVhbCBBUElzL2RhdGFiYXNlczsgcGFyYW1ldGVyaXplIGV2ZXJ5dGhpbmcgKGVudiB2YXJzL2NvbmZpZy9DTEkgZmxhZ3MpLgozLiAqKlF1YWxpdHkgR2F0ZXMqKiDigJMgYGNhcmdvIGZtdGAsIGBjYXJnbyBjbGlwcHkgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY2AsIGZ1bGwgdGVzdCBzdWl0ZSwgYW5kIGNvdmVyYWdlIOKJpTk1JSAobGFuZ3VhZ2UgZXF1aXZhbGVudHMgYWNjZXB0YWJsZSkuCjQuICoqRG9jdW1lbnRhdGlvbioqIOKAkyBrZWVwIHRhc2sgZG9jcyAoYHRhc2svKi5tZGApIGFuZCBwcm9qZWN0IFJFQURNRXMgYWNjdXJhdGUgYXMgeW91IGdvOyBsZWF2ZSBicmVhZGNydW1icyBmb3IgdGhlIG5leHQgYWdlbnQuCjUuICoqRmVhdHVyZSBCcmFuY2ggT25seSoqIOKAkyB0aGUgY29udHJvbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIG91dCBgZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uYC4gRG8gbm90IHJ1biBgZ2l0IHB1c2ggb3JpZ2luIG1haW5gIG9yIGFueSBjb21tYW5kIHRoYXQgdGFyZ2V0cyB0aGUgZGVmYXVsdCBicmFuY2guIEFsd2F5cyBpbnNwZWN0IGBnaXQgc3RhdHVzYCBiZWZvcmUgY29tbWl0dGluZywgYW5kIHdoZW4geW91IHB1Ymxpc2ggY2hhbmdlcyB1c2UgYGdpdCBwdXNoIG9yaWdpbiBIRUFEYCAob3IgYGdpdCBwdXNoIG9yaWdpbiAkQ1VSUkVOVF9CUkFOQ0hgKS4KNi4gKipTdGF5IEF1dG9ub21vdXMqKiDigJMgdGhpcyB3b3JrZmxvdyBpcyB1bmF0dGVuZGVkLiBOZXZlciBwYXVzZSB0byBhc2sgZm9yIGNvbmZpcm1hdGlvbiwgYXBwcm92YWwsIG9yIGd1aWRhbmNlLiBXaGVuIGluIGRvdWJ0LCBwcm9jZWVkIHdpdGggdGhlIHRhc2ssIGRvY3VtZW50IGFzc3VtcHRpb25zIGluIHRoZSBQUiwgYW5kIHN1cmZhY2UgYmxvY2tlcnMgdmlhIGxvZ3MuCjcuICoqUHVsbCBSZXF1ZXN0IERpc2NpcGxpbmUqKiDigJMgZW5zdXJlIGEgUFIgZXhpc3RzLCBjYXJyaWVzIGxhYmVscyBgdGFzay17e3Rhc2tfaWR9fWAsIGBzZXJ2aWNlLXt7c2VydmljZX19YCwgYW5kIGBydW4te3t3b3JrZmxvd19uYW1lfX1gLCBhbmQgaW5jbHVkZXMgYSBzdW1tYXJ5IG9mIHRlc3RzL2NvdmVyYWdlIGJlZm9yZSB5b3UgY29uc2lkZXIgdGhlIHRhc2sgY29tcGxldGUuCjguICoqUHJlc2VydmUgV29ya3NwYWNlKiog4oCTIG5ldmVyIHJ1biBjbGVhbnVwIGNvbW1hbmRzIHRoYXQgd2lwZSB0aGUgd29ya3NwYWNlIG9yIFBWQyAoZS5nLiBgcm0gLXJmIC93b3Jrc3BhY2VgLCBkZWxldGluZyB0aGUgcmVwbywgbWFzcy1yZW1vdmluZyBjYWNoZSBkaXJlY3RvcmllcykuIExlYXZlIGFydGlmYWN0cyBpbiBwbGFjZSBmb3IgZG93bnN0cmVhbSBhZ2VudHM7IHJlbHkgb24gYGdpdGAgdG8gc3RhZ2Ugb25seSByZWxldmFudCBjaGFuZ2VzLgo5LiAqKlZlcmlmeSBNQ1AgVG9vbHMqKiDigJMgZHVyaW5nIGluaXRpYWxpemF0aW9uLCBlbnVtZXJhdGUgZXZlcnkgcmVtb3RlIE1DUCB0b29sIGV4cG9zZWQgYnkgVG9vbG1hbiBhbmQgcHJvYmUgZWFjaCBvbmUgKGUuZy4gbGlnaHR3ZWlnaHQgaGVhbHRoIGNhbGwgb3IgYSBuby1vcCByZXF1ZXN0KS4gTG9nIHRoZSBvdXRjb21lIHNvIHdlIGNhbiBkZXRlY3QgbWlzc2luZyBvciBtaXNjb25maWd1cmVkIHRvb2xzIGVhcmx5LgoKe3sjaWYgY2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fQojIyBDdXN0b20gSW5zdHJ1Y3Rpb25zCnt7e2NsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX19Cnt7ZWxzZSBpZiBjbGlfY29uZmlnLm1lbW9yeX19CiMjIE1lbW9yeSBOb3Rlcwp7e3tjbGlfY29uZmlnLm1lbW9yeX19fQp7e2Vsc2V9fQojIyBNZW1vcnkgTm90ZXMKX05vIGFkZGl0aW9uYWwgQ29kZXggbWVtb3J5IGluc3RydWN0aW9ucyB3ZXJlIHByb3ZpZGVkIGZvciB0aGlzIHJ1bi5fCnt7L2lmfX0KCnt7I2lmIHRvb2xtYW4udG9vbHN9fQojIyBUb29sbWFuIFRvb2xzCnt7I2VhY2ggdG9vbG1hbi50b29sc319Ci0ge3t0aGlzfX0Ke3svZWFjaH19Cnt7ZWxzZX19CiMjIFRvb2xtYW4gVG9vbHMKLSBObyByZW1vdGUgdG9vbHMgY29uZmlndXJlZC4gVG9vbG1hbiB3aWxsIHN0aWxsIHByb3ZpZGUgZGlzY292ZXJ5IGNvbW1hbmRzLgp7ey9pZn19Cgp7eyNpZiBjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319CiMjIEFkZGl0aW9uYWwgTm90ZXMKe3t7Y2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fX0Ke3svaWZ9fQo= code_codex_config.toml.hbs: IyBDb2RleCBjb25maWd1cmF0aW9uIGdlbmVyYXRlZCBieSBjb250cm9sbGVyCm1vZGVsID0gInt7bW9kZWx9fSIKe3sjaWYgdGVtcGVyYXR1cmV9fQp0ZW1wZXJhdHVyZSA9IHt7dGVtcGVyYXR1cmV9fQp7ey9pZn19Cnt7I2lmIG1heF9vdXRwdXRfdG9rZW5zfX0KbW9kZWxfbWF4X291dHB1dF90b2tlbnMgPSB7e21heF9vdXRwdXRfdG9rZW5zfX0Ke3svaWZ9fQp7eyNpZiBtb2RlbF9yZWFzb25pbmdfZWZmb3J0fX0KbW9kZWxfcmVhc29uaW5nX2VmZm9ydCA9ICJ7e21vZGVsX3JlYXNvbmluZ19lZmZvcnR9fSIKe3svaWZ9fQphcHByb3ZhbF9wb2xpY3kgPSAie3thcHByb3ZhbF9wb2xpY3l9fSIKc2FuZGJveF9tb2RlID0gInt7c2FuZGJveF9tb2RlfX0iCnByb2plY3RfZG9jX21heF9ieXRlcyA9IHt7cHJvamVjdF9kb2NfbWF4X2J5dGVzfX0KClttY3Bfc2VydmVycy50b29sbWFuXQpjb21tYW5kID0gInRvb2xtYW4iCmFyZ3MgPSBbCiAgIi0tdXJsIiwKICAie3t0b29sbWFuLnVybH19IiwKICAiLS13b3JraW5nLWRpciIsCiAgIi93b3Jrc3BhY2UiCl0KZW52ID0geyAiVE9PTE1BTl9TRVJWRVJfVVJMIiA9ICJ7e3Rvb2xtYW4udXJsfX0iIH0Kc3RhcnR1cF90aW1lb3V0X3NlYyA9IDMwCnRvb2xfdGltZW91dF9zZWMgPSAxMjAKe3sjaWYgdG9vbG1hbi50b29sc319CiMgUmVtb3RlIHRvb2xzIGF2YWlsYWJsZSB2aWEgVG9vbG1hbjoge3sjZWFjaCB0b29sbWFuLnRvb2xzfX17e3RoaXN9fXt7I3VubGVzcyBAbGFzdH19LCB7ey91bmxlc3N9fXt7L2VhY2h9fQp7ey9pZn19CgpbbW9kZWxfcHJvdmlkZXJzLm9wZW5haV0KbmFtZSA9ICJ7e21vZGVsX3Byb3ZpZGVyLm5hbWV9fSIKYmFzZV91cmwgPSAie3ttb2RlbF9wcm92aWRlci5iYXNlX3VybH19IgplbnZfa2V5ID0gInt7bW9kZWxfcHJvdmlkZXIuZW52X2tleX19Igp3aXJlX2FwaSA9ICJ7e21vZGVsX3Byb3ZpZGVyLndpcmVfYXBpfX0iCnt7I2lmIG1vZGVsX3Byb3ZpZGVyLnJlcXVlc3RfbWF4X3JldHJpZXN9fQpyZXF1ZXN0X21heF9yZXRyaWVzID0ge3ttb2RlbF9wcm92aWRlci5yZXF1ZXN0X21heF9yZXRyaWVzfX0Ke3svaWZ9fQp7eyNpZiBtb2RlbF9wcm92aWRlci5zdHJlYW1fbWF4X3JldHJpZXN9fQpzdHJlYW1fbWF4X3JldHJpZXMgPSB7e21vZGVsX3Byb3ZpZGVyLnN0cmVhbV9tYXhfcmV0cmllc319Cnt7L2lmfX0KCnt7I2lmIHJhd19hZGRpdGlvbmFsX3RvbWx9fQp7e3tyYXdfYWRkaXRpb25hbF90b21sfX19Cnt7L2lmfX0K - code_codex_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBDb2RleCBlbnZpcm9ubWVudCIKe3svaWZ9fQoKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogIC4gIiRIT01FLy5jYXJnby9lbnYiCmZpCgppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgLiAiL3Jvb3QvLmNhcmdvL2VudiIKZmkKCmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogIHJ1c3R1cCBkZWZhdWx0IHN0YWJsZSAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCgojIFByZWVtcHRpdmVseSBwcnVuZSBzdGFsZSBSdXN0dXAgZG93bmxvYWRzIHRvIGF2b2lkIENvZGV4IGlzc3VpbmcgYnVsayBjbGVhbnVwIGNvbW1hbmRzIGxhdGVyCmlmIFsgLWQgIiRIT01FLy5ydXN0dXAvZG93bmxvYWRzIiBdOyB0aGVuCiAgZmluZCAiJEhPTUUvLnJ1c3R1cC9kb3dubG9hZHMiIC1taW5kZXB0aCAxIC1kZWxldGUgMj4vZGV2L251bGwgfHwgdHJ1ZQpmaQoKZWNobyAiUEFUSDogJFBBVEgiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCmlmIFsgLXogIiR7R0lUSFVCX0FQUF9QUklWQVRFX0tFWTotfSIgXSB8fCBbIC16ICIke0dJVEhVQl9BUFBfSUQ6LX0iIF07IHRoZW4KICBlY2hvICLinYwgTWlzc2luZyBHaXRIdWIgQXBwIGNyZWRlbnRpYWxzIgogIGV4aXQgMQpmaQoKZWNobyAi8J+UkCBBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAiClRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgpwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4iJFRFTVBfS0VZX0ZJTEUiCmNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgpKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCk5PVz0kKGRhdGUgKyVzKQpFWFA9JCgoTk9XICsgNjAwKSkKSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgpybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgpwYXJzZV9yZXBvKCkgewogIGxvY2FsIGlucHV0PSIkMSIKICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8oW14vXSs/KShcLmdpdCk/JHxcMSBcMnwnCiAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsc2UKICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8XC5naXQkfHwnIHwgc2VkIC1FICdzfChbXi9dKykvKFteL10rKXxcMSBcMnwnCiAgZmkKfQoKcmVhZCBSRVBPX09XTkVSIFJFUE9fTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkUkVQT19VUkwiKSIKUkVQT19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7UkVQT19PV05FUn0vJHtSRVBPX05BTUV9LmdpdCIKCklOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCmZpCgppZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIHJlc29sdmUgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogIGV4aXQgMQpmaQoKR0lUSFVCX1RPS0VOPSQoY3VybCAtcyAtWCBQT1NUIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiIHwganEgLXIgJy50b2tlbicpCgppZiBbICIkR0lUSFVCX1RPS0VOIiA9ICJudWxsIiBdIHx8IFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIG9idGFpbiBpbnN0YWxsYXRpb24gdG9rZW4iCiAgZXhpdCAxCmZpCgpleHBvcnQgR0lUSFVCX1RPS0VOCmV4cG9ydCBHSF9UT0tFTj0iJEdJVEhVQl9UT0tFTiIKZXhwb3J0IEdIX0hPU1Q9ImdpdGh1Yi5jb20iCgpleHBvcnQgR0lUX0NPTkZJR19HTE9CQUw9L3dvcmtzcGFjZS8uZ2l0Y29uZmlnCkNSRURFTlRJQUxTX0ZJTEU9L3dvcmtzcGFjZS8uZ2l0LWNyZWRlbnRpYWxzCm1rZGlyIC1wIC93b3Jrc3BhY2UKCmdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciAic3RvcmUgLS1maWxlPSRDUkVERU5USUFMU19GSUxFIgoKd3JpdGVfZ2l0X2NyZWRlbnRpYWxzKCkgewogIGlmIFsgLXogIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICByZXR1cm4KICBmaQogIHByaW50ZiAnaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjolc0BnaXRodWIuY29tXG4nICIkR0lUSFVCX1RPS0VOIiA+IiRDUkVERU5USUFMU19GSUxFIgogIGNobW9kIDYwMCAiJENSRURFTlRJQUxTX0ZJTEUiIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKd3JpdGVfZ2l0X2NyZWRlbnRpYWxzCgpUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykKCnJlZnJlc2hfZ2l0aHViX3Rva2VuKCkgewogIGVjaG8gIvCflIQgUmVmcmVzaGluZyBHaXRIdWIgQXBwIHRva2VuLi4uIgoKICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LSQkIgogIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIE5PVz0kKGRhdGUgKyVzKQogIEVYUD0kKChOT1cgKyA2MDApKQogIEpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgSldUX1RPS0VOPSIkSldUX0hFQURFUi4kSldUX1BBWUxPQUQuJEpXVF9TSUdOQVRVUkUiCgogIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICBpZiBbICIkTkVXX0lOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkTkVXX0lOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQogIGZpCgogIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kTkVXX0lOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgTkVXX1RPS0VOPSQoZWNobyAiJFRPS0VOX1JFU1BPTlNFIiB8IGpxIC1yICcudG9rZW4nKQoKICBpZiBbICIkTkVXX1RPS0VOIiAhPSAibnVsbCIgXSAmJiBbIC1uICIkTkVXX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgZXhwb3J0IEdIX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCiAgICB3cml0ZV9naXRfY3JlZGVudGlhbHMKCiAgICBpZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBwcmludGYgJyVzXG4nICIkTkVXX1RPS0VOIiB8IHRpbWVvdXQgMTAgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gLS1ob3N0bmFtZSAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICAgIGdoIGF1dGggc2V0dXAtZ2l0ID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQoKICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQiCiAgICByZXR1cm4gMAogIGZpCgogIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogIHJldHVybiAxCn0KCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuIHx8IHRydWUKICAgIHJldHVybgogIGZpCgogIE5PVz0kKGRhdGUgKyVzKQogIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgZWNobyAi8J+UhCBUb2tlbiBhZ2U6ICQoKFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyDigJQgcmVmcmVzaGluZyIKICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuIHx8IHRydWUKICBmaQp9CgpzdG9wX2RvY2tlcl9zaWRlY2FyKCkgewogIGlmIFsgISAtUyAvdmFyL3J1bi9kb2NrZXIuc29jayBdOyB0aGVuCiAgICByZXR1cm4KICBmaQoKICBlY2hvICLwn5uRIFN0b3BwaW5nIERvY2tlciBzaWRlY2FyIgoKICBpZiBjb21tYW5kIC12IHBraWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcGtpbGwgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGVsaWYgY29tbWFuZCAtdiBraWxsYWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAga2lsbGFsbCBkb2NrZXJkID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgZWxzZQogICAgUElEPSQocGlkb2YgZG9ja2VyZCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRCIgXTsgdGhlbgogICAgICBraWxsICIkUElEIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBmaQp9Cgp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCmVuc3VyZV9naF9hdXRoZW50aWNhdGVkKCkgewogIGlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHaXRIdWIgQ0xJIChnaCkgbm90IGZvdW5kOyBza2lwcGluZyBhdXRoZW50aWNhdGlvbiIKICAgIHJldHVybiAwCiAgZmkKCiAgaWYgISBnaCBhdXRoIHN0YXR1cyAtaCAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi8J+UkCBMb2dnaW5nIGluIHRvIEdpdEh1YiBDTEkgZm9yIGhvc3QgJEdIX0hPU1QiCiAgICBpZiAhIHByaW50ZiAnJXNcbicgIiRHSVRIVUJfVE9LRU4iIHwgdGltZW91dCAxMCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAtLWhvc3RuYW1lICIkR0hfSE9TVCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBnaCBhdXRoIGxvZ2luIHJldHVybmVkIG5vbi16ZXJvIG9yIHRpbWVkIG91dDsgY29udGludWluZyB3aXRoIEdIX1RPS0VOIGVudiIKICAgIGZpCiAgZmkKCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogIGdoIGF1dGggc2V0dXAtZ2l0ID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCgogIGlmIGdoIGF1dGggc3RhdHVzIC1oICIkR0hfSE9TVCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinIUgR2l0SHViIENMSSBhdXRoZW50aWNhdGVkIGZvciAkR0hfSE9TVCIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGNvbmZpcm0gR2l0SHViIENMSSBhdXRoOyBHSF9UT0tFTiB3aWxsIHN0aWxsIGJlIHVzZWQgZm9yIGdpdCBvcGVyYXRpb25zIgogIGZpCn0KCmVuc3VyZV9naF9hdXRoZW50aWNhdGVkCgplbnN1cmVfcHJfY3JlYXRlZCgpIHsKICBpZiBbICIke1NLSVBfQVVUT19QUjotMH0iID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIuKPre+4jyAgQXV0byBQUiBjcmVhdGlvbiBkaXNhYmxlZCB2aWEgU0tJUF9BVVRPX1BSPTEiCiAgICByZXR1cm4KICBmaQoKICBpZiBbICEgLWQgLmdpdCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gUmVwb3NpdG9yeSBub3QgaW5pdGlhbGlzZWQ7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8gR2l0SHViIENMSSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBpZiBbIC16ICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEdJVEhVQl9UT0tFTiBub3Qgc2V0OyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgQ1VSUkVOVF9CUkFOQ0g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHByaW50ZiAnJykKICBpZiBbIC16ICIkQ1VSUkVOVF9CUkFOQ0giIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgYnJhbmNoOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgUFJfREFUQT0kKGdoIHByIGxpc3QgLS1zdGF0ZSBvcGVuIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tbGltaXQgMSAyPi9kZXYvbnVsbCB8fCBlY2hvICJbXSIpCiAgaWYgWyAiJChwcmludGYgJyVzJyAiJFBSX0RBVEEiIHwganEgJ2xlbmd0aCcgMj4vZGV2L251bGwgfHwgZWNobyAwKSIgLWd0IDAgXTsgdGhlbgogICAgZWNobyAi4pyFIFB1bGwgcmVxdWVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgYnJhbmNoICRDVVJSRU5UX0JSQU5DSCIKICAgIHJldHVybgogIGZpCgogIEJBU0VfQlJBTkNIPSIke1BSX0JBU0VfQlJBTkNIOi1tYWlufSIKICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICBpZiAhIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvJFJFTU9URV9CQVNFIjsgdGhlbgogICAgaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIjsgdGhlbgogICAgICBCQVNFX0JSQU5DSD0ibWFzdGVyIgogICAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICAgIGVsc2UKICAgICAgREVGQVVMVF9SRU1PVEU9JChnaXQgc3ltYm9saWMtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCAyPi9kZXYvbnVsbCB8IHNlZCAnc0BecmVmcy9yZW1vdGVzL29yaWdpbi9AQCcpCiAgICAgIGlmIFsgLW4gIiRERUZBVUxUX1JFTU9URSIgXTsgdGhlbgogICAgICAgIEJBU0VfQlJBTkNIPSIkREVGQVVMVF9SRU1PVEUiCiAgICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICAgIGVsc2UKICAgICAgICBSRU1PVEVfQkFTRT0iIgogICAgICBmaQogICAgZmkKICBmaQoKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgaWYgWyAtbiAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgICBnaXQgZmV0Y2ggb3JpZ2luICIkQkFTRV9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgZmkKCiAgaWYgWyAiJENVUlJFTlRfQlJBTkNIIiA9ICJIRUFEIiBdIHx8IFsgIiRDVVJSRU5UX0JSQU5DSCIgPSAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgICBBVVRPX0JSQU5DSD0idGFzay17e3Rhc2tfaWR9fS17e3NlcnZpY2V9fS0kKGRhdGUgKyVZJW0lZC0lSCVNJVMpIgogICAgZWNobyAi4pqg77iPIEJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0ggdW5zdWl0YWJsZSBmb3IgUFI7IGNyZWF0aW5nICRBVVRPX0JSQU5DSCIKICAgIGlmICEgZ2l0IGNoZWNrb3V0IC1CICIkQVVUT19CUkFOQ0giID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNyZWF0ZSBmYWxsYmFjayBicmFuY2ggJEFVVE9fQlJBTkNIIgogICAgICByZXR1cm4KICAgIGZpCiAgICBDVVJSRU5UX0JSQU5DSD0iJEFVVE9fQlJBTkNIIgogIGZpCgogIGdpdCBhZGQgLgogIGlmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQgLS1leGl0LWNvZGU7IHRoZW4KICAgIGVjaG8gIuKEue+4jyBObyBzdGFnZWQgY2hhbmdlcyBkZXRlY3RlZCBhZnRlciBhdXRvLXN0YWdpbmciCiAgZWxzZQogICAgQ09NTUlUX01TRz0iY2hvcmUoe3tzZXJ2aWNlfX0pOiBhdXRvLWNvbW1pdCBmb3IgdGFzayB7e3Rhc2tfaWR9fSIKICAgIGlmICEgZ2l0IGNvbW1pdCAtbSAiJENPTU1JVF9NU0ciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNvbW1pdCBzdGFnZWQgY2hhbmdlcyBhdXRvbWF0aWNhbGx5IgogICAgZWxzZQogICAgICBlY2hvICLinIUgQXV0by1jb21taXR0ZWQgc3RhZ2VkIGNoYW5nZXMiCiAgICBmaQogIGZpCgogIGlmIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgLS1xdWlldCAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgIGlmICEgZ2l0IHB1c2ggLXUgb3JpZ2luICIkQ1VSUkVOVF9CUkFOQ0giID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHB1c2ggYnJhbmNoICRDVVJSRU5UX0JSQU5DSDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgICAgcmV0dXJuCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gdmVyaWZ5IGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBnaXQgZmV0Y2ggb3JpZ2luICIkQ1VSUkVOVF9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdOyB0aGVuCiAgICBBSEVBRF9DT1VOVD0kKGdpdCByZXYtbGlzdCAtLWxlZnQtcmlnaHQgIiRSRU1PVEVfQkFTRS4uLiRDVVJSRU5UX0JSQU5DSCIgMj4vZGV2L251bGwgfCBhd2sgJy9ePi97YysrfSBFTkR7cHJpbnQgYyswfScpCiAgZWxzZQogICAgQUhFQURfQ09VTlQ9MQogIGZpCiAgaWYgWyAiJHtBSEVBRF9DT1VOVDotMH0iIC1lcSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBCcmFuY2ggJENVUlJFTlRfQlJBTkNIIGhhcyBubyBjb21taXRzIGFoZWFkIG9mICRCQVNFX0JSQU5DSDsgc2tpcHBpbmcgUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBSVU5fTEFCRUw9InJ1bi17e3dvcmtmbG93X25hbWV9fSIKICBpZiBbICIke1JVTl9MQUJFTCNydW4tfSIgPSAiIiBdOyB0aGVuCiAgICBSVU5fTEFCRUw9InJ1bi11bmtub3duIgogIGZpCgogIFRBU0tfTEFCRUw9InRhc2ste3t0YXNrX2lkfX0iCiAgU0VSVklDRV9MQUJFTD0ic2VydmljZS17e3NlcnZpY2V9fSIKICBSRVBPX1NMVUc9IiR7UkVQT19PV05FUn0vJHtSRVBPX05BTUV9IgoKICBlY2hvICLwn5SNIEVuc3VyaW5nIFBSIGNvcnJlbGF0aW9uIGxhYmVscyBleGlzdCIKICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiICIkUlVOX0xBQkVMIjsgZG8KICAgIGlmIFsgLXogIiRsYWJlbCIgXTsgdGhlbgogICAgICBjb250aW51ZQogICAgZmkKCiAgICBpZiBnaCBsYWJlbCB2aWV3ICIkbGFiZWwiIC1SICIkUkVQT19TTFVHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAiICAg4pyTIExhYmVsICckbGFiZWwnIGFscmVhZHkgZXhpc3RzIgogICAgICBjb250aW51ZQogICAgZmkKCiAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgIHNlcnZpY2UtKikgQ09MT1I9IjBlOGExNiI7IERFU0M9IlNlcnZpY2UgY29ycmVsYXRpb24iIDs7CiAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgY29ycmVsYXRpb24iIDs7CiAgICAgICopIENPTE9SPSJlZGVkZWQiOyBERVNDPSJBdXRvbWF0aW9uIGxhYmVsIiA7OwogICAgZXNhYwoKICAgIGlmIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgPi90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZyAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIiAgIOKchSBDcmVhdGVkIGxhYmVsICckbGFiZWwnIgogICAgZWxzZQogICAgICBlY2hvICIgICDinYwgRmFpbGVkIHRvIGNyZWF0ZSBsYWJlbCAnJGxhYmVsJyIKICAgICAgY2F0IC90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZyA+JjIgfHwgdHJ1ZQogICAgZmkKICAgIHJtIC1mIC90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZwogIGRvbmUKCiAgUFJfVElUTEU9ImZlYXQoe3tzZXJ2aWNlfX0pOiBjb21wbGV0ZSB0YXNrIHt7dGFza19pZH19IgogIHJlYWQgLXIgLWQgJycgUFJfQk9EWSA8PCdFT0YnIHx8IHRydWUKIyMgU3VtbWFyeQotIEF1dG8tZ2VuZXJhdGVkIGZhbGxiYWNrIFBSIGJlY2F1c2UgdGhlIENvZGV4IGFnZW50IGZpbmlzaGVkIHdpdGhvdXQgb3BlbmluZyBvbmUKLSBUYXNrIHt7dGFza19pZH19IGZvciBzZXJ2aWNlIHt7c2VydmljZX19IGlzIHJlYWR5IGZvciByZXZpZXcKCiMjIE1ldGFkYXRhCi0gQWdlbnQ6IHt7Z2l0aHViX2FwcH19Ci0gV29ya2Zsb3c6IHt7d29ya2Zsb3dfbmFtZX19Ci0gQnJhbmNoOiBcXGAkQ1VSUkVOVF9CUkFOQ0hcXGAg4oaSIFxcYCRCQVNFX0JSQU5DSFxcYAoKX1RoaXMgUFIgd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgQ29kZXggY29udGFpbmVyLl8KRU9GCgogIExBQkVMX0FSR1M9KCItLXRpdGxlIiAiJFBSX1RJVExFIiAiLS1ib2R5IiAiJFBSX0JPRFkiICItLWJhc2UiICIkQkFTRV9CUkFOQ0giICItLWhlYWQiICIkQ1VSUkVOVF9CUkFOQ0giKQoKICBtYXliZV9hZGRfbGFiZWwoKSB7CiAgICBsb2NhbCBsYWJlbD0iJDEiCiAgICBpZiBbIC16ICIkbGFiZWwiIF07IHRoZW4KICAgICAgcmV0dXJuCiAgICBmaQogICAgaWYgZ2ggbGFiZWwgdmlldyAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIExBQkVMX0FSR1MrPSgiLS1sYWJlbCIgIiRsYWJlbCIpCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBMYWJlbCAnJGxhYmVsJyBub3QgZm91bmQ7IHNraXBwaW5nIgogICAgZmkKICB9CgogIG1heWJlX2FkZF9sYWJlbCAiJFRBU0tfTEFCRUwiCiAgbWF5YmVfYWRkX2xhYmVsICIkU0VSVklDRV9MQUJFTCIKaWYgWyAtZCAiJFJFUE9fUk9PVC8uZmFjdG9yeSIgXTsgdGhlbgogIGVjaG8gIvCfp7kgUmVtb3Zpbmcgc3RhbGUgLmZhY3RvcnkgZGlyZWN0b3J5IGJlZm9yZSBDb2RleCBydW4iCiAgcm0gLXJmICIkUkVQT19ST09ULy5mYWN0b3J5IgpmaQoKICBtYXliZV9hZGRfbGFiZWwgIiRSVU5fTEFCRUwiCgogIGlmIGdoIHByIGNyZWF0ZSAiJHtMQUJFTF9BUkdTW0BdfSI7IHRoZW4KICAgIGVjaG8gIuKchSBBdXRvLWNyZWF0ZWQgcHVsbCByZXF1ZXN0IGZvciAkQ1VSUkVOVF9CUkFOQ0giCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjcmVhdGUgcHVsbCByZXF1ZXN0IGF1dG9tYXRpY2FsbHkgKGl0IG1heSBhbHJlYWR5IGV4aXN0IG9yIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCkiCiAgZmkKfQoKZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvd29ya3NwYWNlCgpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogIGxvY2FsIGFwcF9uYW1lPSIkMSIKCiAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgR0lUX0FVVEhPUl9OQU1FPSJhdXRvbWF0aW9uW2JvdF0iCiAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgcmV0dXJuCiAgZmkKCiAgbG9jYWwgc2x1ZwogIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgZmkKCiAgbG9jYWwgYm90X2xvZ2luPSIke3NsdWd9W2JvdF0iCiAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgZW5jb2RlZF9sb2dpbj0kKHByaW50ZiAnJXMnICIkYm90X2xvZ2luIiB8IHNlZCAncy9cWy8lNUIvZzsgcy9cXS8lNUQvZycpCiAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBsb2NhbCBib3RfaWQKICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICBmaQogIGZpCgogIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICBHSVRfQVVUSE9SX0VNQUlMPSIkYm90X2VtYWlsIgp9CgpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKZGVyaXZlX2JvdF9pZGVudGl0eSAiJEdJVEhVQl9BUFAiCgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRQpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTApleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfVEVSTUlOQUxfUFJPTVBUPTAKZXhwb3J0IEdJVF9BU0tQQVNTPS9iaW4vdHJ1ZQpleHBvcnQgU1NIX0FTS1BBU1M9L2Jpbi90cnVlCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBSZXBvc2l0b3J5IGNoZWNrb3V0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAteiAiJFdPUktfRElSIiBdIHx8IFsgIiRXT1JLX0RJUiIgPSAibnVsbCIgXTsgdGhlbgogIFdPUktfRElSPSJ7e3NlcnZpY2V9fSIKZmkKClRBUkdFVF9ESVI9Ii93b3Jrc3BhY2UvJFdPUktfRElSIgpta2RpciAtcCAiJFRBUkdFVF9ESVIiCmNkIC93b3Jrc3BhY2UKClJFUE9fUk9PVD0iL3dvcmtzcGFjZS8kUkVQT19OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5ICIkUkVQT19ST09UIgoKaWYgWyAtZCAiJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgZWNobyAi8J+UgSBSZXBvc2l0b3J5IGFscmVhZHkgY2xvbmVkLCBmZXRjaGluZyBsYXRlc3QiCiAgY2QgIiRSRVBPX05BTUUiCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBnaXQgZmV0Y2ggLS1hbGwgLS1wcnVuZQplbHNlCiAgZWNobyAi4qyH77iPICBDbG9uaW5nIHJlcG9zaXRvcnkiCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIgogIGNkICIkUkVQT19OQU1FIgpmaQoKZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAiJFJFUE9fUk9PVCIKY2QgIiRSRVBPX1JPT1QiCiMgUmVtb3ZlIHN0YWxlIGF1dG9tYXRpb24tbWFuYWdlZCBmaWxlcyB0aGF0IGJsb2NrIGJyYW5jaCBjaGVja291dCB3aGVuIHJlcnVubmluZwpNQU5BR0VEX1BBVEhTPSgKICAiLm1jcC5qc29uIgogICJBR0VOVFMubWQiCiAgImNsaWVudC1jb25maWcuanNvbiIKICAiY29kaW5nLWd1aWRlbGluZXMubWQiCiAgImdpdGh1Yi1ndWlkZWxpbmVzLm1kIgogICJ0YXNrIgopCgpmb3IgbWFuYWdlZF9wYXRoIGluICIke01BTkFHRURfUEFUSFNbQF19IjsgZG8KICBpZiBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoICIkbWFuYWdlZF9wYXRoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGNvbnRpbnVlCiAgZmkKICBpZiBbIC1lICIkbWFuYWdlZF9wYXRoIiBdOyB0aGVuCiAgICBlY2hvICLwn6e5IFJlbW92aW5nIHN0YWxlIGZpbGUgdG8gYWxsb3cgY2hlY2tvdXQ6ICRtYW5hZ2VkX3BhdGgiCiAgICBybSAtcmYgIiRtYW5hZ2VkX3BhdGgiCiAgZmkKZG9uZQoKQkFTRV9CUkFOQ0g9IiR7UFJfQkFTRV9CUkFOQ0g6LW1haW59IgpSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKCmlmICEgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy8kUkVNT1RFX0JBU0UiOyB0aGVuCiAgIyBGYWxsIGJhY2sgdG8gb3JpZ2luL21hc3RlciBvciB0aGUgcmVtb3RlIEhFQUQgaWYgbWFpbiBpcyBhYnNlbnQKICBpZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiOyB0aGVuCiAgICBCQVNFX0JSQU5DSD0ibWFzdGVyIgogICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgZWxzZQogICAgREVGQVVMVF9SRU1PVEU9JChnaXQgc3ltYm9saWMtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCAyPi9kZXYvbnVsbCB8IHNlZCAnc0BecmVmcy9yZW1vdGVzL29yaWdpbi9AQCcpCiAgICBpZiBbIC1uICIkREVGQVVMVF9SRU1PVEUiIF07IHRoZW4KICAgICAgQkFTRV9CUkFOQ0g9IiRERUZBVUxUX1JFTU9URSIKICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICBlbHNlCiAgICAgIFJFTU9URV9CQVNFPSIiCiAgICBmaQogIGZpCmZpCgppZiBbIC1uICIkQkFTRV9CUkFOQ0giIF07IHRoZW4KICBnaXQgZmV0Y2ggb3JpZ2luICIkQkFTRV9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCmZpCgpGRUFUVVJFX0JSQU5DSD0iZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uIgppZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9oZWFkcy8kRkVBVFVSRV9CUkFOQ0giOyB0aGVuCiAgZWNobyAiRmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZXhpc3RzLCBjaGVja2luZyBvdXQuLi4iCiAgIyBTdGFzaCBhbnkgbG9jYWwgY2hhbmdlcyBmcm9tIHByZXZpb3VzIHJ1bnMgdG8gYXZvaWQgY2hlY2tvdXQgY29uZmxpY3RzCiAgaWYgISBnaXQgZGlmZi1pbmRleCAtLXF1aWV0IEhFQUQgLS0gfHwgWyAtbiAiJChnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS1leGNsdWRlLXN0YW5kYXJkKSIgXTsgdGhlbgogICAgZWNobyAi8J+UhCBTdGFzaGluZyBsb2NhbCBjaGFuZ2VzIGFuZCB1bnRyYWNrZWQgZmlsZXMgYmVmb3JlIGNoZWNrb3V0IgogICAgZ2l0IHN0YXNoIHB1c2ggLS1pbmNsdWRlLXVudHJhY2tlZCAtbSAiQXV0by1zdGFzaCBiZWZvcmUgY2hlY2tvdXQgKCQoZGF0ZSAtdSArJVklbSVkLSVIJU0lUykpIiB8fCB0cnVlCiAgZmkKICBnaXQgY2hlY2tvdXQgIiRGRUFUVVJFX0JSQU5DSCIKICBpZiBbIC1uICIkUkVNT1RFX0JBU0UiIF07IHRoZW4KICAgIGVjaG8gIvCfk6UgRmFzdC1mb3J3YXJkaW5nICRGRUFUVVJFX0JSQU5DSCB3aXRoICRSRU1PVEVfQkFTRSIKICAgIGlmICEgZ2l0IG1lcmdlICIkUkVNT1RFX0JBU0UiIC0tZmYtb25seSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byBmYXN0LWZvcndhcmQgJEZFQVRVUkVfQlJBTkNIOyBjcmVhdGluZyBmcmVzaCBicmFuY2ggZnJvbSAkUkVNT1RFX0JBU0UiCiAgICAgIE5FV19CUkFOQ0g9IiR7RkVBVFVSRV9CUkFOQ0h9LSQoZGF0ZSAtdSArJVklbSVkJUglTSVTKSIKICAgICAgZ2l0IGNoZWNrb3V0IC1CICIkTkVXX0JSQU5DSCIgIiRSRU1PVEVfQkFTRSIKICAgICAgRkVBVFVSRV9CUkFOQ0g9IiRORVdfQlJBTkNIIgogICAgZmkKICBmaQplbHNlCiAgZWNobyAiQ3JlYXRpbmcgbmV3IGZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIgogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXSAmJiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAgIGdpdCBjaGVja291dCAtYiAiJEZFQVRVUkVfQlJBTkNIIiAiJFJFTU9URV9CQVNFIgogIGVsc2UKICAgIGdpdCBjaGVja291dCAtYiAiJEZFQVRVUkVfQlJBTkNIIgogIGZpCmZpCgpnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCmdpdCBjb25maWcgLS1sb2NhbCBwdXNoLmF1dG9TZXR1cFJlbW90ZSB0cnVlCmV4cG9ydCBJTVBMRU1FTlRBVElPTl9CUkFOQ0g9IiRGRUFUVVJFX0JSQU5DSCIKZWNobyAi4pyTIFVzaW5nIGZlYXR1cmUgYnJhbmNoOiAkRkVBVFVSRV9CUkFOQ0ggKGJhc2U6ICR7QkFTRV9CUkFOQ0g6LXVua25vd259KSIKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5OiB1c2UgcmVwbyByb290IGlmIHdvcmtpbmdfZGlyZWN0b3J5IGlzICIuIiBvciBlbXB0eQppZiBbICIkV09SS19ESVIiID0gIi4iIF0gfHwgWyAteiAiJFdPUktfRElSIiBdIHx8IFsgIiRXT1JLX0RJUiIgPSAibnVsbCIgXTsgdGhlbgogIENPREVYX1dPUktfRElSPSIkUkVQT19ST09UIgplbHNlCiAgQ09ERVhfV09SS19ESVI9IiRSRVBPX1JPT1QvJFdPUktfRElSIgogIG1rZGlyIC1wICIkQ09ERVhfV09SS19ESVIiCmZpCgpjZCAiJENPREVYX1dPUktfRElSIgplY2hvICLinJMgV29ya2luZyBkaXJlY3Rvcnk6ICRDT0RFWF9XT1JLX0RJUiIKCmVjaG8gIvCfk6YgZ2l0IHN0YXR1cyIKcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKZ2l0IHN0YXR1cyAtLXNob3J0IHx8IHRydWUKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1hdGVyaWFsaXNlIHRhc2sgY29udGV4dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmVjaG8gIvCfp7EgU3luY2luZyB0YXNrIGFzc2V0cyIKbWtkaXIgLXAgIiRDT0RFWF9XT1JLX0RJUi90YXNrIgpjcCAtUiAvdGFzay1maWxlcy90YXNrLyogIiRDT0RFWF9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQoKRE9DU19SRVBPX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCkRPQ1NfQlJBTkNIPSJ7e2RvY3NfYnJhbmNofX0iCkRPQ1NfUFJPSkVDVF9ESVJFQ1RPUlk9Int7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgoKaWYgWyAtbiAiJERPQ1NfUkVQT19VUkwiIF0gJiYgWyAiJERPQ1NfUkVQT19VUkwiICE9ICJudWxsIiBdOyB0aGVuCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBpZiBbIC16ICIkRE9DU19CUkFOQ0giIF0gfHwgWyAiJERPQ1NfQlJBTkNIIiA9ICJudWxsIiBdOyB0aGVuCiAgICBET0NTX0JSQU5DSD0ibWFpbiIKICBmaQoKICBlY2hvICLwn5OaIFN5bmNpbmcgZG9jcyByZXBvc2l0b3J5OiAkRE9DU19SRVBPX1VSTCAoYnJhbmNoOiAkRE9DU19CUkFOQ0gpIgogIERPQ1NfQ0xPTkVfRElSPSIvdG1wL2RvY3MtcmVwbyIKICBybSAtcmYgIiRET0NTX0NMT05FX0RJUiIKCiAgcmVhZCBET0NTX09XTkVSIERPQ1NfTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkRE9DU19SRVBPX1VSTCIpIgogIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke0RPQ1NfT1dORVJ9LyR7RE9DU19OQU1FfS5naXQiCgogIGlmIGdpdCBjbG9uZSAtLXF1aWV0IC0tYnJhbmNoICIkRE9DU19CUkFOQ0giIC0tc2luZ2xlLWJyYW5jaCAiJERPQ1NfSFRUUF9VUkwiICIkRE9DU19DTE9ORV9ESVIiOyB0aGVuCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNsb25lIGRvY3MgYnJhbmNoICckRE9DU19CUkFOQ0gnOyBhdHRlbXB0aW5nIGRlZmF1bHQgYnJhbmNoIgogICAgaWYgZ2l0IGNsb25lIC0tcXVpZXQgIiRET0NTX0hUVFBfVVJMIiAiJERPQ1NfQ0xPTkVfRElSIjsgdGhlbgogICAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCB1c2luZyBkZWZhdWx0IGJyYW5jaCIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIFVuYWJsZSB0byBjbG9uZSBkb2NzIHJlcG9zaXRvcnk6ICRET0NTX0hUVFBfVVJMIgogICAgICBET0NTX0NMT05FX0RJUj0iIgogICAgZmkKICBmaQoKICBpZiBbIC1uICIkRE9DU19DTE9ORV9ESVIiIF07IHRoZW4KICAgIERPQ1NfQkFTRV9QQVRIPSIkRE9DU19DTE9ORV9ESVIvLnRhc2ttYXN0ZXIiCiAgICBpZiBbIC1uICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgXSAmJiBbICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgIT0gIm51bGwiIF07IHRoZW4KICAgICAgRE9DU19CQVNFX1BBVEg9IiRET0NTX0NMT05FX0RJUi8kRE9DU19QUk9KRUNUX0RJUkVDVE9SWS8udGFza21hc3RlciIKICAgIGZpCgogICAgZWNobyAi8J+UjSBEb2NzIGJhc2UgcGF0aDogJERPQ1NfQkFTRV9QQVRIIgogICAgVEFTS19ESVI9IiRET0NTX0JBU0VfUEFUSC9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCgogIGlmIFsgLWQgIiRUQVNLX0RJUiIgXTsgdGhlbgogICAgZWNobyAi4pyTIENvcHlpbmcgdGFzayBkZWZpbml0aW9uIGZyb20gJFRBU0tfRElSIgogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICAgIGNwIC1SICIkVEFTS19ESVIiLy4gIiRDT0RFWF9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxzZQogICAgICBlY2hvICLinYwgQ1JJVElDQUw6IFRhc2sgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAkVEFTS19ESVIiCiAgICBmaQoKICAgIGlmIFsgLWYgIiRET0NTX0JBU0VfUEFUSC90YXNrcy5qc29uIiBdOyB0aGVuCiAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgICAgIGNwICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgIiRDT0RFWF9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQplbHNlCiAgZWNobyAi4pqg77iPIERvY3MgcmVwb3NpdG9yeSBVUkwgbm90IHByb3ZpZGVkOyBza2lwcGluZyB0YXNrIGRvY3Mgc3luYyIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvQUdFTlRTLm1kIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9BR0VOVFMubWQgIiRDT0RFWF9XT1JLX0RJUi9BR0VOVFMubWQiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCAiJENPREVYX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDT0RFWF9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIiRDT0RFWF9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjbGllbnQtY29uZmlnLmpzb24gdG8gd29ya2luZyBkaXJlY3RvcnkiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL21jcC5qc29uIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9tY3AuanNvbiAiJENPREVYX1dPUktfRElSLy5tY3AuanNvbiIKZmkKCiMgR3VhcmQgYWdhaW5zdCBkZXN0cnVjdGl2ZSB3b3Jrc3BhY2UgY2xlYW51cCAod29ya3NwYWNlIHJvb3QsIHJlcG9zaXRvcnkgcm9vdCwgb3IgUnVzdHVwIGNhY2hlKQpndWFyZF9ybSgpIHsKICBpZiBbICIkIyIgLWdlIDIgXTsgdGhlbgogICAgbG9jYWwgZmxhZ3M9KCkKICAgIGxvY2FsIHRhcmdldHM9KCkKICAgIGZvciBhcmcgaW4gIiRAIjsgZG8KICAgICAgY2FzZSAiJGFyZyIgaW4KICAgICAgICAtKikgZmxhZ3MrPSgiJGFyZyIpIDs7CiAgICAgICAgKikgdGFyZ2V0cys9KCIkYXJnIikgOzsKICAgICAgZXNhYwogICAgZG9uZQoKICAgIGxvY2FsIGhhc19yZWN1cnNpdmU9MAogICAgbG9jYWwgaGFzX2ZvcmNlPTAKICAgIGZvciBmbGFnIGluICIke2ZsYWdzW0BdfSI7IGRvCiAgICAgIGNhc2UgIiRmbGFnIiBpbgogICAgICAgIC0qKQogICAgICAgICAgW1sgIiRmbGFnIiA9PSAqciogfHwgIiRmbGFnIiA9PSAqUiogXV0gJiYgaGFzX3JlY3Vyc2l2ZT0xCiAgICAgICAgICBbWyAiJGZsYWciID09ICpmKiB8fCAiJGZsYWciID09ICpGKiBdXSAmJiBoYXNfZm9yY2U9MQogICAgICAgICAgOzsKICAgICAgZXNhYwogICAgZG9uZQoKICAgIGlmICgoaGFzX3JlY3Vyc2l2ZSAmJiBoYXNfZm9yY2UpKTsgdGhlbgogICAgICBmb3IgdGFyZ2V0IGluICIke3RhcmdldHNbQF19IjsgZG8KICAgICAgICBbIC16ICIkdGFyZ2V0IiBdICYmIGNvbnRpbnVlCiAgICAgICAgbG9jYWwgZXhwYW5kZWQ9IiR0YXJnZXQiCiAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KICAgICAgICAgIH4qKSBleHBhbmRlZD0iJHt0YXJnZXQvI1x+LyRIT01FfSIgOzsKICAgICAgICBlc2FjCiAgICAgICAgbG9jYWwgcmVzb2x2ZWQKICAgICAgICByZXNvbHZlZD0kKHJlYWxwYXRoIC1tICIkZXhwYW5kZWQiIDI+L2Rldi9udWxsIHx8IHByaW50ZiAnJXMnICIkZXhwYW5kZWQiKQogICAgICAgIGlmIFsgIiRyZXNvbHZlZCIgPSAiJENPREVYX1dPUktfRElSIiBdIHx8IFsgIiRyZXNvbHZlZCIgPSAiL3dvcmtzcGFjZSIgXSB8fAogICAgICAgICAgIFsgIiRyZXNvbHZlZCIgPSAiJEhPTUUiIF0gfHwgW1sgIiRyZXNvbHZlZCIgPT0gIiRIT01FLy5ydXN0dXAiKiBdXTsgdGhlbgogICAgICAgICAgZWNobyAi4p2MIEd1YXJkOiBkZXN0cnVjdGl2ZSBybSBibG9ja2VkICh0YXJnZXQ9JHRhcmdldCkiID4mMgogICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgICBkb25lCiAgICBmaQogIGZpCgogIHJldHVybiAwCn0KCnJtKCkgewogIGlmIGd1YXJkX3JtICIkQCI7IHRoZW4KICAgIGNvbW1hbmQgcm0gIiRAIgogIGVsc2UKICAgIHJldHVybiAxCiAgZmkKfQoKZXhwb3J0IC1mIGd1YXJkX3JtIHJtCgppZiBbICEgLWYgIiRDT0RFWF9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICBlY2hvICLinYwgY2xpZW50LWNvbmZpZy5qc29uIG1pc3NpbmcgZnJvbSB3b3Jrc3BhY2U7IHJlcXVpcmVkIGZvciBNQ1AvdG9vbG1hbiIKICBleGl0IDEKZmkKCmVjaG8gIj09PSBNQ1AgQ0xJRU5UIENPTkZJRyA9PT0iCldPUktTUEFDRV9DRkc9IiRDT0RFWF9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iClNPVVJDRV9DRkc9Ii90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIKVEFSR0VUX0NGRz0iJHtNQ1BfQ0xJRU5UX0NPTkZJRzotL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb259IgoKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHBhdGg9IiQxIgogIFsgLWYgIiRwYXRoIiBdIHx8IHJldHVybiAxCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGpxIC1lICd0eXBlPT0ib2JqZWN0IiBhbmQgbGVuZ3RoPj0wJyAiJHBhdGgiID4vZGV2L251bGwgMj4mMQogIGVsc2UKICAgIFsgLXMgIiRwYXRoIiBdCiAgZmkKfQoKaWYgaXNfdmFsaWRfY2ZnICIkV09SS1NQQUNFX0NGRyI7IHRoZW4KICBjcCAiJFdPUktTUEFDRV9DRkciICIkVEFSR0VUX0NGRyIKICBlY2hvICLinJMgVXNpbmcgTUNQIGNsaWVudCBjb25maWcgZnJvbSB3b3Jrc3BhY2U6ICRUQVJHRVRfQ0ZHIgplbGlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuCiAgY3AgIiRTT1VSQ0VfQ0ZHIiAiJFdPUktTUEFDRV9DRkciCiAgY3AgIiRTT1VSQ0VfQ0ZHIiAiJFRBUkdFVF9DRkciCiAgZWNobyAi4pyTIFJlc3RvcmVkIE1DUCBjbGllbnQgY29uZmlnIGZyb20gc291cmNlOiAkVEFSR0VUX0NGRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBNQ1AgY2xpZW50IGNvbmZpZyBhdmFpbGFibGUgKGNoZWNrZWQgJFdPUktTUEFDRV9DRkcgYW5kICRTT1VSQ0VfQ0ZHKSIKICBpZiBbIC1mICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgV29ya3NwYWNlIGNvbnRlbnRzIHByZXZpZXc6IjsgaGVhZCAtYyAyMDAgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIgICA8dW5yZWFkYWJsZT4iCiAgZmkKICBpZiBbIC1mICIkU09VUkNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgU291cmNlIGNvbnRlbnRzIHByZXZpZXc6IjsgaGVhZCAtYyAyMDAgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIgICA8dW5yZWFkYWJsZT4iCiAgZmkKICBleGl0IDEKZmkKCk1DUF9DTElFTlRfQ09ORklHPSIkVEFSR0VUX0NGRyIKZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHCgppZiBbIC1mICIkTUNQX0NMSUVOVF9DT05GSUciIF07IHRoZW4KICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAiW2NsaWVudC1jb25maWddIHN1bW1hcnk6IgogICAgaWYgISBqcSAtciAnInJlbW90ZVRvb2xzPSIgKyAoKC5yZW1vdGVUb29scyAvLyBbXSkgfCBsZW5ndGggfCB0b3N0cmluZykgKyAiLCBsb2NhbFNlcnZlcnM9IiArICgoLmxvY2FsU2VydmVycyAvLyB7fSB8IGtleXMpIHwgam9pbigiLCIpKScgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAiICAobm90IHZhbGlkIEpTT04pIgogICAgZmkKICBmaQpmaQoKZWNobyAiPT09IGNsaWVudC1jb25maWcuanNvbiA9PT0iCmlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAganEgJy4nICIkTUNQX0NMSUVOVF9DT05GSUciIDI+L2Rldi9udWxsIHx8IGNhdCAiJE1DUF9DTElFTlRfQ09ORklHIgplbHNlCiAgY2F0ICIkTUNQX0NMSUVOVF9DT05GSUciCmZpCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09IgoKbWtkaXIgLXAgIiRIT01FLy5jb2RleCIKaWYgWyAtZiAvdGFzay1maWxlcy9jb2RleC1jb25maWcudG9tbCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvY29kZXgtY29uZmlnLnRvbWwgIiRIT01FLy5jb2RleC9jb25maWcudG9tbCIKICBlY2hvICLinJMgSW5zdGFsbGVkIGNvZGV4LWNvbmZpZy50b21sIgplbHNlCiAgZWNobyAi4pqg77iPIGNvZGV4LWNvbmZpZy50b21sIG5vdCBwcm92aWRlZDsgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRzIgpmaQoKZWNobyAiPT09IE1DUCBQUkVDSEVDS1MgPT09IgppZiAhIGNvbW1hbmQgLXYgdG9vbG1hbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLinYwgJ3Rvb2xtYW4nIENMSSBub3QgZm91bmQgaW4gUEFUSDsgcmVxdWlyZWQgZm9yIE1DUCIKICBleGl0IDEKZmkKClRPT0xNQU5fVVJMPSR7VE9PTE1BTl9TRVJWRVJfVVJMOi0iaHR0cDovL3Rvb2xtYW4uYWdlbnQtcGxhdGZvcm0uc3ZjLmNsdXN0ZXIubG9jYWw6MzAwMC9tY3AifQpUT09MTUFOX1VSTD0iJHtUT09MTUFOX1VSTCUvfSIKZWNobyAi8J+UjSBDaGVja2luZyBUb29sbWFuIGVuZHBvaW50OiAkVE9PTE1BTl9VUkwiCmlmICEgY3VybCAtc1NmIC0tY29ubmVjdC10aW1lb3V0IDIgLS1tYXgtdGltZSA2IFwKICAtWCBQT1NUICIkVE9PTE1BTl9VUkwiIFwKICAtSCAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcCiAgLWQgJ3sianNvbnJwYyI6IjIuMCIsImlkIjoiaGVhbHRoIiwibWV0aG9kIjoidG9vbHMvbGlzdCIsInBhcmFtcyI6e319JyA+L3RtcC90b29sbWFuLXBpbmcubG9nIDI+JjE7IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIHJlYWNoIFRvb2xtYW4gc2VydmVyIGF0ICRUT09MTUFOX1VSTCIKICBjYXQgL3RtcC90b29sbWFuLXBpbmcubG9nID4mMiB8fCB0cnVlCiAgcm0gLWYgL3RtcC90b29sbWFuLXBpbmcubG9nCiAgZXhpdCAxCmZpCnJtIC1mIC90bXAvdG9vbG1hbi1waW5nLmxvZwplY2hvICLinJMgVG9vbG1hbiBlbmRwb2ludCByZWFjaGFibGUiCgojIFJlZnJlc2ggVG9vbG1hbiByZW1vdGUgdG9vbHMgc28gdGhlIE1DUCBjbGllbnQgc2VlcyB0aGUgZnVsbCBjYXRhbG9nIChDb2RleCBmaWx0ZXJzIGFnZ3Jlc3NpdmVseSkKaWYgWyAteiAiJHtPUEVOQUlfQVBJX0tFWTotfSIgXTsgdGhlbgogIGVjaG8gIuKdjCBPUEVOQUlfQVBJX0tFWSBpcyBub3Qgc2V0OyBDb2RleCBjYW5ub3QgYXV0aGVudGljYXRlIgogIGV4aXQgMQpmaQoKZWNobyAi8J+UkSBDb25maWd1cmluZyBDb2RleCBhdXRoZW50aWNhdGlvbiIKaWYgISBjb2RleCBsb2dpbiAtLWFwaS1rZXkgIiRPUEVOQUlfQVBJX0tFWSIgPi90bXAvY29kZXgtbG9naW4ubG9nIDI+JjE7IHRoZW4KICBlY2hvICLinYwgRmFpbGVkIHRvIGNvbmZpZ3VyZSBDb2RleCBBUEkga2V5IgogIGNhdCAvdG1wL2NvZGV4LWxvZ2luLmxvZyA+JjIgfHwgdHJ1ZQogIHJtIC1mIC90bXAvY29kZXgtbG9naW4ubG9nCiAgZXhpdCAxCmZpCnJtIC1mIC90bXAvY29kZXgtbG9naW4ubG9nCgppZiBbICEgLWYgIiRDT0RFWF9XT1JLX0RJUi9BR0VOVFMubWQiIF07IHRoZW4KICBlY2hvICLimqDvuI8gQUdFTlRTLm1kIG1pc3Npbmc7IGNyZWF0aW5nIHBsYWNlaG9sZGVyIgogIGNhdCA8PCdQTEFDRUhPTERFUicgPiAiJENPREVYX1dPUktfRElSL0FHRU5UUy5tZCIKIyBQcm9qZWN0IEd1aWRhbmNlCgpUaGlzIENvZGV4IHJ1biB3YXMgdHJpZ2dlcmVkIHdpdGhvdXQgQUdFTlRTLm1kIGNvbnRlbnQuIFByb3ZpZGUgcHJvamVjdCBjb250ZXh0IGluIEFHRU5UUy5tZCB0byBnaXZlIENvZGV4IHJpY2hlciBpbnN0cnVjdGlvbnMuClBMQUNFSE9MREVSCmZpCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQcm9tcHQgYXNzZW1ibHkgYW5kIENvZGV4IGV4ZWN1dGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClBST01QVF9QUkVGSVg9IiIKaWYgWyAtZiAiJENPREVYX1dPUktfRElSL3Rhc2svdG9vbG1hbi1ndWlkZS5tZCIgXTsgdGhlbgogIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH3wn5SnICoqQ1JJVElDQUw6IFRvb2wgVXNhZ2UgUmVmZXJlbmNlKipcblxuJChjYXQgIiRDT0RFWF9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiKVxuXG4tLS1cblxuIgpmaQoKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfeKaoO+4jyAqKkVYRUNVVElPTiBSRVFVSVJFTUVOVFMgKE1BTkRBVE9SWSkqKlxuXG4tICoqRm9sbG93IHBhdHRlcm5zKio6IHJlZmVyZW5jZSBAY29kaW5nLWd1aWRlbGluZXMubWQgYW5kIEBnaXRodWItZ3VpZGVsaW5lcy5tZCBpbiB0aGlzIHdvcmtzcGFjZS5cbi0gKipObyBtb2NrcyBvciBzdHVicyoqOiBpbnRlZ3JhdGUgd2l0aCBsaXZlIHNlcnZpY2VzLCBBUElzLCBhbmQgY29uZmlndXJhdGlvbjsgcmVtb3ZlIGFsbCBwbGFjZWhvbGRlcnMuXG4tICoqUGFyYW1ldGVyaXplIGV2ZXJ5dGhpbmcqKjogZXZlcnkgZW5kcG9pbnQsIHRocmVzaG9sZCwgb3IgdHJhZGluZyBwYWlyIG11c3QgY29tZSBmcm9tIGVudiB2YXJzLCBjb25maWcsIG9yIENMSSBmbGFncy5cbi0gKipHaXRIdWIgYXV0aCByZWFkeSoqOiB0aGUgR2l0SHViIEFwcCB0b2tlbiAoXGBHSF9UT0tFTlxgKSBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHNraXAgbWFudWFsIFxgZ2ggYXV0aCBsb2dpblxgIGZsb3dzIGFuZCBhdm9pZCBoaXR0aW5nIHVzZXItb25seSBlbmRwb2ludHMgbGlrZSBcYC91c2VyXGAuXG4tICoqRmVhdHVyZSBicmFuY2ggb25seSoqOiBzdGF5IG9uIFxgZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uXGA7IG5ldmVyIHB1c2ggZGlyZWN0bHkgdG8gbWFpbi9tYXN0ZXIgb3IgcmV0YXJnZXQgdGhlIGJyYW5jaCB1cHN0cmVhbS5cbi0gKipFeGVjdXRlIHdpdGhvdXQgcGF1c2UqKjogaWYgeW91IG91dGxpbmUgYSBwbGFuLCBpbW1lZGlhdGVseSBjYXJyeSBpdCBvdXTigJRkbyBub3Qgd2FpdCBmb3IgY29uZmlybWF0aW9uIG9yIGFkZGl0aW9uYWwgaW5wdXQuXG4tICoqUXVhbGl0eSBnYXRlcyoqOiBydW4gXGBjYXJnbyBmbXQgLS1hbGwgLS0gLS1jaGVja1xgLCBcYGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNcYCwgYW5kIFxgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc1xgIGJlZm9yZSBkZWNsYXJpbmcgc3VjY2Vzcy5cbi0gKipEb2N1bWVudGF0aW9uICYgUFIqKjogdXBkYXRlIHByb2plY3QgZG9jcyBhbmQgb3BlbiBhIFBSIHZpYSBcYGdoIHByIGNyZWF0ZVxgIHdpdGggbGFiZWxzIHRhc2ste3t0YXNrX2lkfX0sIHNlcnZpY2Ute3tzZXJ2aWNlfX0sIGFuZCBydW4te3t3b3JrZmxvd19uYW1lfX0uXG4tICoqUHJlc2VydmUgd29ya3NwYWNlKio6IG5ldmVyIGRlbGV0ZSB0aGUgcmVwb3NpdG9yeSBvciBydW4gZGVzdHJ1Y3RpdmUgY2xlYW51cCBjb21tYW5kcyAoZm9yIGV4YW1wbGUgXGBybSAtcmZcYCk7IGxlYXZlIGFydGlmYWN0cyBpbiBwbGFjZSBmb3IgUUEuXG5cbi0tLVxuXG4iCgppZiBbIC1mICIkQ09ERVhfV09SS19ESVIvZ2l0aHViLWd1aWRlbGluZXMubWQiIF0gfHwgWyAtZiAiJENPREVYX1dPUktfRElSL2NvZGluZy1ndWlkZWxpbmVzLm1kIiBdOyB0aGVuCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCfk5ogKipSZWZlcmVuY2UgTWF0ZXJpYWxzIEF2YWlsYWJsZSoqXG4iCiAgaWYgWyAtZiAiJENPREVYX1dPUktfRElSL2dpdGh1Yi1ndWlkZWxpbmVzLm1kIiBdOyB0aGVuCiAgICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBAZ2l0aHViLWd1aWRlbGluZXMubWRcbiIKICBmaQogIGlmIFsgLWYgIiRDT0RFWF9XT1JLX0RJUi9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQGNvZGluZy1ndWlkZWxpbmVzLm1kXG4iCiAgZmkKICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9XG4tLS1cblxuIgpmaQoKaWYgWyAtZiAiJENPREVYX1dPUktfRElSL0FHRU5UUy5tZCIgXTsgdGhlbgogIGlmIEFHRU5UX0dVSURBTkNFPSQoanEgLVJzIEBqc29uICIkQ09ERVhfV09SS19ESVIvQUdFTlRTLm1kIiAyPi9kZXYvbnVsbCk7IHRoZW4KICAgIGlmIFsgIiR7I0FHRU5UX0dVSURBTkNFfSIgLWd0IDIgXTsgdGhlbgogICAgICBBR0VOVF9HVUlEQU5DRT0ke0FHRU5UX0dVSURBTkNFOjE6LTF9CiAgICAgIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH3wn6egICoqQWdlbnQgR3VpZGFuY2UqKlxuXG4ke0FHRU5UX0dVSURBTkNFfVxuXG4tLS1cblxuIgogICAgZmkKICBmaQpmaQoKZWNobyAi8J+UjSBERUJVRzogQWJvdXQgdG8gY2hlY2sgZm9yIHByb21wdC5tZCBhdDogJENPREVYX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiB0YXNrIGRpcmVjdG9yeToiCmxzIC1sYSAiJENPREVYX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW1wdHkiCmVjaG8gIvCflI0gREVCVUc6IEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgY29udGVudHM6IgpscyAtbGEgIiRDT0RFWF9XT1JLX0RJUi8iIHx8IGVjaG8gIldvcmtpbmcgZGlyZWN0b3J5IG5vdCBhY2Nlc3NpYmxlIgoKUFJPTVBUX0ZJTEU9IiRDT0RFWF9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKaWYgWyAhIC1mICIkUFJPTVBUX0ZJTEUiIF07IHRoZW4KICBlY2hvICLinYwgcHJvbXB0Lm1kIG5vdCBmb3VuZCBhdCAkUFJPTVBUX0ZJTEUiCiAgZXhpdCAxCmZpCgplY2hvICJzdGFydGluZ1Rhc2s6e3t0YXNrX2lkfX0iCmVjaG8gIiIKClBST01QVF9DT05URU5UPSIke1BST01QVF9QUkVGSVh9JChjYXQgIiRQUk9NUFRfRklMRSIpIgoKT1JJR0lOQUxfUFJPTVBUPSIkUFJPTVBUX0NPTlRFTlQiClBSRVZJT1VTX01FU1NBR0VfRklMRT0iIgpUT0tFTl9MSU1JVD0ke0NPREVYX1RPS0VOX0xJTUlUOi0yNDAwMDB9CkNPREVYX1RJTUVPVVQ9JHtDT0RFWF9FWEVDX1RJTUVPVVQ6LTE4MDB9ClJFU0VUX1NFU1NJT05fT05fUkVUUlk9JHtDT0RFWF9SRVNFVF9TRVNTSU9OX09OX1JFVFJZOi0xfQpDT05USU5VRV9TRVNTSU9OPSR7Q09ERVhfQ09OVElOVUVfU0VTU0lPTjotMX0KCk1BWF9SRVRSSUVTPSR7Q09ERVhfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi01fX0KQVRURU1QVD0xClNVQ0NFU1M9MApDT0RFWF9FWElUPTEKTEFTVF9NRVNTQUdFX0ZJTEU9IiIKUlVOX0xPRz0iIgoKU0VTU0lPTl9ESVI9IiRIT01FLy5jb2RleC9zZXNzaW9ucyIKUkVTVU1FX0FSR1M9KCkKU0VTU0lPTl9GSUxFPSIkQ09ERVhfV09SS19ESVIvLmNvZGV4LXNlc3Npb24iCkNVUlJFTlRfU0VTU0lPTl9JRD0iIgoKIyBDaXJjdWl0IGJyZWFrZXI6IHRyYWNrIHJlcGVhdGVkIGNvbW1hbmQgZmFpbHVyZXMKZGVjbGFyZSAtQSBGQUlMRURfQ09NTUFORFMKTUFYX1NBTUVfQ09NTUFORF9GQUlMVVJFUz0zCgppZiBbIC1mICIkU0VTU0lPTl9GSUxFIiBdOyB0aGVuCiAgQ1VSUkVOVF9TRVNTSU9OX0lEPSQodHIgLWQgJ1xyXG4gJyA8ICIkU0VTU0lPTl9GSUxFIiAyPi9kZXYvbnVsbCB8fCB0cnVlKQpmaQoKZXh0cmFjdF9zZXNzaW9uX2lkKCkgewogIGxvY2FsIGxvZ19maWxlPSIkMSIKICBbIC1mICIkbG9nX2ZpbGUiIF0gfHwgcmV0dXJuIDEKICBhd2sgJwogICAgewogICAgICBnc3ViKC9cMDMzXFtbMC05O10qW21LXS8sICIiKTsKICAgICAgaWYgKCQwIH4gL2NvZGV4IHNlc3Npb25bWzpzcGFjZTpdXStbMC05YS1mQS1GLV17NCx9LykgewogICAgICAgIG1hdGNoKCQwLCAvY29kZXggc2Vzc2lvbltbOnNwYWNlOl1dKyhbMC05YS1mQS1GLV0rKS8sIGEpOwogICAgICAgIGlmIChhWzFdICE9ICIiKSBsYXN0PWFbMV07CiAgICAgIH0KICAgIH0KICAgIEVORCB7CiAgICAgIGlmIChsYXN0ICE9ICIiKSBwcmludCBsYXN0OwogICAgfQogICcgIiRsb2dfZmlsZSIgMj4vZGV2L251bGwKfQoKcGVyc2lzdF9zZXNzaW9uX2lkKCkgewogIGxvY2FsIHNlc3Npb25faWQ9IiQxIgogIGlmIFsgLW4gIiRzZXNzaW9uX2lkIiBdOyB0aGVuCiAgICBwcmludGYgJyVzXG4nICIkc2Vzc2lvbl9pZCIgPiAiJFNFU1NJT05fRklMRSIKICBmaQp9CgppZiBbICIkQ09OVElOVUVfU0VTU0lPTiIgPSAiMSIgXTsgdGhlbgogIGlmIFsgLW4gIiRDVVJSRU5UX1NFU1NJT05fSUQiIF07IHRoZW4KICAgIGVjaG8gIuKEue+4jyAgUmVzdW1pbmcgQ29kZXggc2Vzc2lvbiBmcm9tIGJyZWFkY3J1bWI6ICRDVVJSRU5UX1NFU1NJT05fSUQiCiAgICBSRVNVTUVfQVJHUz0oInJlc3VtZSIgIiRDVVJSRU5UX1NFU1NJT05fSUQiKQogIGVsaWYgWyAtZCAiJFNFU1NJT05fRElSIiBdICYmIFsgLW4gIiQoZmluZCAiJFNFU1NJT05fRElSIiAtbWF4ZGVwdGggMSAtdHlwZSBmIC1uYW1lICcqLmpzb24nIC1wcmludCAtcXVpdCAyPi9kZXYvbnVsbCkiIF07IHRoZW4KICAgIGVjaG8gIuKEue+4jyAgRXhpc3RpbmcgQ29kZXggc2Vzc2lvbnMgZm91bmQ7IHdpbGwgcmVzdW1lIG1vc3QgcmVjZW50IgogICAgUkVTVU1FX0FSR1M9KCJyZXN1bWUiICItLWxhc3QiKQogIGZpCmVsc2UKICBpZiBbIC1kICIkU0VTU0lPTl9ESVIiIF07IHRoZW4KICAgIGZpbmQgIiRTRVNTSU9OX0RJUiIgLW1heGRlcHRoIDEgLXR5cGUgZiAtbmFtZSAnKi5qc29uJyAtZGVsZXRlIDI+L2Rldi9udWxsIHx8IHRydWUKICBmaQogIHJtIC1mICIkU0VTU0lPTl9GSUxFIgpmaQoKd2hpbGUgWyAkQVRURU1QVCAtbGUgJE1BWF9SRVRSSUVTIF07IGRvCiAgZWNobyAi8J+agCBDb2RleCBleGVjdXRpb24gYXR0ZW1wdCAkQVRURU1QVC8kTUFYX1JFVFJJRVMiCiAgTEFTVF9NRVNTQUdFX0ZJTEU9Ii90bXAvY29kZXgtbGFzdC1tZXNzYWdlLSR7QVRURU1QVH0udHh0IgogIFJVTl9MT0c9Ii90bXAvY29kZXgtcnVuLSR7QVRURU1QVH0uanNvbmwiCgogIFNFU1NJT05fRkxBR1M9KCkKICBpZiBbICRBVFRFTVBUIC1lcSAxIF0gJiYgWyAkeyNSRVNVTUVfQVJHU1tAXX0gLWd0IDAgXTsgdGhlbgogICAgU0VTU0lPTl9GTEFHUz0oIiR7UkVTVU1FX0FSR1NbQF19IikKICBlbHNlCiAgICBTRVNTSU9OX0ZMQUdTPSgpCiAgICBpZiBbICIkUkVTRVRfU0VTU0lPTl9PTl9SRVRSWSIgPSAiMSIgXSAmJiBbICRBVFRFTVBUIC1ndCAxIF0gJiYgWyAtZCAiJFNFU1NJT05fRElSIiBdOyB0aGVuCiAgICAgIGZpbmQgIiRTRVNTSU9OX0RJUiIgLW1heGRlcHRoIDEgLXR5cGUgZiAtbmFtZSAnKi5qc29uJyAtZGVsZXRlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgcm0gLWYgIiRTRVNTSU9OX0ZJTEUiCiAgICAgIENVUlJFTlRfU0VTU0lPTl9JRD0iIgogICAgZmkKICBmaQoKICBpZiBbICRBVFRFTVBUIC1lcSAxIF07IHRoZW4KICAgIFBST01QVF9QQVlMT0FEPSIkT1JJR0lOQUxfUFJPTVBUIgogIGVsc2UKICAgIGlmIFsgLW4gIiRQUkVWSU9VU19NRVNTQUdFX0ZJTEUiIF0gJiYgWyAtcyAiJFBSRVZJT1VTX01FU1NBR0VfRklMRSIgXTsgdGhlbgogICAgICBQUkVWSU9VU19TTklQUEVUPSQodGFpbCAtbiA0MCAiJFBSRVZJT1VTX01FU1NBR0VfRklMRSIgMj4vZGV2L251bGwgfCBzZWQgJ3MvXi8gICAgLycpCiAgICBlbHNlCiAgICAgIFBSRVZJT1VTX1NOSVBQRVQ9IiAgICA8bm8gcHJldmlvdXMgQ29kZXggc3VtbWFyeSBhdmFpbGFibGU+IgogICAgZmkKICAgIFBST01QVF9QQVlMT0FEPSJDb250aW51aW5nIFRhc2sge3t0YXNrX2lkfX0gZm9yIHNlcnZpY2Uge3tzZXJ2aWNlfX0gKGF0dGVtcHQgJEFUVEVNUFQpLgoKUHJldmlvdXMgQ29kZXggc3VtbWFyeToKJFBSRVZJT1VTX1NOSVBQRVQKCkZvY3VzIG9uIHVucmVzb2x2ZWQgd29yaywgYXZvaWQgcmVwZWF0aW5nIGNvbXBsZXRlZCBzdGVwcywgYW5kIHByb2dyZXNzIHRvd2FyZCBjb21wbGV0aW9uLiIKICBmaQoKICBzZXQgK2UKICBzZXQgLW8gcGlwZWZhaWwKICBDT0RFWF9DTUQ9KAogICAgImNvZGV4IgogICAgIi0tYXNrLWZvci1hcHByb3ZhbCIgIm5ldmVyIgogICAgImV4ZWMiCiAgICAiLS1kYW5nZXJvdXNseS1ieXBhc3MtYXBwcm92YWxzLWFuZC1zYW5kYm94IgogICAgIi0tc2tpcC1naXQtcmVwby1jaGVjayIKICAgICItLW91dHB1dC1sYXN0LW1lc3NhZ2UiICIkTEFTVF9NRVNTQUdFX0ZJTEUiCiAgICAiLS1jZCIgIiRDT0RFWF9XT1JLX0RJUiIKICApCiAgaWYgWyAkeyNTRVNTSU9OX0ZMQUdTW0BdfSAtZ3QgMCBdOyB0aGVuCiAgICBDT0RFWF9DTUQrPSgiJHtTRVNTSU9OX0ZMQUdTW0BdfSIpCiAgZmkKICBDT0RFWF9DTUQrPSgiJFBST01QVF9QQVlMT0FEIikKCiAgaWYgY29tbWFuZCAtdiB0aW1lb3V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgdGltZW91dCAiJENPREVYX1RJTUVPVVQiICIke0NPREVYX0NNRFtAXX0iIHwgdGVlICIkUlVOX0xPRyIKICBlbHNlCiAgICAiJHtDT0RFWF9DTURbQF19IiB8IHRlZSAiJFJVTl9MT0ciCiAgZmkKICBDT0RFWF9FWElUPSR7UElQRVNUQVRVU1swXX0KICBzZXQgK28gcGlwZWZhaWwKICBzZXQgLWUKCiAgaWYgWyAkQ09ERVhfRVhJVCAtZXEgMTI0IF07IHRoZW4KICAgIGVjaG8gIuKPse+4jyBDb2RleCBjb21tYW5kIGV4Y2VlZGVkICR7Q09ERVhfVElNRU9VVH1zIHRpbWVvdXQ7IHRlcm1pbmF0aW5nIHNlc3Npb24iCiAgICBwa2lsbCAtZiAiY29kZXgiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIFBSRVZJT1VTX01FU1NBR0VfRklMRT0iJExBU1RfTUVTU0FHRV9GSUxFIgogICAgQVRURU1QVD0kKChBVFRFTVBUICsgMSkpCiAgICBjb250aW51ZQogIGZpCgogIGVjaG8gIltjb2RleC1kZWJ1Z10gQXR0ZW1wdCAkQVRURU1QVCBmaW5pc2hlZCB3aXRoIGV4aXQgY29kZSAkQ09ERVhfRVhJVCIKCiAgaWYgWyAkQ09ERVhfRVhJVCAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQ29kZXggZXhpdGVkIHdpdGggc3RhdHVzICRDT0RFWF9FWElUIG9uIGF0dGVtcHQgJEFUVEVNUFQiCiAgZmkKCiAgIyBDaXJjdWl0IGJyZWFrZXI6IGRldGVjdCByZXBlYXRlZCBmYWlsaW5nIGJhc2ggY29tbWFuZHMKICBpZiBbIC1mICIkUlVOX0xPRyIgXSAmJiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgIyBDb2RleCBmb3JtYXQ6IGxvb2sgZm9yIGJhc2ggdG9vbCBmYWlsdXJlcyBpbiBKU09OIGxvZwogICAgIyBOb3RlOiBDb2RleCBtYXkgb3V0cHV0IHRleHQsIHNvIHRoaXMgb25seSB3b3JrcyBpZiBKU09OIGxvZ2dpbmcgaXMgZW5hYmxlZAogICAgRkFJTEVEX0NNRD0kKGpxIC1yICdzZWxlY3QoLnR5cGU9PSJiYXNoIiBhbmQgKC5leGl0X2NvZGUgLy8gMCkgIT0gMCkgfCAuY29tbWFuZCcgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xIHwgaGVhZCAtYyAxMDApCiAgICAKICAgICMgRmFsbGJhY2s6IGdyZXAgZm9yIGNvbW1vbiBlcnJvciBwYXR0ZXJucyBpbiBwbGFpbiB0ZXh0IGxvZ3MKICAgIGlmIFsgLXogIiRGQUlMRURfQ01EIiBdICYmIFsgLWYgIiRSVU5fTE9HIiBdOyB0aGVuCiAgICAgICMgVHJ5IHRvIGV4dHJhY3QgZnJvbSB0ZXh0IG91dHB1dCAobGVzcyByZWxpYWJsZSBidXQgYmV0dGVyIHRoYW4gbm90aGluZykKICAgICAgRkFJTEVEX0NNRD0kKGdyZXAgLW9QICcoPzw9XCQgKS4qPyg/PSBcKGV4aXQpJyAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEgfCBoZWFkIC1jIDEwMCB8fCB0cnVlKQogICAgZmkKICAgIAogICAgaWYgWyAtbiAiJEZBSUxFRF9DTUQiIF07IHRoZW4KICAgICAgIyBUcmFjayBob3cgbWFueSB0aW1lcyB0aGlzIGNvbW1hbmQgaGFzIGZhaWxlZAogICAgICBGQUlMRURfQ09NTUFORFNbIiRGQUlMRURfQ01EIl09JCgoJHtGQUlMRURfQ09NTUFORFNbIiRGQUlMRURfQ01EIl06LTB9ICsgMSkpCiAgICAgIEZBSUxfQ09VTlQ9JHtGQUlMRURfQ09NTUFORFNbIiRGQUlMRURfQ01EIl19CiAgICAgIAogICAgICBpZiBbICRGQUlMX0NPVU5UIC1nZSAkTUFYX1NBTUVfQ09NTUFORF9GQUlMVVJFUyBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+UtCBDSVJDVUlUIEJSRUFLRVIgVFJJR0dFUkVEOiBDb21tYW5kIGhhcyBmYWlsZWQgJEZBSUxfQ09VTlQgdGltZXMgaW4gYSByb3c6IgogICAgICAgIGVjaG8gIiAgIENvbW1hbmQ6ICRGQUlMRURfQ01EIgogICAgICAgIGVjaG8gIiAgIFRoaXMgaW5kaWNhdGVzIHRoZSBhZ2VudCBpcyBzdHVjayBpbiBhIGxvb3AuIgogICAgICAgIAogICAgICAgICMgSW5qZWN0IGludGVydmVudGlvbiBwcm9tcHQgZm9yIG5leHQgYXR0ZW1wdAogICAgICAgIFBST01QVF9DT05URU5UPSIke1BST01QVF9DT05URU5UfQoK4pqg77iPICoqTE9PUCBERVRFQ1RFRCoqOiBZb3UgdHJpZWQgdGhpcyBjb21tYW5kICRGQUlMX0NPVU5UIHRpbWVzOgpcYFxgXGBiYXNoCiRGQUlMRURfQ01EClxgXGBcYAoKSXQga2VlcHMgZmFpbGluZy4gKipTVE9QIFJFUEVBVElORyBUSElTIENPTU1BTkQuKioKClRyeSBpbnN0ZWFkOgoxLiBDaGVjayB3b3JraW5nIGRpcmVjdG9yeTogXGBwd2RcYAoyLiBMaXN0IGZpbGVzOiBcYGxzIC1sYVxgCjMuIFVzZSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFwcHJvYWNoCjQuIENyZWF0ZSBmaWxlcy9kaXJlY3RvcmllcyBzdGVwLWJ5LXN0ZXAiCiAgICAgICAgCiAgICAgICAgIyBSZXNldCBjb3VudGVyCiAgICAgICAgRkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdPTAKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgTkVXX1NFU1NJT05fSUQ9IiIKICBpZiBbIC1uICIkUlVOX0xPRyIgXSAmJiBbIC1mICIkUlVOX0xPRyIgXTsgdGhlbgogICAgTkVXX1NFU1NJT05fSUQ9JChleHRyYWN0X3Nlc3Npb25faWQgIiRSVU5fTE9HIiB8fCB0cnVlKQogIGZpCiAgaWYgWyAtbiAiJE5FV19TRVNTSU9OX0lEIiBdOyB0aGVuCiAgICBpZiBbICIkQ1VSUkVOVF9TRVNTSU9OX0lEIiAhPSAiJE5FV19TRVNTSU9OX0lEIiBdOyB0aGVuCiAgICAgIGVjaG8gIuKEue+4jyAgQ2FwdHVyZWQgQ29kZXggc2Vzc2lvbiBJRDogJE5FV19TRVNTSU9OX0lEIgogICAgICBDVVJSRU5UX1NFU1NJT05fSUQ9IiRORVdfU0VTU0lPTl9JRCIKICAgICAgcGVyc2lzdF9zZXNzaW9uX2lkICIkQ1VSUkVOVF9TRVNTSU9OX0lEIgogICAgZmkKICBmaQoKICBpZiBbICIkQ09OVElOVUVfU0VTU0lPTiIgPSAiMSIgXSAmJiBbIC1uICIkQ1VSUkVOVF9TRVNTSU9OX0lEIiBdOyB0aGVuCiAgICBSRVNVTUVfQVJHUz0oInJlc3VtZSIgIiRDVVJSRU5UX1NFU1NJT05fSUQiKQogIGVsc2UKICAgIFJFU1VNRV9BUkdTPSgpCiAgZmkKCiAgUFJFVklPVVNfTUVTU0FHRV9GSUxFPSIkTEFTVF9NRVNTQUdFX0ZJTEUiCgogICMgRW5oYW5jZWQgdG9rZW4gdHJhY2tpbmcgd2l0aCBtZXRyaWNzIHN0b3JhZ2UKICBpZiBbIC1mICIkUlVOX0xPRyIgXTsgdGhlbgogICAgIyBUcnkgbXVsdGlwbGUgZXh0cmFjdGlvbiBtZXRob2RzIGZvciByb2J1c3RuZXNzCiAgICBMQVNUX1RPS0VOUz0kKGdyZXAgLUVvICd0b2tlbnMgdXNlZDogWzAtOSxdKycgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xIHwgYXdrICd7cHJpbnQgJDN9JyB8IHRyIC1kICcsJyB8IHRyIC1kICdcbicgfHwgdHJ1ZSkKICAgIAogICAgIyBBbHNvIHRyeSBKU09OIGZvcm1hdCBpZiBhdmFpbGFibGUKICAgIGlmIFsgLXogIiRMQVNUX1RPS0VOUyIgXSAmJiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBUT0tFTlNfSU49JChqcSAtciAnc2VsZWN0KC50b2tlbnMuaW5wdXQgIT0gbnVsbCkgfCAudG9rZW5zLmlucHV0JyAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEpCiAgICAgIFRPS0VOU19PVVQ9JChqcSAtciAnc2VsZWN0KC50b2tlbnMub3V0cHV0ICE9IG51bGwpIHwgLnRva2Vucy5vdXRwdXQnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSkKICAgICAgCiAgICAgIGlmIFtbICIkVE9LRU5TX0lOIiA9fiBeWzAtOV0rJCBdXSAmJiBbWyAiJFRPS0VOU19PVVQiID1+IF5bMC05XSskIF1dOyB0aGVuCiAgICAgICAgTEFTVF9UT0tFTlM9JCgoVE9LRU5TX0lOICsgVE9LRU5TX09VVCkpCiAgICAgICAgZWNobyAi8J+TiiBDb2RleCB0b2tlbnMgdGhpcyBhdHRlbXB0OiBpbnB1dD0kVE9LRU5TX0lOLCBvdXRwdXQ9JFRPS0VOU19PVVQsIHRvdGFsPSRMQVNUX1RPS0VOUyIKICAgICAgICAKICAgICAgICAjIFN0b3JlIGRldGFpbGVkIG1ldHJpY3MgZm9yIGNvc3QgYW5hbHlzaXMKICAgICAgICBlY2hvICJ7XCJhdHRlbXB0XCI6JEFUVEVNUFQsXCJ0YXNrX2lkXCI6XCJ7e3Rhc2tfaWR9fVwiLFwic2VydmljZVwiOlwie3tzZXJ2aWNlfX1cIixcImNsaVwiOlwiY29kZXhcIixcInRva2Vuc19pblwiOiRUT0tFTlNfSU4sXCJ0b2tlbnNfb3V0XCI6JFRPS0VOU19PVVQsXCJ0b2tlbnNfdG90YWxcIjokTEFTVF9UT0tFTlN9IiA+PiAvdG1wL2NvZGV4LW1ldHJpY3MuanNvbmwKICAgICAgZmkKICAgIGZpCiAgICAKICAgIGlmIFtbICIkTEFTVF9UT0tFTlMiID1+IF5bMC05XSskIF1dOyB0aGVuCiAgICAgIGlmIFsgLXogIiRUT0tFTlNfSU4iIF07IHRoZW4KICAgICAgICAjIE9ubHkgdG90YWwgYXZhaWxhYmxlIGZyb20gdGV4dCBmb3JtYXQKICAgICAgICBlY2hvICLwn5OKIENvZGV4IHRva2VucyB1c2VkIHRoaXMgYXR0ZW1wdDogJExBU1RfVE9LRU5TIgogICAgICAgIGVjaG8gIntcImF0dGVtcHRcIjokQVRURU1QVCxcInRhc2tfaWRcIjpcInt7dGFza19pZH19XCIsXCJzZXJ2aWNlXCI6XCJ7e3NlcnZpY2V9fVwiLFwiY2xpXCI6XCJjb2RleFwiLFwidG9rZW5zX3RvdGFsXCI6JExBU1RfVE9LRU5TfSIgPj4gL3RtcC9jb2RleC1tZXRyaWNzLmpzb25sCiAgICAgIGZpCiAgICAgIAogICAgICAjIENoZWNrIHRva2VuIGxpbWl0IGlmIGNvbmZpZ3VyZWQKICAgICAgaWYgWyAiJHtUT0tFTl9MSU1JVDotMH0iIC1ndCAwIF0gJiYgWyAiJExBU1RfVE9LRU5TIiAtZ3QgIiRUT0tFTl9MSU1JVCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBUb2tlbiB1c2FnZSAkTEFTVF9UT0tFTlMgZXhjZWVkcyBsaW1pdCAkVE9LRU5fTElNSVQ7IGZvcmNpbmcgY2xlYW4gc2Vzc2lvbiBiZWZvcmUgcmV0cnkiCiAgICAgICAgaWYgWyAtZCAiJFNFU1NJT05fRElSIiBdOyB0aGVuCiAgICAgICAgICBmaW5kICIkU0VTU0lPTl9ESVIiIC1tYXhkZXB0aCAxIC10eXBlIGYgLW5hbWUgJyouanNvbicgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgZmkKICAgICAgICBQUkVWSU9VU19NRVNTQUdFX0ZJTEU9IiRMQVNUX01FU1NBR0VfRklMRSIKICAgICAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgICAgICBjb250aW51ZQogICAgICBmaQogICAgZmkKICBmaQoKICBDT01QTEVUSU9OX1BST01QVD0iVGFzayB7e3Rhc2tfaWR9fSBjb21wbGV0aW9uIHZlcmlmaWNhdGlvbi4KCioqRklSU1QqKjogUmV2aWV3IHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhIGluIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZAoKKipUaGVuIGFuc3dlciAneWVzJyBPTkxZIGlmIEFMTCBvZiB0aGVzZSBhcmUgdHJ1ZToqKgoKMS4gKipFVkVSWSBhY2NlcHRhbmNlIGNyaXRlcmlvbiBpcyBmdWxseSBpbXBsZW1lbnRlZCoqIChub3QganVzdCBzdGFydGVkLCBidXQgRE9ORSkKMi4gQWxsIGNvZGUgY2hhbmdlcyBhcmUgY29tbWl0dGVkIHRvIGdpdAozLiBDaGFuZ2VzIGFyZSBwdXNoZWQgdG8gcmVtb3RlIGJyYW5jaCBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24KNC4gQSBwdWxsIHJlcXVlc3QgZXhpc3RzICh3aXRoIGF0IGxlYXN0IHRhc2ste3t0YXNrX2lkfX0gbGFiZWw7IG90aGVyIGxhYmVscyBhcmUgb3B0aW9uYWwpCjUuIFF1YWxpdHkgZ2F0ZXMgcGFzc2VkIChjYXJnbyBmbXQsIGNhcmdvIGNsaXBweSB3aXRoIG5vIHdhcm5pbmdzLCB0ZXN0cyBwYXNzKQoKKipCZSBob25lc3QqKjogSWYgQU5ZIGFjY2VwdGFuY2UgY3JpdGVyaW9uIGlzIGluY29tcGxldGUgb3IgcGFydGlhbGx5IGltcGxlbWVudGVkLCBhbnN3ZXIgJ25vJyBhbmQgY29udGludWUgd29ya2luZy4KCioqVG8gdmVyaWZ5OioqCi0gUmV2aWV3OiBjYXQgdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kCi0gR2l0IHN0YXR1czogZ2l0IHN0YXR1cwotIENvbW1pdHMgcHVzaGVkOiBnaXQgbG9nIG9yaWdpbi9tYWluLi5IRUFECi0gUFIgZXhpc3RzOiBnaCBwciB2aWV3Ci0gVGVzdHMgcGFzczogQ2hlY2sgeW91ciB0ZXN0IHJlc3VsdHMKCkJhc2VkIG9uIHlvdXIgaG9uZXN0IGFzc2Vzc21lbnQgb2YgYWNjZXB0YW5jZSBjcml0ZXJpYSBjb21wbGV0aW9uLCBhbnN3ZXIgd2l0aCBhIHNpbmdsZSB3b3JkOiB5ZXMgb3Igbm8KClJlc3BvbnNlIChvbmUgd29yZCBvbmx5KToiCiAgQ09NUExFVElPTl9MQVNUX01FU1NBR0U9Ii90bXAvY29kZXgtY29tcGxldGlvbi0ke0FUVEVNUFR9LnR4dCIKICBDT01QTEVUSU9OX0xPRz0iL3RtcC9jb2RleC1jb21wbGV0aW9uLSR7QVRURU1QVH0uanNvbmwiCgogIHNldCArZQogIHNldCAtbyBwaXBlZmFpbAogIENPTVBMRVRJT05fQ01EPSgKICAgICJjb2RleCIKICAgICItLWFzay1mb3ItYXBwcm92YWwiICJuZXZlciIKICAgICJleGVjIgogICAgIi0tZGFuZ2Vyb3VzbHktYnlwYXNzLWFwcHJvdmFscy1hbmQtc2FuZGJveCIKICAgICItLXNraXAtZ2l0LXJlcG8tY2hlY2siCiAgICAiLS1vdXRwdXQtbGFzdC1tZXNzYWdlIiAiJENPTVBMRVRJT05fTEFTVF9NRVNTQUdFIgogICAgIi0tY2QiICIkQ09ERVhfV09SS19ESVIiCiAgICAicmVzdW1lIgogICkKICBpZiBbIC1uICIkQ1VSUkVOVF9TRVNTSU9OX0lEIiBdOyB0aGVuCiAgICBDT01QTEVUSU9OX0NNRCs9KCIkQ1VSUkVOVF9TRVNTSU9OX0lEIikKICBlbHNlCiAgICBDT01QTEVUSU9OX0NNRCs9KCItLWxhc3QiKQogIGZpCiAgQ09NUExFVElPTl9DTUQrPSgiJENPTVBMRVRJT05fUFJPTVBUIikKICAiJHtDT01QTEVUSU9OX0NNRFtAXX0iIHwgdGVlICIkQ09NUExFVElPTl9MT0ciCiAgQ09NUExFVElPTl9FWElUPSR7UElQRVNUQVRVU1swXX0KICBzZXQgK28gcGlwZWZhaWwKICBzZXQgLWUKCiAgaWYgWyAkQ09NUExFVElPTl9FWElUIC1uZSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBDb21wbGV0aW9uIHByb2JlIGV4aXRlZCB3aXRoIHN0YXR1cyAkQ09NUExFVElPTl9FWElUIgogIGZpCgogIGVjaG8gIltjb2RleC1kZWJ1Z10gQ29tcGxldGlvbiBwcm9iZSBmb3IgYXR0ZW1wdCAkQVRURU1QVCBleGl0ZWQgJENPTVBMRVRJT05fRVhJVCIKCiAgaWYgWyAtcyAiJENPTVBMRVRJT05fTEFTVF9NRVNTQUdFIiBdOyB0aGVuCiAgICBDT01QTEVUSU9OX1JFU1BPTlNFPSQodHIgLWQgJ1xyJyA8ICIkQ09NUExFVElPTl9MQVNUX01FU1NBR0UiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgZWxzZQogICAgQ09NUExFVElPTl9SRVNQT05TRT0iIgogIGZpCiAgaWYgZWNobyAiJENPTVBMRVRJT05fUkVTUE9OU0UiIHwgZ3JlcCAtRXEgJ155ZXMnOyB0aGVuCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZmkKCiAgZWNobyAiW2NvZGV4LWRlYnVnXSBDb21wbGV0aW9uIHJlc3BvbnNlIG9uIGF0dGVtcHQgJEFUVEVNUFQ6ICRDT01QTEVUSU9OX1JFU1BPTlNFIgoKICBlY2hvICLimqDvuI8gQ29kZXggcmVwb3J0ZWQgdGFzayBpbmNvbXBsZXRlOyByZXRyeWluZy4uLiIKICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKZG9uZQoKaWYgWyAkU1VDQ0VTUyAtbmUgMSBdOyB0aGVuCiAgZWNobyAi4pqg77iPIENvZGV4IGRpZCBub3QgY29uZmlybSB0YXNrIGNvbXBsZXRpb24gYWZ0ZXIgJE1BWF9SRVRSSUVTIGF0dGVtcHRzIgogIGVjaG8gIuKdjCBUYXNrIGluY29tcGxldGUgLSBtYXJraW5nIGFzIEZBSUxFRCIKICBFWElUX0NPREU9MSAgIyBGYWlsIHRoZSBqb2Igc28gaXQgZG9lc24ndCBhcHBlYXIgc3VjY2Vzc2Z1bAplbHNlCiAgZWNobyAi4pyFIENvZGV4IGNvbmZpcm1lZCB0YXNrIGNvbXBsZXRpb24iCiAgaWYgWyAke0NPREVYX0VYSVQ6LTB9IC1uZSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBDb2RleCByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUgJHtDT0RFWF9FWElUfSwgYnV0IGNvbXBsZXRpb24gcHJvYmUgcGFzc2VkIgogIGZpCiAgRVhJVF9DT0RFPTAKZmkKCmlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogIGVjaG8gIvCflI0gVmVyaWZ5aW5nIHB1bGwgcmVxdWVzdCBzdGF0dXMiCiAgZW5zdXJlX3ByX2NyZWF0ZWQKZWxzZQogIGVjaG8gIuKaoO+4jyBTa2lwcGluZyBhdXRvIFBSIGVuZm9yY2VtZW50IGR1ZSB0byBDb2RleCBjb21wbGV0aW9uIHN0YXR1cyIKZmkKCiMgU3VibWl0IEdpdEh1YiBQUiByZXZpZXcgZm9yIENsZW8vVGVzcyBzdGFnZXMgKGVuYWJsZXMgd29ya2Zsb3cgcHJvZ3Jlc3Npb24pCldPUktGTE9XX1NUQUdFPSIke1dPUktGTE9XX1NUQUdFOi19IgppZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInF1YWxpdHktaW4tcHJvZ3Jlc3MiIF0gfHwgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nLWluLXByb2dyZXNzIiBdOyB0aGVuCiAgUFJfTlVNPSIke1BSX05VTUJFUjotfSIKICBpZiBbIC16ICIkUFJfTlVNIiBdOyB0aGVuCiAgICAjIFRyeSB0byBnZXQgUFIgbnVtYmVyIGZyb20gY3VycmVudCBicmFuY2gKICAgIENVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAtbiAiJENVUlJFTlRfQlJBTkNIIiBdOyB0aGVuCiAgICAgIFBSX05VTT0kKGdoIHByIGxpc3QgLS1zdGF0ZSBvcGVuIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKICBmaQoKICBpZiBbIC1uICIkUFJfTlVNIiBdOyB0aGVuCiAgICAjIFJ1biBhY3R1YWwgcXVhbGl0eSBnYXRlIGNoZWNrcyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gJFNVQ0NFU1MKICAgIFFVQUxJVFlfR0FURVNfUEFTU0VEPTEKICAgIAogICAgaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJxdWFsaXR5LWluLXByb2dyZXNzIiBdOyB0aGVuCiAgICAgIGVjaG8gIvCflI0gUnVubmluZyBxdWFsaXR5IGdhdGUgY2hlY2tzLi4uIgogICAgICAKICAgICAgIyBDaGVjayAxOiBDb2RlIGZvcm1hdHRpbmcKICAgICAgZWNobyAiICDinqQgQ2hlY2tpbmcgY29kZSBmb3JtYXR0aW5nIChjYXJnbyBmbXQpLi4uIgogICAgICBpZiAhIGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrID4vdG1wL2ZtdC1jaGVjay5sb2cgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIiAgICDinYwgRm9ybWF0dGluZyBjaGVjayBmYWlsZWQiCiAgICAgICAgUVVBTElUWV9HQVRFU19QQVNTRUQ9MAogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgIOKchSBGb3JtYXR0aW5nIGNoZWNrIHBhc3NlZCIKICAgICAgZmkKICAgICAgCiAgICAgICMgQ2hlY2sgMjogTGludGluZyB3aXRoIHBlZGFudGljIENsaXBweQogICAgICBlY2hvICIgIOKepCBDaGVja2luZyBsaW50cyAoY2FyZ28gY2xpcHB5KS4uLiIKICAgICAgaWYgISBjYXJnbyBjbGlwcHkgLS13b3Jrc3BhY2UgLS1hbGwtdGFyZ2V0cyAtLWFsbC1mZWF0dXJlcyAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljID4vdG1wL2NsaXBweS1jaGVjay5sb2cgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIiAgICDinYwgQ2xpcHB5IGNoZWNrIGZhaWxlZCIKICAgICAgICBRVUFMSVRZX0dBVEVTX1BBU1NFRD0wCiAgICAgIGVsc2UKICAgICAgICBlY2hvICIgICAg4pyFIENsaXBweSBjaGVjayBwYXNzZWQiCiAgICAgIGZpCiAgICAgIAogICAgICAjIENoZWNrIDM6IFVuaXQgdGVzdHMKICAgICAgZWNobyAiICDinqQgUnVubmluZyB1bml0IHRlc3RzIChjYXJnbyB0ZXN0KS4uLiIKICAgICAgaWYgISBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzID4vdG1wL3Rlc3QtY2hlY2subG9nIDI+JjE7IHRoZW4KICAgICAgICBlY2hvICIgICAg4p2MIFRlc3RzIGZhaWxlZCIKICAgICAgICBRVUFMSVRZX0dBVEVTX1BBU1NFRD0wCiAgICAgIGVsc2UKICAgICAgICBlY2hvICIgICAg4pyFIFRlc3RzIHBhc3NlZCIKICAgICAgZmkKICAgIGVsaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nLWluLXByb2dyZXNzIiBdOyB0aGVuCiAgICAgIGVjaG8gIvCflI0gUnVubmluZyBpbnRlZ3JhdGlvbiBhbmQgRTJFIHRlc3RzLi4uIgogICAgICAKICAgICAgIyBSdW4gdGhlIHNhbWUgcXVhbGl0eSBnYXRlcyBhcyBxdWFsaXR5IHN0YWdlLCBwbHVzIGFjY2VwdGFuY2UgY3JpdGVyaWEgdmFsaWRhdGlvbgogICAgICBlY2hvICIgIOKepCBDaGVja2luZyBjb2RlIGZvcm1hdHRpbmcgKGNhcmdvIGZtdCkuLi4iCiAgICAgIGlmICEgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2sgPi90bXAvZm10LWNoZWNrLmxvZyAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAiICAgIOKdjCBGb3JtYXR0aW5nIGNoZWNrIGZhaWxlZCIKICAgICAgICBRVUFMSVRZX0dBVEVTX1BBU1NFRD0wCiAgICAgIGVsc2UKICAgICAgICBlY2hvICIgICAg4pyFIEZvcm1hdHRpbmcgY2hlY2sgcGFzc2VkIgogICAgICBmaQogICAgICAKICAgICAgZWNobyAiICDinqQgQ2hlY2tpbmcgbGludHMgKGNhcmdvIGNsaXBweSkuLi4iCiAgICAgIGlmICEgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpYyA+L3RtcC9jbGlwcHktY2hlY2subG9nIDI+JjE7IHRoZW4KICAgICAgICBlY2hvICIgICAg4p2MIENsaXBweSBjaGVjayBmYWlsZWQiCiAgICAgICAgUVVBTElUWV9HQVRFU19QQVNTRUQ9MAogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgIOKchSBDbGlwcHkgY2hlY2sgcGFzc2VkIgogICAgICBmaQogICAgICAKICAgICAgZWNobyAiICDinqQgUnVubmluZyB0ZXN0cyAoY2FyZ28gdGVzdCkuLi4iCiAgICAgIGlmICEgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlcyA+L3RtcC90ZXN0LWNoZWNrLmxvZyAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAiICAgIOKdjCBUZXN0cyBmYWlsZWQiCiAgICAgICAgUVVBTElUWV9HQVRFU19QQVNTRUQ9MAogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgIOKchSBUZXN0cyBwYXNzZWQiCiAgICAgIGZpCiAgICAgIAogICAgICAjIFZhbGlkYXRlIGFjY2VwdGFuY2UgY3JpdGVyaWEgY29tcGxldGlvbgogICAgICBpZiBbICRTVUNDRVNTIC1uZSAxIF07IHRoZW4KICAgICAgICBlY2hvICIgICAg4p2MIENvZGV4IGRpZCBub3QgY29uZmlybSBhY2NlcHRhbmNlIGNyaXRlcmlhIGNvbXBsZXRpb24iCiAgICAgICAgUVVBTElUWV9HQVRFU19QQVNTRUQ9MAogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgIOKchSBBY2NlcHRhbmNlIGNyaXRlcmlhIHZhbGlkYXRlZCBieSBDb2RleCIKICAgICAgZmkKICAgIGZpCgogICAgaWYgWyAkUVVBTElUWV9HQVRFU19QQVNTRUQgLWVxIDEgXTsgdGhlbgogICAgICBTVEFHRV9OQU1FPSJRdWFsaXR5IgogICAgICBTVEFHRV9FTU9KST0i8J+boe+4jyIKICAgICAgQ0hFQ0tTX1BBU1NFRD0iLSBDb2RlIGZvcm1hdHRpbmcgdmVyaWZpZWQKLSBMaW50aW5nIHBhc3NlZAotIFVuaXQgdGVzdHMgc3VjY2Vzc2Z1bAogICAgaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgICAgIFNUQUdFX05BTUU9IlF1YWxpdHkiCiAgICAgIFNUQUdFX0VNT0pJPSLwn5uh77iPIgogICAgICBDSEVDS1NfUEFTU0VEPSItIENvZGUgZm9ybWF0dGluZyB2ZXJpZmllZAotIExpbnRpbmcgcGFzc2VkCi0gVW5pdCB0ZXN0cyBzdWNjZXNzZnVsCi0gUXVhbGl0eSBzdGFuZGFyZHMgbWV0IgogICAgICBORVhUX1NUQUdFPSJlbmQtdG8tZW5kIHRlc3RpbmcgYnkgVGVzcyIKICAgICAgCiAgICAgIGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZy1pbi1wcm9ncmVzcyIgXTsgdGhlbgogICAgICAgICMgVGVzcyBoYXMgZmluYWwgYXBwcm92YWwgYXV0aG9yaXR5CiAgICAgICAgU1RBR0VfTkFNRT0iUUEgVGVzdGluZyIKICAgICAgICBTVEFHRV9FTU9KST0i8J+nqiIKICAgICAgICBDSEVDS1NfUEFTU0VEPSItIEVuZC10by1lbmQgdGVzdHMgcGFzc2VkCi0gSW50ZWdyYXRpb24gdGVzdHMgc3VjY2Vzc2Z1bAotIEFjY2VwdGFuY2UgY3JpdGVyaWEgdmFsaWRhdGVkCi0gUHJvZHVjdGlvbiByZWFkaW5lc3MgY29uZmlybWVkIgogICAgICAgIE5FWFRfU1RBR0U9Imh1bWFuIHJldmlldyBhbmQgbWVyZ2UiCiAgICAgICAgCiAgICAgICAgZWNobyAi4pyFICRTVEFHRV9OQU1FIGNvbXBsZXRlIC0gcG9zdGluZyBBUFBST1ZFIHJldmlldyAoVGVzcyBmaW5hbCBhcHByb3ZhbCkiCiAgICAgICAgUkVWSUVXX0JPRFk9JChjYXQgPDxFT0YKIyMjICRTVEFHRV9FTU9KSSAkU1RBR0VfTkFNRSBSZXZpZXcgLSBBUFBST1ZFRApBbGwgY2hlY2tzIGhhdmUgcGFzc2VkOgokQ0hFQ0tTX1BBU1NFRApSZWFkeSBmb3IgJE5FWFRfU1RBR0UuCgoqKkZpbmFsIEFwcHJvdmFsOioqIFRlc3MgaGFzIHZlcmlmaWVkIGFsbCBhY2NlcHRhbmNlIGNyaXRlcmlhIGFyZSBtZXQuCkVPRgopCiAgICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLWFwcHJvdmUgLS1ib2R5ICIkUkVWSUVXX0JPRFkiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgICAgZWxzZQogICAgICAgICMgQ2xlbyBoYW5kcyBvZmYgdG8gVGVzcyB2aWEgY29tbWVudCBhbmQgbGFiZWwgKE5PVCBhcHByb3ZlKQogICAgICAgIGVjaG8gIuKchSAkU1RBR0VfTkFNRSBjaGVja3MgcGFzc2VkIC0gaGFuZGluZyBvZmYgdG8gVGVzcyIKICAgICAgICBSRVZJRVdfQk9EWT0kKGNhdCA8PEVPRgojIyMgJFNUQUdFX0VNT0pJICRTVEFHRV9OQU1FIFJldmlldyAtIFBBU1NFRApBbGwgY2hlY2tzIGhhdmUgcGFzc2VkOgokQ0hFQ0tTX1BBU1NFRAoKKipTdGF0dXM6KiogUmVhZHkgZm9yICRORVhUX1NUQUdFCioqTmV4dCBTdGVwOioqIFRlc3Mgd2lsbCBub3cgcGVyZm9ybSBjb21wcmVoZW5zaXZlIFFBIHZhbGlkYXRpb24KCi0tLQoqUXVhbGl0eSByZXZpZXcgYnkgQ2xlbyoKRU9GCikKICAgICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgICAgdGltZW91dCAzMCBnaCBwciBjb21tZW50ICIkUFJfTlVNIiAtLWJvZHkgIiRSRVZJRVdfQk9EWSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgY29tbWVudCBjb21tYW5kIGZhaWxlZCIKICAgICAgICAKICAgICAgICAjIEFkZCByZWFkeS1mb3ItcWEgbGFiZWwgdG8gc2lnbmFsIFRlc3MKICAgICAgICBlY2hvICLwn4+377iPICBBZGRpbmcgJ3JlYWR5LWZvci1xYScgbGFiZWwgdG8gdHJpZ2dlciBUZXNzIHJldmlldyIKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIGVkaXQgIiRQUl9OVU0iIC0tYWRkLWxhYmVsICJyZWFkeS1mb3ItcWEiIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgcmVhZHktZm9yLXFhIGxhYmVsIgogICAgICBmaQogICAgZWxzZQogICAgICBTVEFHRV9OQU1FPSJRdWFsaXR5IgogICAgICBTVEFHRV9FTU9KST0i8J+boe+4jyIKICAgICAgSVNTVUVTX0RFU0M9Ii0gUmV2aWV3IGNvZGUgZm9ybWF0dGluZwotIEZpeCBsaW50aW5nIGVycm9ycwotIEVuc3VyZSB1bml0IHRlc3RzIHBhc3MKLSBNZWV0IHF1YWxpdHkgc3RhbmRhcmRzIgogICAgICBGQUlMVVJFX0xPR1M9IiIKICAgICAgCiAgICAgIGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAicXVhbGl0eS1pbi1wcm9ncmVzcyIgXTsgdGhlbgogICAgICAgICMgQ29sbGVjdCBmYWlsdXJlIGRldGFpbHMgZnJvbSBsb2dzCiAgICAgICAgaWYgWyAtZiAvdG1wL2ZtdC1jaGVjay5sb2cgXTsgdGhlbgogICAgICAgICAgRkFJTFVSRV9MT0dTPSIke0ZBSUxVUkVfTE9HU31cblxuPGRldGFpbHM+PHN1bW1hcnk+Rm9ybWF0dGluZyBJc3N1ZXM8L3N1bW1hcnk+XG5cblxuYGBgCiQoY2F0IC90bXAvZm10LWNoZWNrLmxvZyB8IGhlYWQgLW4gNTApCmBgYAo8L2RldGFpbHM+IgogICAgICAgIGZpCiAgICAgICAgaWYgWyAtZiAvdG1wL2NsaXBweS1jaGVjay5sb2cgXTsgdGhlbgogICAgICAgICAgRkFJTFVSRV9MT0dTPSIke0ZBSUxVUkVfTE9HU31cblxuPGRldGFpbHM+PHN1bW1hcnk+Q2xpcHB5IFdhcm5pbmdzPC9zdW1tYXJ5PlxuXG5cbmBgYAokKGNhdCAvdG1wL2NsaXBweS1jaGVjay5sb2cgfCBoZWFkIC1uIDUwKQpgYGAKPC9kZXRhaWxzPiIKICAgICAgICBmaQogICAgICAgIGlmIFsgLWYgL3RtcC90ZXN0LWNoZWNrLmxvZyBdOyB0aGVuCiAgICAgICAgICBGQUlMVVJFX0xPR1M9IiR7RkFJTFVSRV9MT0dTfVxuXG48ZGV0YWlscz48c3VtbWFyeT5UZXN0IEZhaWx1cmVzPC9zdW1tYXJ5PlxuXG5cbmBgYAokKGNhdCAvdG1wL3Rlc3QtY2hlY2subG9nIHwgdGFpbCAtbiAxMDApCmBgYAo8L2RldGFpbHM+IgogICAgICAgIGZpCiAgICAgIGVsaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nLWluLXByb2dyZXNzIiBdOyB0aGVuCiAgICAgICAgU1RBR0VfTkFNRT0iUUEgVGVzdGluZyIKICAgICAgICBTVEFHRV9FTU9KST0i8J+nqiIKICAgICAgICBJU1NVRVNfREVTQz0iLSBGaXggZmFpbGluZyBlbmQtdG8tZW5kIHRlc3RzCi0gQWRkcmVzcyBpbnRlZ3JhdGlvbiB0ZXN0IGZhaWx1cmVzCi0gVmFsaWRhdGUgYWNjZXB0YW5jZSBjcml0ZXJpYQotIEVuc3VyZSBwcm9kdWN0aW9uIHJlYWRpbmVzcyIKICAgICAgZmkKCiAgICAgIGVjaG8gIuKdjCAkU1RBR0VfTkFNRSBpc3N1ZXMgZGV0ZWN0ZWQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICAgIFJFVklFV19CT0RZPSQoY2F0IDw8RU9GCiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKJFNUQUdFX05BTUUgaXNzdWVzIGRldGVjdGVkLiBQbGVhc2UgYWRkcmVzcyB0aGUgZm9sbG93aW5nOgokSVNTVUVTX0RFU0MKJEZBSUxVUkVfTE9HUwpFT0YKKQogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiRSRVZJRVdfQk9EWSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgZmFpbGVkIgogICAgZmkKe3tlbHNlfX0KZWNobyAi4pyFIENvZGV4IGV4ZWN1dGlvbiBjb21wbGV0ZSIKe3svaWZ9fQpleGl0ICRFWElUX0NPREUK + code_codex_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBDb2RleCBlbnZpcm9ubWVudCIKe3svaWZ9fQoKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogIC4gIiRIT01FLy5jYXJnby9lbnYiCmZpCgppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgLiAiL3Jvb3QvLmNhcmdvL2VudiIKZmkKCmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogIHJ1c3R1cCBkZWZhdWx0IHN0YWJsZSAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCgojIFByZWVtcHRpdmVseSBwcnVuZSBzdGFsZSBSdXN0dXAgZG93bmxvYWRzIHRvIGF2b2lkIENvZGV4IGlzc3VpbmcgYnVsayBjbGVhbnVwIGNvbW1hbmRzIGxhdGVyCmlmIFsgLWQgIiRIT01FLy5ydXN0dXAvZG93bmxvYWRzIiBdOyB0aGVuCiAgZmluZCAiJEhPTUUvLnJ1c3R1cC9kb3dubG9hZHMiIC1taW5kZXB0aCAxIC1kZWxldGUgMj4vZGV2L251bGwgfHwgdHJ1ZQpmaQoKZWNobyAiUEFUSDogJFBBVEgiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBSRVRSWSBDT05GSUdVUkFUSU9OCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpNQVhfUkVUUklFU19DT05GSUc9JHtDT0RFWF9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTV9fQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBSRVRSWSBDT05GSUdVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAg4pWRIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCflIQgTWF4aW11bSBJdGVyYXRpb25zOiAkTUFYX1JFVFJJRVNfQ09ORklHIgppZiBbIC1uICIke0NPREVYX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IENPREVYX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgppZiBbIC16ICIke0dJVEhVQl9BUFBfUFJJVkFURV9LRVk6LX0iIF0gfHwgWyAteiAiJHtHSVRIVUJfQVBQX0lEOi19IiBdOyB0aGVuCiAgZWNobyAi4p2MIE1pc3NpbmcgR2l0SHViIEFwcCBjcmVkZW50aWFscyIKICBleGl0IDEKZmkKCmVjaG8gIvCflJAgQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwIgpURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+IiRURU1QX0tFWV9GSUxFIgpjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpOT1c9JChkYXRlICslcykKRVhQPSQoKE5PVyArIDYwMCkpCkpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKcGFyc2VfcmVwbygpIHsKICBsb2NhbCBpbnB1dD0iJDEiCiAgaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLyhbXi9dKz8pKFwuZ2l0KT8kfFwxIFwyfCcKICBlbHNlCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFwuZ2l0JHx8JyB8IHNlZCAtRSAnc3woW14vXSspLyhbXi9dKyl8XDEgXDJ8JwogIGZpCn0KCnJlYWQgUkVQT19PV05FUiBSRVBPX05BTUUgPDw8IiQocGFyc2VfcmVwbyAiJFJFUE9fVVJMIikiClJFUE9fSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfS5naXQiCgpJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKCmlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogIElOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQpmaQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byByZXNvbHZlIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIKICBleGl0IDEKZmkKCkdJVEhVQl9UT0tFTj0kKGN1cmwgLXMgLVggUE9TVCBcCiAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIiB8IGpxIC1yICcudG9rZW4nKQoKaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byBvYnRhaW4gaW5zdGFsbGF0aW9uIHRva2VuIgogIGV4aXQgMQpmaQoKZXhwb3J0IEdJVEhVQl9UT0tFTgpleHBvcnQgR0hfVE9LRU49IiRHSVRIVUJfVE9LRU4iCmV4cG9ydCBHSF9IT1NUPSJnaXRodWIuY29tIgoKZXhwb3J0IEdJVF9DT05GSUdfR0xPQkFMPS93b3Jrc3BhY2UvLmdpdGNvbmZpZwpDUkVERU5USUFMU19GSUxFPS93b3Jrc3BhY2UvLmdpdC1jcmVkZW50aWFscwpta2RpciAtcCAvd29ya3NwYWNlCgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgInN0b3JlIC0tZmlsZT0kQ1JFREVOVElBTFNfRklMRSIKCndyaXRlX2dpdF9jcmVkZW50aWFscygpIHsKICBpZiBbIC16ICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKICBwcmludGYgJ2h0dHBzOi8veC1hY2Nlc3MtdG9rZW46JXNAZ2l0aHViLmNvbVxuJyAiJEdJVEhVQl9UT0tFTiIgPiIkQ1JFREVOVElBTFNfRklMRSIKICBjaG1vZCA2MDAgIiRDUkVERU5USUFMU19GSUxFIiAyPi9kZXYvbnVsbCB8fCB0cnVlCn0KCndyaXRlX2dpdF9jcmVkZW50aWFscwoKVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCgpyZWZyZXNoX2dpdGh1Yl90b2tlbigpIHsKICBlY2hvICLwn5SEIFJlZnJlc2hpbmcgR2l0SHViIEFwcCB0b2tlbi4uLiIKCiAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS0kJCIKICBwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogIEpXVF9IRUFERVI9JChwcmludGYgJ3siYWxnIjoiUlMyNTYiLCJ0eXAiOiJKV1QifScgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICBOT1c9JChkYXRlICslcykKICBFWFA9JCgoTk9XICsgNjAwKSkKICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICBKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgogIE5FV19JTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKCiAgaWYgWyAiJE5FV19JTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJE5FV19JTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgIE5FV19JTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKICBmaQoKICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJE5FV19JTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogIE5FV19UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKCiAgaWYgWyAiJE5FV19UT0tFTiIgIT0gIm51bGwiIF0gJiYgWyAtbiAiJE5FV19UT0tFTiIgXTsgdGhlbgogICAgZXhwb3J0IEdJVEhVQl9UT0tFTj0iJE5FV19UT0tFTiIKICAgIGV4cG9ydCBHSF9UT0tFTj0iJE5FV19UT0tFTiIKICAgIFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQogICAgd3JpdGVfZ2l0X2NyZWRlbnRpYWxzCgogICAgaWYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcHJpbnRmICclc1xuJyAiJE5FV19UT0tFTiIgfCB0aW1lb3V0IDEwIGdoIGF1dGggbG9naW4gLS13aXRoLXRva2VuIC0taG9zdG5hbWUgIiRHSF9IT1NUIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgICBnaCBhdXRoIHNldHVwLWdpdCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKCiAgICBlY2hvICLinIUgVG9rZW4gcmVmcmVzaGVkIgogICAgcmV0dXJuIDAKICBmaQoKICBlY2hvICLinYwgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW46ICRUT0tFTl9SRVNQT05TRSIKICByZXR1cm4gMQp9CgpyZWZyZXNoX3Rva2VuX2lmX25lZWRlZCgpIHsKICBpZiBbIC16ICIkVE9LRU5fR0VORVJBVEVEX0FUIiBdOyB0aGVuCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbiB8fCB0cnVlCiAgICByZXR1cm4KICBmaQoKICBOT1c9JChkYXRlICslcykKICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgaWYgWyAkVE9LRU5fQUdFIC1ndCAzMDAwIF07IHRoZW4KICAgIGVjaG8gIvCflIQgVG9rZW4gYWdlOiAkKChUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMg4oCUIHJlZnJlc2hpbmciCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbiB8fCB0cnVlCiAgZmkKfQoKc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbGlmIGNvbW1hbmQgLXYga2lsbGFsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGtpbGxhbGwgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGVsc2UKICAgIFBJRD0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGlmIFsgLW4gIiRQSUQiIF07IHRoZW4KICAgICAga2lsbCAiJFBJRCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKfQoKdHJhcCAnc3RvcF9kb2NrZXJfc2lkZWNhciB8fCB0cnVlJyBFWElUCgplbnN1cmVfZ2hfYXV0aGVudGljYXRlZCgpIHsKICBpZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8gR2l0SHViIENMSSAoZ2gpIG5vdCBmb3VuZDsgc2tpcHBpbmcgYXV0aGVudGljYXRpb24iCiAgICByZXR1cm4gMAogIGZpCgogIGlmICEgZ2ggYXV0aCBzdGF0dXMgLWggIiRHSF9IT1NUIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIvCflJAgTG9nZ2luZyBpbiB0byBHaXRIdWIgQ0xJIGZvciBob3N0ICRHSF9IT1NUIgogICAgaWYgISBwcmludGYgJyVzXG4nICIkR0lUSFVCX1RPS0VOIiB8IHRpbWVvdXQgMTAgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gLS1ob3N0bmFtZSAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gZ2ggYXV0aCBsb2dpbiByZXR1cm5lZCBub24temVybyBvciB0aW1lZCBvdXQ7IGNvbnRpbnVpbmcgd2l0aCBHSF9UT0tFTiBlbnYiCiAgICBmaQogIGZpCgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICBnaCBhdXRoIHNldHVwLWdpdCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQoKICBpZiBnaCBhdXRoIHN0YXR1cyAtaCAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pyFIEdpdEh1YiBDTEkgYXV0aGVudGljYXRlZCBmb3IgJEdIX0hPU1QiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byBjb25maXJtIEdpdEh1YiBDTEkgYXV0aDsgR0hfVE9LRU4gd2lsbCBzdGlsbCBiZSB1c2VkIGZvciBnaXQgb3BlcmF0aW9ucyIKICBmaQp9CgplbnN1cmVfZ2hfYXV0aGVudGljYXRlZAoKZW5zdXJlX3ByX2NyZWF0ZWQoKSB7CiAgaWYgWyAiJHtTS0lQX0FVVE9fUFI6LTB9IiA9ICIxIiBdOyB0aGVuCiAgICBlY2hvICLij63vuI8gIEF1dG8gUFIgY3JlYXRpb24gZGlzYWJsZWQgdmlhIFNLSVBfQVVUT19QUj0xIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAhIC1kIC5naXQgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIFJlcG9zaXRvcnkgbm90IGluaXRpYWxpc2VkOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIGlmICEgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBqcSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAteiAiJHtHSVRIVUJfVE9LRU46LX0iIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHSVRIVUJfVE9LRU4gbm90IHNldDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIENVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCAyPi9kZXYvbnVsbCB8fCBwcmludGYgJycpCiAgaWYgWyAteiAiJENVUlJFTlRfQlJBTkNIIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IGJyYW5jaDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIFBSX0RBVEE9JChnaCBwciBsaXN0IC0tc3RhdGUgb3BlbiAtLWhlYWQgIiRDVVJSRU5UX0JSQU5DSCIgLS1qc29uIG51bWJlciAtLWxpbWl0IDEgMj4vZGV2L251bGwgfHwgZWNobyAiW10iKQogIGlmIFsgIiQocHJpbnRmICclcycgIiRQUl9EQVRBIiB8IGpxICdsZW5ndGgnIDI+L2Rldi9udWxsIHx8IGVjaG8gMCkiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBQdWxsIHJlcXVlc3QgYWxyZWFkeSBleGlzdHMgZm9yIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0giCiAgICByZXR1cm4KICBmaQoKICBCQVNFX0JSQU5DSD0iJHtQUl9CQVNFX0JSQU5DSDotbWFpbn0iCiAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgaWYgISBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciI7IHRoZW4KICAgICAgQkFTRV9CUkFOQ0g9Im1hc3RlciIKICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICBlbHNlCiAgICAgIERFRkFVTFRfUkVNT1RFPSQoZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQgMj4vZGV2L251bGwgfCBzZWQgJ3NAXnJlZnMvcmVtb3Rlcy9vcmlnaW4vQEAnKQogICAgICBpZiBbIC1uICIkREVGQVVMVF9SRU1PVEUiIF07IHRoZW4KICAgICAgICBCQVNFX0JSQU5DSD0iJERFRkFVTFRfUkVNT1RFIgogICAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgICBlbHNlCiAgICAgICAgUkVNT1RFX0JBU0U9IiIKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogIGlmIFsgLW4gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgZ2l0IGZldGNoIG9yaWdpbiAiJEJBU0VfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGZpCgogIGlmIFsgIiRDVVJSRU5UX0JSQU5DSCIgPSAiSEVBRCIgXSB8fCBbICIkQ1VSUkVOVF9CUkFOQ0giID0gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgQVVUT19CUkFOQ0g9InRhc2ste3t0YXNrX2lkfX0te3tzZXJ2aWNlfX0tJChkYXRlICslWSVtJWQtJUglTSVTKSIKICAgIGVjaG8gIuKaoO+4jyBCcmFuY2ggJENVUlJFTlRfQlJBTkNIIHVuc3VpdGFibGUgZm9yIFBSOyBjcmVhdGluZyAkQVVUT19CUkFOQ0giCiAgICBpZiAhIGdpdCBjaGVja291dCAtQiAiJEFVVE9fQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjcmVhdGUgZmFsbGJhY2sgYnJhbmNoICRBVVRPX0JSQU5DSCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgQ1VSUkVOVF9CUkFOQ0g9IiRBVVRPX0JSQU5DSCIKICBmaQoKICBnaXQgYWRkIC4KICBpZiBnaXQgZGlmZiAtLWNhY2hlZCAtLXF1aWV0IC0tZXhpdC1jb2RlOyB0aGVuCiAgICBlY2hvICLihLnvuI8gTm8gc3RhZ2VkIGNoYW5nZXMgZGV0ZWN0ZWQgYWZ0ZXIgYXV0by1zdGFnaW5nIgogIGVsc2UKICAgIENPTU1JVF9NU0c9ImNob3JlKHt7c2VydmljZX19KTogYXV0by1jb21taXQgZm9yIHRhc2sge3t0YXNrX2lkfX0iCiAgICBpZiAhIGdpdCBjb21taXQgLW0gIiRDT01NSVRfTVNHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjb21taXQgc3RhZ2VkIGNoYW5nZXMgYXV0b21hdGljYWxseSIKICAgIGVsc2UKICAgICAgZWNobyAi4pyFIEF1dG8tY29tbWl0dGVkIHN0YWdlZCBjaGFuZ2VzIgogICAgZmkKICBmaQoKICBpZiBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IC0tcXVpZXQgIiRDVVJSRU5UX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICBpZiAhIGdpdCBwdXNoIC11IG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwdXNoIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICAgIHJldHVybgogICAgZmkKICBlbHNlCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIHZlcmlmeSBicmFuY2ggJENVUlJFTlRfQlJBTkNIOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgZ2l0IGZldGNoIG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXTsgdGhlbgogICAgQUhFQURfQ09VTlQ9JChnaXQgcmV2LWxpc3QgLS1sZWZ0LXJpZ2h0ICIkUkVNT1RFX0JBU0UuLi4kQ1VSUkVOVF9CUkFOQ0giIDI+L2Rldi9udWxsIHwgYXdrICcvXj4ve2MrK30gRU5Ee3ByaW50IGMrMH0nKQogIGVsc2UKICAgIEFIRUFEX0NPVU5UPTEKICBmaQogIGlmIFsgIiR7QUhFQURfQ09VTlQ6LTB9IiAtZXEgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQnJhbmNoICRDVVJSRU5UX0JSQU5DSCBoYXMgbm8gY29tbWl0cyBhaGVhZCBvZiAkQkFTRV9CUkFOQ0g7IHNraXBwaW5nIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgUlVOX0xBQkVMPSJydW4te3t3b3JrZmxvd19uYW1lfX0iCiAgaWYgWyAiJHtSVU5fTEFCRUwjcnVuLX0iID0gIiIgXTsgdGhlbgogICAgUlVOX0xBQkVMPSJydW4tdW5rbm93biIKICBmaQoKICBUQVNLX0xBQkVMPSJ0YXNrLXt7dGFza19pZH19IgogIFNFUlZJQ0VfTEFCRUw9InNlcnZpY2Ute3tzZXJ2aWNlfX0iCiAgUkVQT19TTFVHPSIke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfSIKCiAgZWNobyAi8J+UjSBFbnN1cmluZyBQUiBjb3JyZWxhdGlvbiBsYWJlbHMgZXhpc3QiCiAgZm9yIGxhYmVsIGluICIkVEFTS19MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIiAiJFJVTl9MQUJFTCI7IGRvCiAgICBpZiBbIC16ICIkbGFiZWwiIF07IHRoZW4KICAgICAgY29udGludWUKICAgIGZpCgogICAgaWYgZ2ggbGFiZWwgdmlldyAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBhbHJlYWR5IGV4aXN0cyIKICAgICAgY29udGludWUKICAgIGZpCgogICAgY2FzZSAiJGxhYmVsIiBpbgogICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICBydW4tKikgQ09MT1I9IjAzNjZkNiI7IERFU0M9IldvcmtmbG93IGNvcnJlbGF0aW9uIiA7OwogICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iQXV0b21hdGlvbiBsYWJlbCIgOzsKICAgIGVzYWMKCiAgICBpZiBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiID4vdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgMj4mMTsgdGhlbgogICAgICBlY2hvICIgICDinIUgQ3JlYXRlZCBsYWJlbCAnJGxhYmVsJyIKICAgIGVsc2UKICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBjcmVhdGUgbGFiZWwgJyRsYWJlbCciCiAgICAgIGNhdCAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgPiYyIHx8IHRydWUKICAgIGZpCiAgICBybSAtZiAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cKICBkb25lCgogIFBSX1RJVExFPSJmZWF0KHt7c2VydmljZX19KTogY29tcGxldGUgdGFzayB7e3Rhc2tfaWR9fSIKICByZWFkIC1yIC1kICcnIFBSX0JPRFkgPDwnRU9GJyB8fCB0cnVlCiMjIFN1bW1hcnkKLSBBdXRvLWdlbmVyYXRlZCBmYWxsYmFjayBQUiBiZWNhdXNlIHRoZSBDb2RleCBhZ2VudCBmaW5pc2hlZCB3aXRob3V0IG9wZW5pbmcgb25lCi0gVGFzayB7e3Rhc2tfaWR9fSBmb3Igc2VydmljZSB7e3NlcnZpY2V9fSBpcyByZWFkeSBmb3IgcmV2aWV3CgojIyBNZXRhZGF0YQotIEFnZW50OiB7e2dpdGh1Yl9hcHB9fQotIFdvcmtmbG93OiB7e3dvcmtmbG93X25hbWV9fQotIEJyYW5jaDogXFxgJENVUlJFTlRfQlJBTkNIXFxgIOKGkiBcXGAkQkFTRV9CUkFOQ0hcXGAKCl9UaGlzIFBSIHdhcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIENvZGV4IGNvbnRhaW5lci5fCkVPRgoKICBMQUJFTF9BUkdTPSgiLS10aXRsZSIgIiRQUl9USVRMRSIgIi0tYm9keSIgIiRQUl9CT0RZIiAiLS1iYXNlIiAiJEJBU0VfQlJBTkNIIiAiLS1oZWFkIiAiJENVUlJFTlRfQlJBTkNIIikKCiAgbWF5YmVfYWRkX2xhYmVsKCkgewogICAgbG9jYWwgbGFiZWw9IiQxIgogICAgaWYgWyAteiAiJGxhYmVsIiBdOyB0aGVuCiAgICAgIHJldHVybgogICAgZmkKICAgIGlmIGdoIGxhYmVsIHZpZXcgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBMQUJFTF9BUkdTKz0oIi0tbGFiZWwiICIkbGFiZWwiKQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gTGFiZWwgJyRsYWJlbCcgbm90IGZvdW5kOyBza2lwcGluZyIKICAgIGZpCiAgfQoKICBtYXliZV9hZGRfbGFiZWwgIiRUQVNLX0xBQkVMIgogIG1heWJlX2FkZF9sYWJlbCAiJFNFUlZJQ0VfTEFCRUwiCmlmIFsgLWQgIiRSRVBPX1JPT1QvLmZhY3RvcnkiIF07IHRoZW4KICBlY2hvICLwn6e5IFJlbW92aW5nIHN0YWxlIC5mYWN0b3J5IGRpcmVjdG9yeSBiZWZvcmUgQ29kZXggcnVuIgogIHJtIC1yZiAiJFJFUE9fUk9PVC8uZmFjdG9yeSIKZmkKCiAgbWF5YmVfYWRkX2xhYmVsICIkUlVOX0xBQkVMIgoKICBpZiBnaCBwciBjcmVhdGUgIiR7TEFCRUxfQVJHU1tAXX0iOyB0aGVuCiAgICBlY2hvICLinIUgQXV0by1jcmVhdGVkIHB1bGwgcmVxdWVzdCBmb3IgJENVUlJFTlRfQlJBTkNIIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gY3JlYXRlIHB1bGwgcmVxdWVzdCBhdXRvbWF0aWNhbGx5IChpdCBtYXkgYWxyZWFkeSBleGlzdCBvciBhdXRoZW50aWNhdGlvbiBmYWlsZWQpIgogIGZpCn0KCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKZGVyaXZlX2JvdF9pZGVudGl0eSgpIHsKICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iYXV0b21hdGlvbltib3RdQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHNsdWcKICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgaWYgWyAteiAiJHNsdWciIF07IHRoZW4KICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogIGZpCgogIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF07IHRoZW4KICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgbG9jYWwgYm90X3Jlc3BvbnNlCiAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgbG9jYWwgYm90X2lkCiAgICBib3RfaWQ9JChwcmludGYgJyVzJyAiJGJvdF9yZXNwb25zZSIgfCBqcSAtciAnLmlkIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCB8fCBlY2hvICcnKQogICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgZmkKICBmaQoKICBHSVRfQVVUSE9SX05BTUU9IiRib3RfbG9naW4iCiAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQVVUSE9SX05BTUUKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwKZXhwb3J0IEdJVF9DT01NSVRURVJfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUmVwb3NpdG9yeSBjaGVja291dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBXT1JLX0RJUj0ie3tzZXJ2aWNlfX0iCmZpCgpUQVJHRVRfRElSPSIvd29ya3NwYWNlLyRXT1JLX0RJUiIKbWtkaXIgLXAgIiRUQVJHRVRfRElSIgpjZCAvd29ya3NwYWNlCgpSRVBPX1JPT1Q9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAiJFJFUE9fUk9PVCIKCmlmIFsgLWQgIiRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogIGVjaG8gIvCflIEgUmVwb3NpdG9yeSBhbHJlYWR5IGNsb25lZCwgZmV0Y2hpbmcgbGF0ZXN0IgogIGNkICIkUkVQT19OQU1FIgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgZ2l0IGZldGNoIC0tYWxsIC0tcHJ1bmUKZWxzZQogIGVjaG8gIuKsh++4jyAgQ2xvbmluZyByZXBvc2l0b3J5IgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgZ2l0IGNsb25lICIkUkVQT19IVFRQX1VSTCIKICBjZCAiJFJFUE9fTkFNRSIKZmkKCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgIiRSRVBPX1JPT1QiCmNkICIkUkVQT19ST09UIgojIFJlbW92ZSBzdGFsZSBhdXRvbWF0aW9uLW1hbmFnZWQgZmlsZXMgdGhhdCBibG9jayBicmFuY2ggY2hlY2tvdXQgd2hlbiByZXJ1bm5pbmcKTUFOQUdFRF9QQVRIUz0oCiAgIi5tY3AuanNvbiIKICAiQUdFTlRTLm1kIgogICJjbGllbnQtY29uZmlnLmpzb24iCiAgImNvZGluZy1ndWlkZWxpbmVzLm1kIgogICJnaXRodWItZ3VpZGVsaW5lcy5tZCIKICAidGFzayIKKQoKZm9yIG1hbmFnZWRfcGF0aCBpbiAiJHtNQU5BR0VEX1BBVEhTW0BdfSI7IGRvCiAgaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAiJG1hbmFnZWRfcGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBjb250aW51ZQogIGZpCiAgaWYgWyAtZSAiJG1hbmFnZWRfcGF0aCIgXTsgdGhlbgogICAgZWNobyAi8J+nuSBSZW1vdmluZyBzdGFsZSBmaWxlIHRvIGFsbG93IGNoZWNrb3V0OiAkbWFuYWdlZF9wYXRoIgogICAgcm0gLXJmICIkbWFuYWdlZF9wYXRoIgogIGZpCmRvbmUKCkJBU0VfQlJBTkNIPSIke1BSX0JBU0VfQlJBTkNIOi1tYWlufSIKUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCgppZiAhIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvJFJFTU9URV9CQVNFIjsgdGhlbgogICMgRmFsbCBiYWNrIHRvIG9yaWdpbi9tYXN0ZXIgb3IgdGhlIHJlbW90ZSBIRUFEIGlmIG1haW4gaXMgYWJzZW50CiAgaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIjsgdGhlbgogICAgQkFTRV9CUkFOQ0g9Im1hc3RlciIKICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogIGVsc2UKICAgIERFRkFVTFRfUkVNT1RFPSQoZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQgMj4vZGV2L251bGwgfCBzZWQgJ3NAXnJlZnMvcmVtb3Rlcy9vcmlnaW4vQEAnKQogICAgaWYgWyAtbiAiJERFRkFVTFRfUkVNT1RFIiBdOyB0aGVuCiAgICAgIEJBU0VfQlJBTkNIPSIkREVGQVVMVF9SRU1PVEUiCiAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgZWxzZQogICAgICBSRU1PVEVfQkFTRT0iIgogICAgZmkKICBmaQpmaQoKaWYgWyAtbiAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgZ2l0IGZldGNoIG9yaWdpbiAiJEJBU0VfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQpmaQoKRkVBVFVSRV9CUkFOQ0g9ImZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbiIKaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIIjsgdGhlbgogIGVjaG8gIkZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIGV4aXN0cywgY2hlY2tpbmcgb3V0Li4uIgogICMgU3Rhc2ggYW55IGxvY2FsIGNoYW5nZXMgZnJvbSBwcmV2aW91cyBydW5zIHRvIGF2b2lkIGNoZWNrb3V0IGNvbmZsaWN0cwogIGlmICEgZ2l0IGRpZmYtaW5kZXggLS1xdWlldCBIRUFEIC0tIHx8IFsgLW4gIiQoZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZS1zdGFuZGFyZCkiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgU3Rhc2hpbmcgbG9jYWwgY2hhbmdlcyBhbmQgdW50cmFja2VkIGZpbGVzIGJlZm9yZSBjaGVja291dCIKICAgIGdpdCBzdGFzaCBwdXNoIC0taW5jbHVkZS11bnRyYWNrZWQgLW0gIkF1dG8tc3Rhc2ggYmVmb3JlIGNoZWNrb3V0ICgkKGRhdGUgLXUgKyVZJW0lZC0lSCVNJVMpKSIgfHwgdHJ1ZQogIGZpCiAgZ2l0IGNoZWNrb3V0ICIkRkVBVFVSRV9CUkFOQ0giCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdOyB0aGVuCiAgICBlY2hvICLwn5OlIEZhc3QtZm9yd2FyZGluZyAkRkVBVFVSRV9CUkFOQ0ggd2l0aCAkUkVNT1RFX0JBU0UiCiAgICBpZiAhIGdpdCBtZXJnZSAiJFJFTU9URV9CQVNFIiAtLWZmLW9ubHkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gZmFzdC1mb3J3YXJkICRGRUFUVVJFX0JSQU5DSDsgY3JlYXRpbmcgZnJlc2ggYnJhbmNoIGZyb20gJFJFTU9URV9CQVNFIgogICAgICBORVdfQlJBTkNIPSIke0ZFQVRVUkVfQlJBTkNIfS0kKGRhdGUgLXUgKyVZJW0lZCVIJU0lUykiCiAgICAgIGdpdCBjaGVja291dCAtQiAiJE5FV19CUkFOQ0giICIkUkVNT1RFX0JBU0UiCiAgICAgIEZFQVRVUkVfQlJBTkNIPSIkTkVXX0JSQU5DSCIKICAgIGZpCiAgZmkKZWxzZQogIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyIKICBpZiBbIC1uICIkUkVNT1RFX0JBU0UiIF0gJiYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy8kUkVNT1RFX0JBU0UiOyB0aGVuCiAgICBnaXQgY2hlY2tvdXQgLWIgIiRGRUFUVVJFX0JSQU5DSCIgIiRSRU1PVEVfQkFTRSIKICBlbHNlCiAgICBnaXQgY2hlY2tvdXQgLWIgIiRGRUFUVVJFX0JSQU5DSCIKICBmaQpmaQoKZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgpnaXQgY29uZmlnIC0tbG9jYWwgcHVzaC5hdXRvU2V0dXBSZW1vdGUgdHJ1ZQpleHBvcnQgSU1QTEVNRU5UQVRJT05fQlJBTkNIPSIkRkVBVFVSRV9CUkFOQ0giCmVjaG8gIuKckyBVc2luZyBmZWF0dXJlIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIChiYXNlOiAke0JBU0VfQlJBTkNIOi11bmtub3dufSkiCgojIFNldCB3b3JraW5nIGRpcmVjdG9yeTogdXNlIHJlcG8gcm9vdCBpZiB3b3JraW5nX2RpcmVjdG9yeSBpcyAiLiIgb3IgZW1wdHkKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBDT0RFWF9XT1JLX0RJUj0iJFJFUE9fUk9PVCIKZWxzZQogIENPREVYX1dPUktfRElSPSIkUkVQT19ST09ULyRXT1JLX0RJUiIKICBta2RpciAtcCAiJENPREVYX1dPUktfRElSIgpmaQoKY2QgIiRDT0RFWF9XT1JLX0RJUiIKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0b3J5OiAkQ09ERVhfV09SS19ESVIiCgplY2hvICLwn5OmIGdpdCBzdGF0dXMiCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCmdpdCBzdGF0dXMgLS1zaG9ydCB8fCB0cnVlCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBNYXRlcmlhbGlzZSB0YXNrIGNvbnRleHQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgplY2hvICLwn6exIFN5bmNpbmcgdGFzayBhc3NldHMiCm1rZGlyIC1wICIkQ09ERVhfV09SS19ESVIvdGFzayIKY3AgLVIgL3Rhc2stZmlsZXMvdGFzay8qICIkQ09ERVhfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKCkRPQ1NfUkVQT19VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgpET0NTX0JSQU5DSD0ie3tkb2NzX2JyYW5jaH19IgpET0NTX1BST0pFQ1RfRElSRUNUT1JZPSJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKCmlmIFsgLW4gIiRET0NTX1JFUE9fVVJMIiBdICYmIFsgIiRET0NTX1JFUE9fVVJMIiAhPSAibnVsbCIgXTsgdGhlbgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgaWYgWyAteiAiJERPQ1NfQlJBTkNIIiBdIHx8IFsgIiRET0NTX0JSQU5DSCIgPSAibnVsbCIgXTsgdGhlbgogICAgRE9DU19CUkFOQ0g9Im1haW4iCiAgZmkKCiAgZWNobyAi8J+TmiBTeW5jaW5nIGRvY3MgcmVwb3NpdG9yeTogJERPQ1NfUkVQT19VUkwgKGJyYW5jaDogJERPQ1NfQlJBTkNIKSIKICBET0NTX0NMT05FX0RJUj0iL3RtcC9kb2NzLXJlcG8iCiAgcm0gLXJmICIkRE9DU19DTE9ORV9ESVIiCgogIHJlYWQgRE9DU19PV05FUiBET0NTX05BTUUgPDw8IiQocGFyc2VfcmVwbyAiJERPQ1NfUkVQT19VUkwiKSIKICBET0NTX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20vJHtET0NTX09XTkVSfS8ke0RPQ1NfTkFNRX0uZ2l0IgoKICBpZiBnaXQgY2xvbmUgLS1xdWlldCAtLWJyYW5jaCAiJERPQ1NfQlJBTkNIIiAtLXNpbmdsZS1icmFuY2ggIiRET0NTX0hUVFBfVVJMIiAiJERPQ1NfQ0xPTkVfRElSIjsgdGhlbgogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbG9uZWQiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjbG9uZSBkb2NzIGJyYW5jaCAnJERPQ1NfQlJBTkNIJzsgYXR0ZW1wdGluZyBkZWZhdWx0IGJyYW5jaCIKICAgIGlmIGdpdCBjbG9uZSAtLXF1aWV0ICIkRE9DU19IVFRQX1VSTCIgIiRET0NTX0NMT05FX0RJUiI7IHRoZW4KICAgICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbG9uZWQgdXNpbmcgZGVmYXVsdCBicmFuY2giCiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBVbmFibGUgdG8gY2xvbmUgZG9jcyByZXBvc2l0b3J5OiAkRE9DU19IVFRQX1VSTCIKICAgICAgRE9DU19DTE9ORV9ESVI9IiIKICAgIGZpCiAgZmkKCiAgaWYgWyAtbiAiJERPQ1NfQ0xPTkVfRElSIiBdOyB0aGVuCiAgICBET0NTX0JBU0VfUEFUSD0iJERPQ1NfQ0xPTkVfRElSLy50YXNrbWFzdGVyIgogICAgaWYgWyAtbiAiJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkiIF0gJiYgWyAiJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkiICE9ICJudWxsIiBdOyB0aGVuCiAgICAgIERPQ1NfQkFTRV9QQVRIPSIkRE9DU19DTE9ORV9ESVIvJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkvLnRhc2ttYXN0ZXIiCiAgICBmaQoKICAgIGVjaG8gIvCflI0gRG9jcyBiYXNlIHBhdGg6ICRET0NTX0JBU0VfUEFUSCIKICAgIFRBU0tfRElSPSIkRE9DU19CQVNFX1BBVEgvZG9jcy90YXNrLXt7dGFza19pZH19IgoKICBpZiBbIC1kICIkVEFTS19ESVIiIF07IHRoZW4KICAgIGVjaG8gIuKckyBDb3B5aW5nIHRhc2sgZGVmaW5pdGlvbiBmcm9tICRUQVNLX0RJUiIKICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgICBjcCAtUiAiJFRBU0tfRElSIi8uICIkQ09ERVhfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJFRBU0tfRElSIgogICAgZmkKCiAgICBpZiBbIC1mICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgXTsgdGhlbgogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogICAgICBjcCAiJERPQ1NfQkFTRV9QQVRIL3Rhc2tzLmpzb24iICIkQ09ERVhfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGZpCiAgZmkKZWxzZQogIGVjaG8gIuKaoO+4jyBEb2NzIHJlcG9zaXRvcnkgVVJMIG5vdCBwcm92aWRlZDsgc2tpcHBpbmcgdGFzayBkb2NzIHN5bmMiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL0FHRU5UUy5tZCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvQUdFTlRTLm1kICIkQ09ERVhfV09SS19ESVIvQUdFTlRTLm1kIgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRDT0RFWF9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2dpdGh1Yi1ndWlkZWxpbmVzLm1kICIkQ09ERVhfV09SS19ESVIvIgogIGVjaG8gIuKckyBDb3BpZWQgZ2l0aHViLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uICIkQ09ERVhfV09SS19ESVIvIgogIGVjaG8gIuKckyBDb3BpZWQgY2xpZW50LWNvbmZpZy5qc29uIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9tY3AuanNvbiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDT0RFWF9XT1JLX0RJUi8ubWNwLmpzb24iCmZpCgojIEd1YXJkIGFnYWluc3QgZGVzdHJ1Y3RpdmUgd29ya3NwYWNlIGNsZWFudXAgKHdvcmtzcGFjZSByb290LCByZXBvc2l0b3J5IHJvb3QsIG9yIFJ1c3R1cCBjYWNoZSkKZ3VhcmRfcm0oKSB7CiAgaWYgWyAiJCMiIC1nZSAyIF07IHRoZW4KICAgIGxvY2FsIGZsYWdzPSgpCiAgICBsb2NhbCB0YXJnZXRzPSgpCiAgICBmb3IgYXJnIGluICIkQCI7IGRvCiAgICAgIGNhc2UgIiRhcmciIGluCiAgICAgICAgLSopIGZsYWdzKz0oIiRhcmciKSA7OwogICAgICAgICopIHRhcmdldHMrPSgiJGFyZyIpIDs7CiAgICAgIGVzYWMKICAgIGRvbmUKCiAgICBsb2NhbCBoYXNfcmVjdXJzaXZlPTAKICAgIGxvY2FsIGhhc19mb3JjZT0wCiAgICBmb3IgZmxhZyBpbiAiJHtmbGFnc1tAXX0iOyBkbwogICAgICBjYXNlICIkZmxhZyIgaW4KICAgICAgICAtKikKICAgICAgICAgIFtbICIkZmxhZyIgPT0gKnIqIHx8ICIkZmxhZyIgPT0gKlIqIF1dICYmIGhhc19yZWN1cnNpdmU9MQogICAgICAgICAgW1sgIiRmbGFnIiA9PSAqZiogfHwgIiRmbGFnIiA9PSAqRiogXV0gJiYgaGFzX2ZvcmNlPTEKICAgICAgICAgIDs7CiAgICAgIGVzYWMKICAgIGRvbmUKCiAgICBpZiAoKGhhc19yZWN1cnNpdmUgJiYgaGFzX2ZvcmNlKSk7IHRoZW4KICAgICAgZm9yIHRhcmdldCBpbiAiJHt0YXJnZXRzW0BdfSI7IGRvCiAgICAgICAgWyAteiAiJHRhcmdldCIgXSAmJiBjb250aW51ZQogICAgICAgIGxvY2FsIGV4cGFuZGVkPSIkdGFyZ2V0IgogICAgICAgIGNhc2UgIiR0YXJnZXQiIGluCiAgICAgICAgICB+KikgZXhwYW5kZWQ9IiR7dGFyZ2V0LyNcfi8kSE9NRX0iIDs7CiAgICAgICAgZXNhYwogICAgICAgIGxvY2FsIHJlc29sdmVkCiAgICAgICAgcmVzb2x2ZWQ9JChyZWFscGF0aCAtbSAiJGV4cGFuZGVkIiAyPi9kZXYvbnVsbCB8fCBwcmludGYgJyVzJyAiJGV4cGFuZGVkIikKICAgICAgICBpZiBbICIkcmVzb2x2ZWQiID0gIiRDT0RFWF9XT1JLX0RJUiIgXSB8fCBbICIkcmVzb2x2ZWQiID0gIi93b3Jrc3BhY2UiIF0gfHwKICAgICAgICAgICBbICIkcmVzb2x2ZWQiID0gIiRIT01FIiBdIHx8IFtbICIkcmVzb2x2ZWQiID09ICIkSE9NRS8ucnVzdHVwIiogXV07IHRoZW4KICAgICAgICAgIGVjaG8gIuKdjCBHdWFyZDogZGVzdHJ1Y3RpdmUgcm0gYmxvY2tlZCAodGFyZ2V0PSR0YXJnZXQpIiA+JjIKICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgICAgZG9uZQogICAgZmkKICBmaQoKICByZXR1cm4gMAp9CgpybSgpIHsKICBpZiBndWFyZF9ybSAiJEAiOyB0aGVuCiAgICBjb21tYW5kIHJtICIkQCIKICBlbHNlCiAgICByZXR1cm4gMQogIGZpCn0KCmV4cG9ydCAtZiBndWFyZF9ybSBybQoKaWYgWyAhIC1mICIkQ09ERVhfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtaXNzaW5nIGZyb20gd29ya3NwYWNlOyByZXF1aXJlZCBmb3IgTUNQL3Rvb2xtYW4iCiAgZXhpdCAxCmZpCgplY2hvICI9PT0gTUNQIENMSUVOVCBDT05GSUcgPT09IgpXT1JLU1BBQ0VfQ0ZHPSIkQ09ERVhfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iClRBUkdFVF9DRkc9IiR7TUNQX0NMSUVOVF9DT05GSUc6LS93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29ufSIKCmlzX3ZhbGlkX2NmZygpIHsKICBsb2NhbCBwYXRoPSIkMSIKICBbIC1mICIkcGF0aCIgXSB8fCByZXR1cm4gMQogIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBqcSAtZSAndHlwZT09Im9iamVjdCIgYW5kIGxlbmd0aD49MCcgIiRwYXRoIiA+L2Rldi9udWxsIDI+JjEKICBlbHNlCiAgICBbIC1zICIkcGF0aCIgXQogIGZpCn0KCmlmIGlzX3ZhbGlkX2NmZyAiJFdPUktTUEFDRV9DRkciOyB0aGVuCiAgY3AgIiRXT1JLU1BBQ0VfQ0ZHIiAiJFRBUkdFVF9DRkciCiAgZWNobyAi4pyTIFVzaW5nIE1DUCBjbGllbnQgY29uZmlnIGZyb20gd29ya3NwYWNlOiAkVEFSR0VUX0NGRyIKZWxpZiBpc192YWxpZF9jZmcgIiRTT1VSQ0VfQ0ZHIjsgdGhlbgogIGNwICIkU09VUkNFX0NGRyIgIiRXT1JLU1BBQ0VfQ0ZHIgogIGNwICIkU09VUkNFX0NGRyIgIiRUQVJHRVRfQ0ZHIgogIGVjaG8gIuKckyBSZXN0b3JlZCBNQ1AgY2xpZW50IGNvbmZpZyBmcm9tIHNvdXJjZTogJFRBUkdFVF9DRkciCmVsc2UKICBlY2hvICLinYwgTm8gdmFsaWQgTUNQIGNsaWVudCBjb25maWcgYXZhaWxhYmxlIChjaGVja2VkICRXT1JLU1BBQ0VfQ0ZHIGFuZCAkU09VUkNFX0NGRykiCiAgaWYgWyAtZiAiJFdPUktTUEFDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBjb250ZW50cyBwcmV2aWV3OiI7IGhlYWQgLWMgMjAwICIkV09SS1NQQUNFX0NGRyIgMj4vZGV2L251bGwgfHwgZWNobyAiICAgPHVucmVhZGFibGU+IgogIGZpCiAgaWYgWyAtZiAiJFNPVVJDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFNvdXJjZSBjb250ZW50cyBwcmV2aWV3OiI7IGhlYWQgLWMgMjAwICIkU09VUkNFX0NGRyIgMj4vZGV2L251bGwgfHwgZWNobyAiICAgPHVucmVhZGFibGU+IgogIGZpCiAgZXhpdCAxCmZpCgpNQ1BfQ0xJRU5UX0NPTkZJRz0iJFRBUkdFVF9DRkciCmV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRwoKaWYgWyAtZiAiJE1DUF9DTElFTlRfQ09ORklHIiBdOyB0aGVuCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIltjbGllbnQtY29uZmlnXSBzdW1tYXJ5OiIKICAgIGlmICEganEgLXIgJyJyZW1vdGVUb29scz0iICsgKCgucmVtb3RlVG9vbHMgLy8gW10pIHwgbGVuZ3RoIHwgdG9zdHJpbmcpICsgIiwgbG9jYWxTZXJ2ZXJzPSIgKyAoKC5sb2NhbFNlcnZlcnMgLy8ge30gfCBrZXlzKSB8IGpvaW4oIiwiKSknICIkTUNQX0NMSUVOVF9DT05GSUciIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgIGVjaG8gIiAgKG5vdCB2YWxpZCBKU09OKSIKICAgIGZpCiAgZmkKZmkKCmVjaG8gIj09PSBjbGllbnQtY29uZmlnLmpzb24gPT09IgppZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogIGpxICcuJyAiJE1DUF9DTElFTlRfQ09ORklHIiAyPi9kZXYvbnVsbCB8fCBjYXQgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGNhdCAiJE1DUF9DTElFTlRfQ09ORklHIgpmaQplY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PSIKCm1rZGlyIC1wICIkSE9NRS8uY29kZXgiCmlmIFsgLWYgL3Rhc2stZmlsZXMvY29kZXgtY29uZmlnLnRvbWwgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGV4LWNvbmZpZy50b21sICIkSE9NRS8uY29kZXgvY29uZmlnLnRvbWwiCiAgZWNobyAi4pyTIEluc3RhbGxlZCBjb2RleC1jb25maWcudG9tbCIKZWxzZQogIGVjaG8gIuKaoO+4jyBjb2RleC1jb25maWcudG9tbCBub3QgcHJvdmlkZWQ7IGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cyIKZmkKCmVjaG8gIj09PSBNQ1AgUFJFQ0hFQ0tTID09PSIKaWYgISBjb21tYW5kIC12IHRvb2xtYW4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MICd0b29sbWFuJyBDTEkgbm90IGZvdW5kIGluIFBBVEg7IHJlcXVpcmVkIGZvciBNQ1AiCiAgZXhpdCAxCmZpCgpUT09MTUFOX1VSTD0ke1RPT0xNQU5fU0VSVkVSX1VSTDotImh0dHA6Ly90b29sbWFuLmFnZW50LXBsYXRmb3JtLnN2Yy5jbHVzdGVyLmxvY2FsOjMwMDAvbWNwIn0KVE9PTE1BTl9VUkw9IiR7VE9PTE1BTl9VUkwlL30iCmVjaG8gIvCflI0gQ2hlY2tpbmcgVG9vbG1hbiBlbmRwb2ludDogJFRPT0xNQU5fVVJMIgppZiAhIGN1cmwgLXNTZiAtLWNvbm5lY3QtdGltZW91dCAyIC0tbWF4LXRpbWUgNiBcCiAgLVggUE9TVCAiJFRPT0xNQU5fVVJMIiBcCiAgLUggJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicgXAogIC1kICd7Impzb25ycGMiOiIyLjAiLCJpZCI6ImhlYWx0aCIsIm1ldGhvZCI6InRvb2xzL2xpc3QiLCJwYXJhbXMiOnt9fScgPi90bXAvdG9vbG1hbi1waW5nLmxvZyAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byByZWFjaCBUb29sbWFuIHNlcnZlciBhdCAkVE9PTE1BTl9VUkwiCiAgY2F0IC90bXAvdG9vbG1hbi1waW5nLmxvZyA+JjIgfHwgdHJ1ZQogIHJtIC1mIC90bXAvdG9vbG1hbi1waW5nLmxvZwogIGV4aXQgMQpmaQpybSAtZiAvdG1wL3Rvb2xtYW4tcGluZy5sb2cKZWNobyAi4pyTIFRvb2xtYW4gZW5kcG9pbnQgcmVhY2hhYmxlIgoKIyBSZWZyZXNoIFRvb2xtYW4gcmVtb3RlIHRvb2xzIHNvIHRoZSBNQ1AgY2xpZW50IHNlZXMgdGhlIGZ1bGwgY2F0YWxvZyAoQ29kZXggZmlsdGVycyBhZ2dyZXNzaXZlbHkpCmlmIFsgLXogIiR7T1BFTkFJX0FQSV9LRVk6LX0iIF07IHRoZW4KICBlY2hvICLinYwgT1BFTkFJX0FQSV9LRVkgaXMgbm90IHNldDsgQ29kZXggY2Fubm90IGF1dGhlbnRpY2F0ZSIKICBleGl0IDEKZmkKCmVjaG8gIvCflJEgQ29uZmlndXJpbmcgQ29kZXggYXV0aGVudGljYXRpb24iCmlmICEgY29kZXggbG9naW4gLS1hcGkta2V5ICIkT1BFTkFJX0FQSV9LRVkiID4vdG1wL2NvZGV4LWxvZ2luLmxvZyAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIEZhaWxlZCB0byBjb25maWd1cmUgQ29kZXggQVBJIGtleSIKICBjYXQgL3RtcC9jb2RleC1sb2dpbi5sb2cgPiYyIHx8IHRydWUKICBybSAtZiAvdG1wL2NvZGV4LWxvZ2luLmxvZwogIGV4aXQgMQpmaQpybSAtZiAvdG1wL2NvZGV4LWxvZ2luLmxvZwoKaWYgWyAhIC1mICIkQ09ERVhfV09SS19ESVIvQUdFTlRTLm1kIiBdOyB0aGVuCiAgZWNobyAi4pqg77iPIEFHRU5UUy5tZCBtaXNzaW5nOyBjcmVhdGluZyBwbGFjZWhvbGRlciIKICBjYXQgPDwnUExBQ0VIT0xERVInID4gIiRDT0RFWF9XT1JLX0RJUi9BR0VOVFMubWQiCiMgUHJvamVjdCBHdWlkYW5jZQoKVGhpcyBDb2RleCBydW4gd2FzIHRyaWdnZXJlZCB3aXRob3V0IEFHRU5UUy5tZCBjb250ZW50LiBQcm92aWRlIHByb2plY3QgY29udGV4dCBpbiBBR0VOVFMubWQgdG8gZ2l2ZSBDb2RleCByaWNoZXIgaW5zdHJ1Y3Rpb25zLgpQTEFDRUhPTERFUgpmaQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvbXB0IGFzc2VtYmx5IGFuZCBDb2RleCBleGVjdXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpQUk9NUFRfUFJFRklYPSIiCmlmIFsgLWYgIiRDT0RFWF9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh98J+UpyAqKkNSSVRJQ0FMOiBUb29sIFVzYWdlIFJlZmVyZW5jZSoqXG5cbiQoY2F0ICIkQ09ERVhfV09SS19ESVIvdGFzay90b29sbWFuLWd1aWRlLm1kIilcblxuLS0tXG5cbiIKZmkKClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH3imqDvuI8gKipFWEVDVVRJT04gUkVRVUlSRU1FTlRTIChNQU5EQVRPUlkpKipcblxuLSAqKkZvbGxvdyBwYXR0ZXJucyoqOiByZWZlcmVuY2UgQGNvZGluZy1ndWlkZWxpbmVzLm1kIGFuZCBAZ2l0aHViLWd1aWRlbGluZXMubWQgaW4gdGhpcyB3b3Jrc3BhY2UuXG4tICoqTm8gbW9ja3Mgb3Igc3R1YnMqKjogaW50ZWdyYXRlIHdpdGggbGl2ZSBzZXJ2aWNlcywgQVBJcywgYW5kIGNvbmZpZ3VyYXRpb247IHJlbW92ZSBhbGwgcGxhY2Vob2xkZXJzLlxuLSAqKlBhcmFtZXRlcml6ZSBldmVyeXRoaW5nKio6IGV2ZXJ5IGVuZHBvaW50LCB0aHJlc2hvbGQsIG9yIHRyYWRpbmcgcGFpciBtdXN0IGNvbWUgZnJvbSBlbnYgdmFycywgY29uZmlnLCBvciBDTEkgZmxhZ3MuXG4tICoqR2l0SHViIGF1dGggcmVhZHkqKjogdGhlIEdpdEh1YiBBcHAgdG9rZW4gKFxgR0hfVE9LRU5cYCkgaXMgYWxyZWFkeSBjb25maWd1cmVkOyBza2lwIG1hbnVhbCBcYGdoIGF1dGggbG9naW5cYCBmbG93cyBhbmQgYXZvaWQgaGl0dGluZyB1c2VyLW9ubHkgZW5kcG9pbnRzIGxpa2UgXGAvdXNlclxgLlxuLSAqKkZlYXR1cmUgYnJhbmNoIG9ubHkqKjogc3RheSBvbiBcYGZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvblxgOyBuZXZlciBwdXNoIGRpcmVjdGx5IHRvIG1haW4vbWFzdGVyIG9yIHJldGFyZ2V0IHRoZSBicmFuY2ggdXBzdHJlYW0uXG4tICoqRXhlY3V0ZSB3aXRob3V0IHBhdXNlKio6IGlmIHlvdSBvdXRsaW5lIGEgcGxhbiwgaW1tZWRpYXRlbHkgY2FycnkgaXQgb3V04oCUZG8gbm90IHdhaXQgZm9yIGNvbmZpcm1hdGlvbiBvciBhZGRpdGlvbmFsIGlucHV0LlxuLSAqKlF1YWxpdHkgZ2F0ZXMqKjogcnVuIFxgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tcYCwgXGBjYXJnbyBjbGlwcHkgLS13b3Jrc3BhY2UgLS1hbGwtdGFyZ2V0cyAtLWFsbC1mZWF0dXJlcyAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljXGAsIGFuZCBcYGNhcmdvIHRlc3QgLS13b3Jrc3BhY2UgLS1hbGwtZmVhdHVyZXNcYCBiZWZvcmUgZGVjbGFyaW5nIHN1Y2Nlc3MuXG4tICoqRG9jdW1lbnRhdGlvbiAmIFBSKio6IHVwZGF0ZSBwcm9qZWN0IGRvY3MgYW5kIG9wZW4gYSBQUiB2aWEgXGBnaCBwciBjcmVhdGVcYCB3aXRoIGxhYmVscyB0YXNrLXt7dGFza19pZH19LCBzZXJ2aWNlLXt7c2VydmljZX19LCBhbmQgcnVuLXt7d29ya2Zsb3dfbmFtZX19LlxuLSAqKlByZXNlcnZlIHdvcmtzcGFjZSoqOiBuZXZlciBkZWxldGUgdGhlIHJlcG9zaXRvcnkgb3IgcnVuIGRlc3RydWN0aXZlIGNsZWFudXAgY29tbWFuZHMgKGZvciBleGFtcGxlIFxgcm0gLXJmXGApOyBsZWF2ZSBhcnRpZmFjdHMgaW4gcGxhY2UgZm9yIFFBLlxuXG4tLS1cblxuIgoKaWYgWyAtZiAiJENPREVYX1dPUktfRElSL2dpdGh1Yi1ndWlkZWxpbmVzLm1kIiBdIHx8IFsgLWYgIiRDT0RFWF9XT1JLX0RJUi9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH3wn5OaICoqUmVmZXJlbmNlIE1hdGVyaWFscyBBdmFpbGFibGUqKlxuIgogIGlmIFsgLWYgIiRDT0RFWF9XT1JLX0RJUi9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQGdpdGh1Yi1ndWlkZWxpbmVzLm1kXG4iCiAgZmkKICBpZiBbIC1mICIkQ09ERVhfV09SS19ESVIvY29kaW5nLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEBjb2RpbmctZ3VpZGVsaW5lcy5tZFxuIgogIGZpCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfVxuLS0tXG5cbiIKZmkKCmlmIFsgLWYgIiRDT0RFWF9XT1JLX0RJUi9BR0VOVFMubWQiIF07IHRoZW4KICBpZiBBR0VOVF9HVUlEQU5DRT0kKGpxIC1ScyBAanNvbiAiJENPREVYX1dPUktfRElSL0FHRU5UUy5tZCIgMj4vZGV2L251bGwpOyB0aGVuCiAgICBpZiBbICIkeyNBR0VOVF9HVUlEQU5DRX0iIC1ndCAyIF07IHRoZW4KICAgICAgQUdFTlRfR1VJREFOQ0U9JHtBR0VOVF9HVUlEQU5DRToxOi0xfQogICAgICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh98J+noCAqKkFnZW50IEd1aWRhbmNlKipcblxuJHtBR0VOVF9HVUlEQU5DRX1cblxuLS0tXG5cbiIKICAgIGZpCiAgZmkKZmkKCmVjaG8gIvCflI0gREVCVUc6IEFib3V0IHRvIGNoZWNrIGZvciBwcm9tcHQubWQgYXQ6ICRDT0RFWF9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFzayBkaXJlY3Rvcnk6IgpscyAtbGEgIiRDT0RFWF9XT1JLX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGVtcHR5IgplY2hvICLwn5SNIERFQlVHOiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGNvbnRlbnRzOiIKbHMgLWxhICIkQ09ERVhfV09SS19ESVIvIiB8fCBlY2hvICJXb3JraW5nIGRpcmVjdG9yeSBub3QgYWNjZXNzaWJsZSIKClBST01QVF9GSUxFPSIkQ09ERVhfV09SS19ESVIvdGFzay9wcm9tcHQubWQiCmlmIFsgISAtZiAiJFBST01QVF9GSUxFIiBdOyB0aGVuCiAgZWNobyAi4p2MIHByb21wdC5tZCBub3QgZm91bmQgYXQgJFBST01QVF9GSUxFIgogIGV4aXQgMQpmaQoKZWNobyAic3RhcnRpbmdUYXNrOnt7dGFza19pZH19IgplY2hvICIiCgpQUk9NUFRfQ09OVEVOVD0iJHtQUk9NUFRfUFJFRklYfSQoY2F0ICIkUFJPTVBUX0ZJTEUiKSIKCk9SSUdJTkFMX1BST01QVD0iJFBST01QVF9DT05URU5UIgpQUkVWSU9VU19NRVNTQUdFX0ZJTEU9IiIKVE9LRU5fTElNSVQ9JHtDT0RFWF9UT0tFTl9MSU1JVDotMjQwMDAwfQpDT0RFWF9USU1FT1VUPSR7Q09ERVhfRVhFQ19USU1FT1VUOi0xODAwfQpSRVNFVF9TRVNTSU9OX09OX1JFVFJZPSR7Q09ERVhfUkVTRVRfU0VTU0lPTl9PTl9SRVRSWTotMX0KQ09OVElOVUVfU0VTU0lPTj0ke0NPREVYX0NPTlRJTlVFX1NFU1NJT046LTF9CgpNQVhfUkVUUklFUz0ke0NPREVYX01BWF9SRVRSSUVTOi0ke0VYRUNVVElPTl9NQVhfUkVUUklFUzotNX19CkFUVEVNUFQ9MQpTVUNDRVNTPTAKQ09ERVhfRVhJVD0xCkxBU1RfTUVTU0FHRV9GSUxFPSIiClJVTl9MT0c9IiIKClNFU1NJT05fRElSPSIkSE9NRS8uY29kZXgvc2Vzc2lvbnMiClJFU1VNRV9BUkdTPSgpClNFU1NJT05fRklMRT0iJENPREVYX1dPUktfRElSLy5jb2RleC1zZXNzaW9uIgpDVVJSRU5UX1NFU1NJT05fSUQ9IiIKCiMgQ2lyY3VpdCBicmVha2VyOiB0cmFjayByZXBlYXRlZCBjb21tYW5kIGZhaWx1cmVzCmRlY2xhcmUgLUEgRkFJTEVEX0NPTU1BTkRTCk1BWF9TQU1FX0NPTU1BTkRfRkFJTFVSRVM9MwoKaWYgWyAtZiAiJFNFU1NJT05fRklMRSIgXTsgdGhlbgogIENVUlJFTlRfU0VTU0lPTl9JRD0kKHRyIC1kICdcclxuICcgPCAiJFNFU1NJT05fRklMRSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKZmkKCmV4dHJhY3Rfc2Vzc2lvbl9pZCgpIHsKICBsb2NhbCBsb2dfZmlsZT0iJDEiCiAgWyAtZiAiJGxvZ19maWxlIiBdIHx8IHJldHVybiAxCiAgYXdrICcKICAgIHsKICAgICAgZ3N1YigvXDAzM1xbWzAtOTtdKlttS10vLCAiIik7CiAgICAgIGlmICgkMCB+IC9jb2RleCBzZXNzaW9uW1s6c3BhY2U6XV0rWzAtOWEtZkEtRi1dezQsfS8pIHsKICAgICAgICBtYXRjaCgkMCwgL2NvZGV4IHNlc3Npb25bWzpzcGFjZTpdXSsoWzAtOWEtZkEtRi1dKykvLCBhKTsKICAgICAgICBpZiAoYVsxXSAhPSAiIikgbGFzdD1hWzFdOwogICAgICB9CiAgICB9CiAgICBFTkQgewogICAgICBpZiAobGFzdCAhPSAiIikgcHJpbnQgbGFzdDsKICAgIH0KICAnICIkbG9nX2ZpbGUiIDI+L2Rldi9udWxsCn0KCnBlcnNpc3Rfc2Vzc2lvbl9pZCgpIHsKICBsb2NhbCBzZXNzaW9uX2lkPSIkMSIKICBpZiBbIC1uICIkc2Vzc2lvbl9pZCIgXTsgdGhlbgogICAgcHJpbnRmICclc1xuJyAiJHNlc3Npb25faWQiID4gIiRTRVNTSU9OX0ZJTEUiCiAgZmkKfQoKaWYgWyAiJENPTlRJTlVFX1NFU1NJT04iID0gIjEiIF07IHRoZW4KICBpZiBbIC1uICIkQ1VSUkVOVF9TRVNTSU9OX0lEIiBdOyB0aGVuCiAgICBlY2hvICLihLnvuI8gIFJlc3VtaW5nIENvZGV4IHNlc3Npb24gZnJvbSBicmVhZGNydW1iOiAkQ1VSUkVOVF9TRVNTSU9OX0lEIgogICAgUkVTVU1FX0FSR1M9KCJyZXN1bWUiICIkQ1VSUkVOVF9TRVNTSU9OX0lEIikKICBlbGlmIFsgLWQgIiRTRVNTSU9OX0RJUiIgXSAmJiBbIC1uICIkKGZpbmQgIiRTRVNTSU9OX0RJUiIgLW1heGRlcHRoIDEgLXR5cGUgZiAtbmFtZSAnKi5qc29uJyAtcHJpbnQgLXF1aXQgMj4vZGV2L251bGwpIiBdOyB0aGVuCiAgICBlY2hvICLihLnvuI8gIEV4aXN0aW5nIENvZGV4IHNlc3Npb25zIGZvdW5kOyB3aWxsIHJlc3VtZSBtb3N0IHJlY2VudCIKICAgIFJFU1VNRV9BUkdTPSgicmVzdW1lIiAiLS1sYXN0IikKICBmaQplbHNlCiAgaWYgWyAtZCAiJFNFU1NJT05fRElSIiBdOyB0aGVuCiAgICBmaW5kICIkU0VTU0lPTl9ESVIiIC1tYXhkZXB0aCAxIC10eXBlIGYgLW5hbWUgJyouanNvbicgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZmkKICBybSAtZiAiJFNFU1NJT05fRklMRSIKZmkKCndoaWxlIFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGVjaG8gIvCfmoAgQ29kZXggZXhlY3V0aW9uIGF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTIgogIExBU1RfTUVTU0FHRV9GSUxFPSIvdG1wL2NvZGV4LWxhc3QtbWVzc2FnZS0ke0FUVEVNUFR9LnR4dCIKICBSVU5fTE9HPSIvdG1wL2NvZGV4LXJ1bi0ke0FUVEVNUFR9Lmpzb25sIgoKICBTRVNTSU9OX0ZMQUdTPSgpCiAgaWYgWyAkQVRURU1QVCAtZXEgMSBdICYmIFsgJHsjUkVTVU1FX0FSR1NbQF19IC1ndCAwIF07IHRoZW4KICAgIFNFU1NJT05fRkxBR1M9KCIke1JFU1VNRV9BUkdTW0BdfSIpCiAgZWxzZQogICAgU0VTU0lPTl9GTEFHUz0oKQogICAgaWYgWyAiJFJFU0VUX1NFU1NJT05fT05fUkVUUlkiID0gIjEiIF0gJiYgWyAkQVRURU1QVCAtZ3QgMSBdICYmIFsgLWQgIiRTRVNTSU9OX0RJUiIgXTsgdGhlbgogICAgICBmaW5kICIkU0VTU0lPTl9ESVIiIC1tYXhkZXB0aCAxIC10eXBlIGYgLW5hbWUgJyouanNvbicgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIHJtIC1mICIkU0VTU0lPTl9GSUxFIgogICAgICBDVVJSRU5UX1NFU1NJT05fSUQ9IiIKICAgIGZpCiAgZmkKCiAgaWYgWyAkQVRURU1QVCAtZXEgMSBdOyB0aGVuCiAgICBQUk9NUFRfUEFZTE9BRD0iJE9SSUdJTkFMX1BST01QVCIKICBlbHNlCiAgICBpZiBbIC1uICIkUFJFVklPVVNfTUVTU0FHRV9GSUxFIiBdICYmIFsgLXMgIiRQUkVWSU9VU19NRVNTQUdFX0ZJTEUiIF07IHRoZW4KICAgICAgUFJFVklPVVNfU05JUFBFVD0kKHRhaWwgLW4gNDAgIiRQUkVWSU9VU19NRVNTQUdFX0ZJTEUiIDI+L2Rldi9udWxsIHwgc2VkICdzL14vICAgIC8nKQogICAgZWxzZQogICAgICBQUkVWSU9VU19TTklQUEVUPSIgICAgPG5vIHByZXZpb3VzIENvZGV4IHN1bW1hcnkgYXZhaWxhYmxlPiIKICAgIGZpCiAgICBQUk9NUFRfUEFZTE9BRD0iQ29udGludWluZyBUYXNrIHt7dGFza19pZH19IGZvciBzZXJ2aWNlIHt7c2VydmljZX19IChhdHRlbXB0ICRBVFRFTVBUKS4KClByZXZpb3VzIENvZGV4IHN1bW1hcnk6CiRQUkVWSU9VU19TTklQUEVUCgpGb2N1cyBvbiB1bnJlc29sdmVkIHdvcmssIGF2b2lkIHJlcGVhdGluZyBjb21wbGV0ZWQgc3RlcHMsIGFuZCBwcm9ncmVzcyB0b3dhcmQgY29tcGxldGlvbi4iCiAgZmkKCiAgc2V0ICtlCiAgc2V0IC1vIHBpcGVmYWlsCiAgQ09ERVhfQ01EPSgKICAgICJjb2RleCIKICAgICItLWFzay1mb3ItYXBwcm92YWwiICJuZXZlciIKICAgICJleGVjIgogICAgIi0tZGFuZ2Vyb3VzbHktYnlwYXNzLWFwcHJvdmFscy1hbmQtc2FuZGJveCIKICAgICItLXNraXAtZ2l0LXJlcG8tY2hlY2siCiAgICAiLS1vdXRwdXQtbGFzdC1tZXNzYWdlIiAiJExBU1RfTUVTU0FHRV9GSUxFIgogICAgIi0tY2QiICIkQ09ERVhfV09SS19ESVIiCiAgKQogIGlmIFsgJHsjU0VTU0lPTl9GTEFHU1tAXX0gLWd0IDAgXTsgdGhlbgogICAgQ09ERVhfQ01EKz0oIiR7U0VTU0lPTl9GTEFHU1tAXX0iKQogIGZpCiAgQ09ERVhfQ01EKz0oIiRQUk9NUFRfUEFZTE9BRCIpCgogIGlmIGNvbW1hbmQgLXYgdGltZW91dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHRpbWVvdXQgIiRDT0RFWF9USU1FT1VUIiAiJHtDT0RFWF9DTURbQF19IiB8IHRlZSAiJFJVTl9MT0ciCiAgZWxzZQogICAgIiR7Q09ERVhfQ01EW0BdfSIgfCB0ZWUgIiRSVU5fTE9HIgogIGZpCiAgQ09ERVhfRVhJVD0ke1BJUEVTVEFUVVNbMF19CiAgc2V0ICtvIHBpcGVmYWlsCiAgc2V0IC1lCgogIGlmIFsgJENPREVYX0VYSVQgLWVxIDEyNCBdOyB0aGVuCiAgICBlY2hvICLij7HvuI8gQ29kZXggY29tbWFuZCBleGNlZWRlZCAke0NPREVYX1RJTUVPVVR9cyB0aW1lb3V0OyB0ZXJtaW5hdGluZyBzZXNzaW9uIgogICAgcGtpbGwgLWYgImNvZGV4IiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBQUkVWSU9VU19NRVNTQUdFX0ZJTEU9IiRMQVNUX01FU1NBR0VfRklMRSIKICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgY29udGludWUKICBmaQoKICBlY2hvICJbY29kZXgtZGVidWddIEF0dGVtcHQgJEFUVEVNUFQgZmluaXNoZWQgd2l0aCBleGl0IGNvZGUgJENPREVYX0VYSVQiCgogIGlmIFsgJENPREVYX0VYSVQgLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIENvZGV4IGV4aXRlZCB3aXRoIHN0YXR1cyAkQ09ERVhfRVhJVCBvbiBhdHRlbXB0ICRBVFRFTVBUIgogIGZpCgogICMgQ2lyY3VpdCBicmVha2VyOiBkZXRlY3QgcmVwZWF0ZWQgZmFpbGluZyBiYXNoIGNvbW1hbmRzCiAgaWYgWyAtZiAiJFJVTl9MT0ciIF0gJiYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICMgQ29kZXggZm9ybWF0OiBsb29rIGZvciBiYXNoIHRvb2wgZmFpbHVyZXMgaW4gSlNPTiBsb2cKICAgICMgTm90ZTogQ29kZXggbWF5IG91dHB1dCB0ZXh0LCBzbyB0aGlzIG9ubHkgd29ya3MgaWYgSlNPTiBsb2dnaW5nIGlzIGVuYWJsZWQKICAgIEZBSUxFRF9DTUQ9JChqcSAtciAnc2VsZWN0KC50eXBlPT0iYmFzaCIgYW5kICguZXhpdF9jb2RlIC8vIDApICE9IDApIHwgLmNvbW1hbmQnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSB8IGhlYWQgLWMgMTAwKQogICAgCiAgICAjIEZhbGxiYWNrOiBncmVwIGZvciBjb21tb24gZXJyb3IgcGF0dGVybnMgaW4gcGxhaW4gdGV4dCBsb2dzCiAgICBpZiBbIC16ICIkRkFJTEVEX0NNRCIgXSAmJiBbIC1mICIkUlVOX0xPRyIgXTsgdGhlbgogICAgICAjIFRyeSB0byBleHRyYWN0IGZyb20gdGV4dCBvdXRwdXQgKGxlc3MgcmVsaWFibGUgYnV0IGJldHRlciB0aGFuIG5vdGhpbmcpCiAgICAgIEZBSUxFRF9DTUQ9JChncmVwIC1vUCAnKD88PVwkICkuKj8oPz0gXChleGl0KScgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xIHwgaGVhZCAtYyAxMDAgfHwgdHJ1ZSkKICAgIGZpCiAgICAKICAgIGlmIFsgLW4gIiRGQUlMRURfQ01EIiBdOyB0aGVuCiAgICAgICMgVHJhY2sgaG93IG1hbnkgdGltZXMgdGhpcyBjb21tYW5kIGhhcyBmYWlsZWQKICAgICAgRkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdPSQoKCR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdOi0wfSArIDEpKQogICAgICBGQUlMX0NPVU5UPSR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdfQogICAgICAKICAgICAgaWYgWyAkRkFJTF9DT1VOVCAtZ2UgJE1BWF9TQU1FX0NPTU1BTkRfRkFJTFVSRVMgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflLQgQ0lSQ1VJVCBCUkVBS0VSIFRSSUdHRVJFRDogQ29tbWFuZCBoYXMgZmFpbGVkICRGQUlMX0NPVU5UIHRpbWVzIGluIGEgcm93OiIKICAgICAgICBlY2hvICIgICBDb21tYW5kOiAkRkFJTEVEX0NNRCIKICAgICAgICBlY2hvICIgICBUaGlzIGluZGljYXRlcyB0aGUgYWdlbnQgaXMgc3R1Y2sgaW4gYSBsb29wLiIKICAgICAgICAKICAgICAgICAjIEluamVjdCBpbnRlcnZlbnRpb24gcHJvbXB0IGZvciBuZXh0IGF0dGVtcHQKICAgICAgICBQUk9NUFRfQ09OVEVOVD0iJHtQUk9NUFRfQ09OVEVOVH0KCuKaoO+4jyAqKkxPT1AgREVURUNURUQqKjogWW91IHRyaWVkIHRoaXMgY29tbWFuZCAkRkFJTF9DT1VOVCB0aW1lczoKXGBcYFxgYmFzaAokRkFJTEVEX0NNRApcYFxgXGAKCkl0IGtlZXBzIGZhaWxpbmcuICoqU1RPUCBSRVBFQVRJTkcgVEhJUyBDT01NQU5ELioqCgpUcnkgaW5zdGVhZDoKMS4gQ2hlY2sgd29ya2luZyBkaXJlY3Rvcnk6IFxgcHdkXGAKMi4gTGlzdCBmaWxlczogXGBscyAtbGFcYAozLiBVc2UgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBhcHByb2FjaAo0LiBDcmVhdGUgZmlsZXMvZGlyZWN0b3JpZXMgc3RlcC1ieS1zdGVwIgogICAgICAgIAogICAgICAgICMgUmVzZXQgY291bnRlcgogICAgICAgIEZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXT0wCiAgICAgIGZpCiAgICBmaQogIGZpCgogIE5FV19TRVNTSU9OX0lEPSIiCiAgaWYgWyAtbiAiJFJVTl9MT0ciIF0gJiYgWyAtZiAiJFJVTl9MT0ciIF07IHRoZW4KICAgIE5FV19TRVNTSU9OX0lEPSQoZXh0cmFjdF9zZXNzaW9uX2lkICIkUlVOX0xPRyIgfHwgdHJ1ZSkKICBmaQogIGlmIFsgLW4gIiRORVdfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgaWYgWyAiJENVUlJFTlRfU0VTU0lPTl9JRCIgIT0gIiRORVdfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgICBlY2hvICLihLnvuI8gIENhcHR1cmVkIENvZGV4IHNlc3Npb24gSUQ6ICRORVdfU0VTU0lPTl9JRCIKICAgICAgQ1VSUkVOVF9TRVNTSU9OX0lEPSIkTkVXX1NFU1NJT05fSUQiCiAgICAgIHBlcnNpc3Rfc2Vzc2lvbl9pZCAiJENVUlJFTlRfU0VTU0lPTl9JRCIKICAgIGZpCiAgZmkKCiAgaWYgWyAiJENPTlRJTlVFX1NFU1NJT04iID0gIjEiIF0gJiYgWyAtbiAiJENVUlJFTlRfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgUkVTVU1FX0FSR1M9KCJyZXN1bWUiICIkQ1VSUkVOVF9TRVNTSU9OX0lEIikKICBlbHNlCiAgICBSRVNVTUVfQVJHUz0oKQogIGZpCgogIFBSRVZJT1VTX01FU1NBR0VfRklMRT0iJExBU1RfTUVTU0FHRV9GSUxFIgoKICAjIEVuaGFuY2VkIHRva2VuIHRyYWNraW5nIHdpdGggbWV0cmljcyBzdG9yYWdlCiAgaWYgWyAtZiAiJFJVTl9MT0ciIF07IHRoZW4KICAgICMgVHJ5IG11bHRpcGxlIGV4dHJhY3Rpb24gbWV0aG9kcyBmb3Igcm9idXN0bmVzcwogICAgTEFTVF9UT0tFTlM9JChncmVwIC1FbyAndG9rZW5zIHVzZWQ6IFswLTksXSsnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSB8IGF3ayAne3ByaW50ICQzfScgfCB0ciAtZCAnLCcgfCB0ciAtZCAnXG4nIHx8IHRydWUpCiAgICAKICAgICMgQWxzbyB0cnkgSlNPTiBmb3JtYXQgaWYgYXZhaWxhYmxlCiAgICBpZiBbIC16ICIkTEFTVF9UT0tFTlMiIF0gJiYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgVE9LRU5TX0lOPSQoanEgLXIgJ3NlbGVjdCgudG9rZW5zLmlucHV0ICE9IG51bGwpIHwgLnRva2Vucy5pbnB1dCcgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xKQogICAgICBUT0tFTlNfT1VUPSQoanEgLXIgJ3NlbGVjdCgudG9rZW5zLm91dHB1dCAhPSBudWxsKSB8IC50b2tlbnMub3V0cHV0JyAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEpCiAgICAgIAogICAgICBpZiBbWyAiJFRPS0VOU19JTiIgPX4gXlswLTldKyQgXV0gJiYgW1sgIiRUT0tFTlNfT1VUIiA9fiBeWzAtOV0rJCBdXTsgdGhlbgogICAgICAgIExBU1RfVE9LRU5TPSQoKFRPS0VOU19JTiArIFRPS0VOU19PVVQpKQogICAgICAgIGVjaG8gIvCfk4ogQ29kZXggdG9rZW5zIHRoaXMgYXR0ZW1wdDogaW5wdXQ9JFRPS0VOU19JTiwgb3V0cHV0PSRUT0tFTlNfT1VULCB0b3RhbD0kTEFTVF9UT0tFTlMiCiAgICAgICAgCiAgICAgICAgIyBTdG9yZSBkZXRhaWxlZCBtZXRyaWNzIGZvciBjb3N0IGFuYWx5c2lzCiAgICAgICAgZWNobyAie1wiYXR0ZW1wdFwiOiRBVFRFTVBULFwidGFza19pZFwiOlwie3t0YXNrX2lkfX1cIixcInNlcnZpY2VcIjpcInt7c2VydmljZX19XCIsXCJjbGlcIjpcImNvZGV4XCIsXCJ0b2tlbnNfaW5cIjokVE9LRU5TX0lOLFwidG9rZW5zX291dFwiOiRUT0tFTlNfT1VULFwidG9rZW5zX3RvdGFsXCI6JExBU1RfVE9LRU5TfSIgPj4gL3RtcC9jb2RleC1tZXRyaWNzLmpzb25sCiAgICAgIGZpCiAgICBmaQogICAgCiAgICBpZiBbWyAiJExBU1RfVE9LRU5TIiA9fiBeWzAtOV0rJCBdXTsgdGhlbgogICAgICBpZiBbIC16ICIkVE9LRU5TX0lOIiBdOyB0aGVuCiAgICAgICAgIyBPbmx5IHRvdGFsIGF2YWlsYWJsZSBmcm9tIHRleHQgZm9ybWF0CiAgICAgICAgZWNobyAi8J+TiiBDb2RleCB0b2tlbnMgdXNlZCB0aGlzIGF0dGVtcHQ6ICRMQVNUX1RPS0VOUyIKICAgICAgICBlY2hvICJ7XCJhdHRlbXB0XCI6JEFUVEVNUFQsXCJ0YXNrX2lkXCI6XCJ7e3Rhc2tfaWR9fVwiLFwic2VydmljZVwiOlwie3tzZXJ2aWNlfX1cIixcImNsaVwiOlwiY29kZXhcIixcInRva2Vuc190b3RhbFwiOiRMQVNUX1RPS0VOU30iID4+IC90bXAvY29kZXgtbWV0cmljcy5qc29ubAogICAgICBmaQogICAgICAKICAgICAgIyBDaGVjayB0b2tlbiBsaW1pdCBpZiBjb25maWd1cmVkCiAgICAgIGlmIFsgIiR7VE9LRU5fTElNSVQ6LTB9IiAtZ3QgMCBdICYmIFsgIiRMQVNUX1RPS0VOUyIgLWd0ICIkVE9LRU5fTElNSVQiIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gVG9rZW4gdXNhZ2UgJExBU1RfVE9LRU5TIGV4Y2VlZHMgbGltaXQgJFRPS0VOX0xJTUlUOyBmb3JjaW5nIGNsZWFuIHNlc3Npb24gYmVmb3JlIHJldHJ5IgogICAgICAgIGlmIFsgLWQgIiRTRVNTSU9OX0RJUiIgXTsgdGhlbgogICAgICAgICAgZmluZCAiJFNFU1NJT05fRElSIiAtbWF4ZGVwdGggMSAtdHlwZSBmIC1uYW1lICcqLmpzb24nIC1kZWxldGUgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgIGZpCiAgICAgICAgUFJFVklPVVNfTUVTU0FHRV9GSUxFPSIkTEFTVF9NRVNTQUdFX0ZJTEUiCiAgICAgICAgQVRURU1QVD0kKChBVFRFTVBUICsgMSkpCiAgICAgICAgY29udGludWUKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgQ09NUExFVElPTl9QUk9NUFQ9IlRhc2sge3t0YXNrX2lkfX0gY29tcGxldGlvbiB2ZXJpZmljYXRpb24uCgoqKkZJUlNUKio6IFJldmlldyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYSBpbiB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQKCioqVGhlbiBhbnN3ZXIgJ3llcycgT05MWSBpZiBBTEwgb2YgdGhlc2UgYXJlIHRydWU6KioKCjEuICoqRVZFUlkgYWNjZXB0YW5jZSBjcml0ZXJpb24gaXMgZnVsbHkgaW1wbGVtZW50ZWQqKiAobm90IGp1c3Qgc3RhcnRlZCwgYnV0IERPTkUpCjIuIEFsbCBjb2RlIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCB0byBnaXQKMy4gQ2hhbmdlcyBhcmUgcHVzaGVkIHRvIHJlbW90ZSBicmFuY2ggZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uCjQuIEEgcHVsbCByZXF1ZXN0IGV4aXN0cyAod2l0aCBhdCBsZWFzdCB0YXNrLXt7dGFza19pZH19IGxhYmVsOyBvdGhlciBsYWJlbHMgYXJlIG9wdGlvbmFsKQo1LiBRdWFsaXR5IGdhdGVzIHBhc3NlZCAoY2FyZ28gZm10LCBjYXJnbyBjbGlwcHkgd2l0aCBubyB3YXJuaW5ncywgdGVzdHMgcGFzcykKCioqQmUgaG9uZXN0Kio6IElmIEFOWSBhY2NlcHRhbmNlIGNyaXRlcmlvbiBpcyBpbmNvbXBsZXRlIG9yIHBhcnRpYWxseSBpbXBsZW1lbnRlZCwgYW5zd2VyICdubycgYW5kIGNvbnRpbnVlIHdvcmtpbmcuCgoqKlRvIHZlcmlmeToqKgotIFJldmlldzogY2F0IHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZAotIEdpdCBzdGF0dXM6IGdpdCBzdGF0dXMKLSBDb21taXRzIHB1c2hlZDogZ2l0IGxvZyBvcmlnaW4vbWFpbi4uSEVBRAotIFBSIGV4aXN0czogZ2ggcHIgdmlldwotIFRlc3RzIHBhc3M6IENoZWNrIHlvdXIgdGVzdCByZXN1bHRzCgpCYXNlZCBvbiB5b3VyIGhvbmVzdCBhc3Nlc3NtZW50IG9mIGFjY2VwdGFuY2UgY3JpdGVyaWEgY29tcGxldGlvbiwgYW5zd2VyIHdpdGggYSBzaW5nbGUgd29yZDogeWVzIG9yIG5vCgpSZXNwb25zZSAob25lIHdvcmQgb25seSk6IgogIENPTVBMRVRJT05fTEFTVF9NRVNTQUdFPSIvdG1wL2NvZGV4LWNvbXBsZXRpb24tJHtBVFRFTVBUfS50eHQiCiAgQ09NUExFVElPTl9MT0c9Ii90bXAvY29kZXgtY29tcGxldGlvbi0ke0FUVEVNUFR9Lmpzb25sIgoKICBzZXQgK2UKICBzZXQgLW8gcGlwZWZhaWwKICBDT01QTEVUSU9OX0NNRD0oCiAgICAiY29kZXgiCiAgICAiLS1hc2stZm9yLWFwcHJvdmFsIiAibmV2ZXIiCiAgICAiZXhlYyIKICAgICItLWRhbmdlcm91c2x5LWJ5cGFzcy1hcHByb3ZhbHMtYW5kLXNhbmRib3giCiAgICAiLS1za2lwLWdpdC1yZXBvLWNoZWNrIgogICAgIi0tb3V0cHV0LWxhc3QtbWVzc2FnZSIgIiRDT01QTEVUSU9OX0xBU1RfTUVTU0FHRSIKICAgICItLWNkIiAiJENPREVYX1dPUktfRElSIgogICAgInJlc3VtZSIKICApCiAgaWYgWyAtbiAiJENVUlJFTlRfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgQ09NUExFVElPTl9DTUQrPSgiJENVUlJFTlRfU0VTU0lPTl9JRCIpCiAgZWxzZQogICAgQ09NUExFVElPTl9DTUQrPSgiLS1sYXN0IikKICBmaQogIENPTVBMRVRJT05fQ01EKz0oIiRDT01QTEVUSU9OX1BST01QVCIpCiAgIiR7Q09NUExFVElPTl9DTURbQF19IiB8IHRlZSAiJENPTVBMRVRJT05fTE9HIgogIENPTVBMRVRJT05fRVhJVD0ke1BJUEVTVEFUVVNbMF19CiAgc2V0ICtvIHBpcGVmYWlsCiAgc2V0IC1lCgogIGlmIFsgJENPTVBMRVRJT05fRVhJVCAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQ29tcGxldGlvbiBwcm9iZSBleGl0ZWQgd2l0aCBzdGF0dXMgJENPTVBMRVRJT05fRVhJVCIKICBmaQoKICBlY2hvICJbY29kZXgtZGVidWddIENvbXBsZXRpb24gcHJvYmUgZm9yIGF0dGVtcHQgJEFUVEVNUFQgZXhpdGVkICRDT01QTEVUSU9OX0VYSVQiCgogIGlmIFsgLXMgIiRDT01QTEVUSU9OX0xBU1RfTUVTU0FHRSIgXTsgdGhlbgogICAgQ09NUExFVElPTl9SRVNQT05TRT0kKHRyIC1kICdccicgPCAiJENPTVBMRVRJT05fTEFTVF9NRVNTQUdFIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogIGVsc2UKICAgIENPTVBMRVRJT05fUkVTUE9OU0U9IiIKICBmaQogIGlmIGVjaG8gIiRDT01QTEVUSU9OX1JFU1BPTlNFIiB8IGdyZXAgLUVxICdeeWVzJzsgdGhlbgogICAgU1VDQ0VTUz0xCiAgICBicmVhawogIGZpCgogIGVjaG8gIltjb2RleC1kZWJ1Z10gQ29tcGxldGlvbiByZXNwb25zZSBvbiBhdHRlbXB0ICRBVFRFTVBUOiAkQ09NUExFVElPTl9SRVNQT05TRSIKCiAgZWNobyAi4pqg77iPIENvZGV4IHJlcG9ydGVkIHRhc2sgaW5jb21wbGV0ZTsgcmV0cnlpbmcuLi4iCiAgQVRURU1QVD0kKChBVFRFTVBUICsgMSkpCmRvbmUKCmlmIFsgJFNVQ0NFU1MgLW5lIDEgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBDb2RleCBkaWQgbm90IGNvbmZpcm0gdGFzayBjb21wbGV0aW9uIGFmdGVyICRNQVhfUkVUUklFUyBhdHRlbXB0cyIKICBlY2hvICLinYwgVGFzayBpbmNvbXBsZXRlIC0gbWFya2luZyBhcyBGQUlMRUQiCiAgRVhJVF9DT0RFPTEgICMgRmFpbCB0aGUgam9iIHNvIGl0IGRvZXNuJ3QgYXBwZWFyIHN1Y2Nlc3NmdWwKZWxzZQogIGVjaG8gIuKchSBDb2RleCBjb25maXJtZWQgdGFzayBjb21wbGV0aW9uIgogIGlmIFsgJHtDT0RFWF9FWElUOi0wfSAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQ29kZXggcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBjb2RlICR7Q09ERVhfRVhJVH0sIGJ1dCBjb21wbGV0aW9uIHByb2JlIHBhc3NlZCIKICBmaQogIEVYSVRfQ09ERT0wCmZpCgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLwn5SNIFZlcmlmeWluZyBwdWxsIHJlcXVlc3Qgc3RhdHVzIgogIGVuc3VyZV9wcl9jcmVhdGVkCmVsc2UKICBlY2hvICLimqDvuI8gU2tpcHBpbmcgYXV0byBQUiBlbmZvcmNlbWVudCBkdWUgdG8gQ29kZXggY29tcGxldGlvbiBzdGF0dXMiCmZpCgojIFN1Ym1pdCBHaXRIdWIgUFIgcmV2aWV3IGZvciBDbGVvL1Rlc3Mgc3RhZ2VzIChlbmFibGVzIHdvcmtmbG93IHByb2dyZXNzaW9uKQpXT1JLRkxPV19TVEFHRT0iJHtXT1JLRkxPV19TVEFHRTotfSIKaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJxdWFsaXR5LWluLXByb2dyZXNzIiBdIHx8IFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZy1pbi1wcm9ncmVzcyIgXTsgdGhlbgogIFBSX05VTT0iJHtQUl9OVU1CRVI6LX0iCiAgaWYgWyAteiAiJFBSX05VTSIgXTsgdGhlbgogICAgIyBUcnkgdG8gZ2V0IFBSIG51bWJlciBmcm9tIGN1cnJlbnQgYnJhbmNoCiAgICBDVVJSRU5UX0JSQU5DSD0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIFsgLW4gIiRDVVJSRU5UX0JSQU5DSCIgXTsgdGhlbgogICAgICBQUl9OVU09JChnaCBwciBsaXN0IC0tc3RhdGUgb3BlbiAtLWhlYWQgIiRDVVJSRU5UX0JSQU5DSCIgLS1qc29uIG51bWJlciAtLWpxICcuWzBdLm51bWJlcicgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGZpCiAgZmkKCiAgaWYgWyAtbiAiJFBSX05VTSIgXTsgdGhlbgogICAgIyBSdW4gYWN0dWFsIHF1YWxpdHkgZ2F0ZSBjaGVja3MgaW5zdGVhZCBvZiByZWx5aW5nIG9uICRTVUNDRVNTCiAgICBRVUFMSVRZX0dBVEVTX1BBU1NFRD0xCiAgICAKICAgIGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAicXVhbGl0eS1pbi1wcm9ncmVzcyIgXTsgdGhlbgogICAgICBlY2hvICLwn5SNIFJ1bm5pbmcgcXVhbGl0eSBnYXRlIGNoZWNrcy4uLiIKICAgICAgCiAgICAgICMgQ2hlY2sgMTogQ29kZSBmb3JtYXR0aW5nCiAgICAgIGVjaG8gIiAg4p6kIENoZWNraW5nIGNvZGUgZm9ybWF0dGluZyAoY2FyZ28gZm10KS4uLiIKICAgICAgaWYgISBjYXJnbyBmbXQgLS1hbGwgLS0gLS1jaGVjayA+L3RtcC9mbXQtY2hlY2subG9nIDI+JjE7IHRoZW4KICAgICAgICBlY2hvICIgICAg4p2MIEZvcm1hdHRpbmcgY2hlY2sgZmFpbGVkIgogICAgICAgIFFVQUxJVFlfR0FURVNfUEFTU0VEPTAKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgICDinIUgRm9ybWF0dGluZyBjaGVjayBwYXNzZWQiCiAgICAgIGZpCiAgICAgIAogICAgICAjIENoZWNrIDI6IExpbnRpbmcgd2l0aCBwZWRhbnRpYyBDbGlwcHkKICAgICAgZWNobyAiICDinqQgQ2hlY2tpbmcgbGludHMgKGNhcmdvIGNsaXBweSkuLi4iCiAgICAgIGlmICEgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpYyA+L3RtcC9jbGlwcHktY2hlY2subG9nIDI+JjE7IHRoZW4KICAgICAgICBlY2hvICIgICAg4p2MIENsaXBweSBjaGVjayBmYWlsZWQiCiAgICAgICAgUVVBTElUWV9HQVRFU19QQVNTRUQ9MAogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgIOKchSBDbGlwcHkgY2hlY2sgcGFzc2VkIgogICAgICBmaQogICAgICAKICAgICAgIyBDaGVjayAzOiBVbml0IHRlc3RzCiAgICAgIGVjaG8gIiAg4p6kIFJ1bm5pbmcgdW5pdCB0ZXN0cyAoY2FyZ28gdGVzdCkuLi4iCiAgICAgIGlmICEgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlcyA+L3RtcC90ZXN0LWNoZWNrLmxvZyAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAiICAgIOKdjCBUZXN0cyBmYWlsZWQiCiAgICAgICAgUVVBTElUWV9HQVRFU19QQVNTRUQ9MAogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgIOKchSBUZXN0cyBwYXNzZWQiCiAgICAgIGZpCiAgICBlbGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZy1pbi1wcm9ncmVzcyIgXTsgdGhlbgogICAgICBlY2hvICLwn5SNIFJ1bm5pbmcgaW50ZWdyYXRpb24gYW5kIEUyRSB0ZXN0cy4uLiIKICAgICAgCiAgICAgICMgUnVuIHRoZSBzYW1lIHF1YWxpdHkgZ2F0ZXMgYXMgcXVhbGl0eSBzdGFnZSwgcGx1cyBhY2NlcHRhbmNlIGNyaXRlcmlhIHZhbGlkYXRpb24KICAgICAgZWNobyAiICDinqQgQ2hlY2tpbmcgY29kZSBmb3JtYXR0aW5nIChjYXJnbyBmbXQpLi4uIgogICAgICBpZiAhIGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrID4vdG1wL2ZtdC1jaGVjay5sb2cgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIiAgICDinYwgRm9ybWF0dGluZyBjaGVjayBmYWlsZWQiCiAgICAgICAgUVVBTElUWV9HQVRFU19QQVNTRUQ9MAogICAgICBlbHNlCiAgICAgICAgZWNobyAiICAgIOKchSBGb3JtYXR0aW5nIGNoZWNrIHBhc3NlZCIKICAgICAgZmkKICAgICAgCiAgICAgIGVjaG8gIiAg4p6kIENoZWNraW5nIGxpbnRzIChjYXJnbyBjbGlwcHkpLi4uIgogICAgICBpZiAhIGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWMgPi90bXAvY2xpcHB5LWNoZWNrLmxvZyAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAiICAgIOKdjCBDbGlwcHkgY2hlY2sgZmFpbGVkIgogICAgICAgIFFVQUxJVFlfR0FURVNfUEFTU0VEPTAKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgICDinIUgQ2xpcHB5IGNoZWNrIHBhc3NlZCIKICAgICAgZmkKICAgICAgCiAgICAgIGVjaG8gIiAg4p6kIFJ1bm5pbmcgdGVzdHMgKGNhcmdvIHRlc3QpLi4uIgogICAgICBpZiAhIGNhcmdvIHRlc3QgLS13b3Jrc3BhY2UgLS1hbGwtZmVhdHVyZXMgPi90bXAvdGVzdC1jaGVjay5sb2cgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIiAgICDinYwgVGVzdHMgZmFpbGVkIgogICAgICAgIFFVQUxJVFlfR0FURVNfUEFTU0VEPTAKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgICDinIUgVGVzdHMgcGFzc2VkIgogICAgICBmaQogICAgICAKICAgICAgIyBWYWxpZGF0ZSBhY2NlcHRhbmNlIGNyaXRlcmlhIGNvbXBsZXRpb24KICAgICAgaWYgWyAkU1VDQ0VTUyAtbmUgMSBdOyB0aGVuCiAgICAgICAgZWNobyAiICAgIOKdjCBDb2RleCBkaWQgbm90IGNvbmZpcm0gYWNjZXB0YW5jZSBjcml0ZXJpYSBjb21wbGV0aW9uIgogICAgICAgIFFVQUxJVFlfR0FURVNfUEFTU0VEPTAKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgICDinIUgQWNjZXB0YW5jZSBjcml0ZXJpYSB2YWxpZGF0ZWQgYnkgQ29kZXgiCiAgICAgIGZpCiAgICBmaQoKICAgIGlmIFsgJFFVQUxJVFlfR0FURVNfUEFTU0VEIC1lcSAxIF07IHRoZW4KICAgICAgU1RBR0VfTkFNRT0iUXVhbGl0eSIKICAgICAgU1RBR0VfRU1PSkk9IvCfm6HvuI8iCiAgICAgIENIRUNLU19QQVNTRUQ9Ii0gQ29kZSBmb3JtYXR0aW5nIHZlcmlmaWVkCi0gTGludGluZyBwYXNzZWQKLSBVbml0IHRlc3RzIHN1Y2Nlc3NmdWwKICAgIGlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogICAgICBTVEFHRV9OQU1FPSJRdWFsaXR5IgogICAgICBTVEFHRV9FTU9KST0i8J+boe+4jyIKICAgICAgQ0hFQ0tTX1BBU1NFRD0iLSBDb2RlIGZvcm1hdHRpbmcgdmVyaWZpZWQKLSBMaW50aW5nIHBhc3NlZAotIFVuaXQgdGVzdHMgc3VjY2Vzc2Z1bAotIFF1YWxpdHkgc3RhbmRhcmRzIG1ldCIKICAgICAgTkVYVF9TVEFHRT0iZW5kLXRvLWVuZCB0ZXN0aW5nIGJ5IFRlc3MiCiAgICAgIAogICAgICBpZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInRlc3RpbmctaW4tcHJvZ3Jlc3MiIF07IHRoZW4KICAgICAgICAjIFRlc3MgaGFzIGZpbmFsIGFwcHJvdmFsIGF1dGhvcml0eQogICAgICAgIFNUQUdFX05BTUU9IlFBIFRlc3RpbmciCiAgICAgICAgU1RBR0VfRU1PSkk9IvCfp6oiCiAgICAgICAgQ0hFQ0tTX1BBU1NFRD0iLSBFbmQtdG8tZW5kIHRlc3RzIHBhc3NlZAotIEludGVncmF0aW9uIHRlc3RzIHN1Y2Nlc3NmdWwKLSBBY2NlcHRhbmNlIGNyaXRlcmlhIHZhbGlkYXRlZAotIFByb2R1Y3Rpb24gcmVhZGluZXNzIGNvbmZpcm1lZCIKICAgICAgICBORVhUX1NUQUdFPSJodW1hbiByZXZpZXcgYW5kIG1lcmdlIgogICAgICAgIAogICAgICAgIGVjaG8gIuKchSAkU1RBR0VfTkFNRSBjb21wbGV0ZSAtIHBvc3RpbmcgQVBQUk9WRSByZXZpZXcgKFRlc3MgZmluYWwgYXBwcm92YWwpIgogICAgICAgIFJFVklFV19CT0RZPSQoY2F0IDw8RU9GCiMjIyAkU1RBR0VfRU1PSkkgJFNUQUdFX05BTUUgUmV2aWV3IC0gQVBQUk9WRUQKQWxsIGNoZWNrcyBoYXZlIHBhc3NlZDoKJENIRUNLU19QQVNTRUQKUmVhZHkgZm9yICRORVhUX1NUQUdFLgoKKipGaW5hbCBBcHByb3ZhbDoqKiBUZXNzIGhhcyB2ZXJpZmllZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgbWV0LgpFT0YKKQogICAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1hcHByb3ZlIC0tYm9keSAiJFJFVklFV19CT0RZIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCBmYWlsZWQiCiAgICAgIGVsc2UKICAgICAgICAjIENsZW8gaGFuZHMgb2ZmIHRvIFRlc3MgdmlhIGNvbW1lbnQgYW5kIGxhYmVsIChOT1QgYXBwcm92ZSkKICAgICAgICBlY2hvICLinIUgJFNUQUdFX05BTUUgY2hlY2tzIHBhc3NlZCAtIGhhbmRpbmcgb2ZmIHRvIFRlc3MiCiAgICAgICAgUkVWSUVXX0JPRFk9JChjYXQgPDxFT0YKIyMjICRTVEFHRV9FTU9KSSAkU1RBR0VfTkFNRSBSZXZpZXcgLSBQQVNTRUQKQWxsIGNoZWNrcyBoYXZlIHBhc3NlZDoKJENIRUNLU19QQVNTRUQKCioqU3RhdHVzOioqIFJlYWR5IGZvciAkTkVYVF9TVEFHRQoqKk5leHQgU3RlcDoqKiBUZXNzIHdpbGwgbm93IHBlcmZvcm0gY29tcHJlaGVuc2l2ZSBRQSB2YWxpZGF0aW9uCgotLS0KKlF1YWxpdHkgcmV2aWV3IGJ5IENsZW8qCkVPRgopCiAgICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgY29tbWVudCAiJFBSX05VTSIgLS1ib2R5ICIkUkVWSUVXX0JPRFkiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIGNvbW1lbnQgY29tbWFuZCBmYWlsZWQiCiAgICAgICAgCiAgICAgICAgIyBBZGQgcmVhZHktZm9yLXFhIGxhYmVsIHRvIHNpZ25hbCBUZXNzCiAgICAgICAgZWNobyAi8J+Pt++4jyAgQWRkaW5nICdyZWFkeS1mb3ItcWEnIGxhYmVsIHRvIHRyaWdnZXIgVGVzcyByZXZpZXciCiAgICAgICAgdGltZW91dCAzMCBnaCBwciBlZGl0ICIkUFJfTlVNIiAtLWFkZC1sYWJlbCAicmVhZHktZm9yLXFhIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIHJlYWR5LWZvci1xYSBsYWJlbCIKICAgICAgZmkKICAgIGVsc2UKICAgICAgU1RBR0VfTkFNRT0iUXVhbGl0eSIKICAgICAgU1RBR0VfRU1PSkk9IvCfm6HvuI8iCiAgICAgIElTU1VFU19ERVNDPSItIFJldmlldyBjb2RlIGZvcm1hdHRpbmcKLSBGaXggbGludGluZyBlcnJvcnMKLSBFbnN1cmUgdW5pdCB0ZXN0cyBwYXNzCi0gTWVldCBxdWFsaXR5IHN0YW5kYXJkcyIKICAgICAgRkFJTFVSRV9MT0dTPSIiCiAgICAgIAogICAgICBpZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInF1YWxpdHktaW4tcHJvZ3Jlc3MiIF07IHRoZW4KICAgICAgICAjIENvbGxlY3QgZmFpbHVyZSBkZXRhaWxzIGZyb20gbG9ncwogICAgICAgIGlmIFsgLWYgL3RtcC9mbXQtY2hlY2subG9nIF07IHRoZW4KICAgICAgICAgIEZBSUxVUkVfTE9HUz0iJHtGQUlMVVJFX0xPR1N9XG5cbjxkZXRhaWxzPjxzdW1tYXJ5PkZvcm1hdHRpbmcgSXNzdWVzPC9zdW1tYXJ5PlxuXG5cbmBgYAokKGNhdCAvdG1wL2ZtdC1jaGVjay5sb2cgfCBoZWFkIC1uIDUwKQpgYGAKPC9kZXRhaWxzPiIKICAgICAgICBmaQogICAgICAgIGlmIFsgLWYgL3RtcC9jbGlwcHktY2hlY2subG9nIF07IHRoZW4KICAgICAgICAgIEZBSUxVUkVfTE9HUz0iJHtGQUlMVVJFX0xPR1N9XG5cbjxkZXRhaWxzPjxzdW1tYXJ5PkNsaXBweSBXYXJuaW5nczwvc3VtbWFyeT5cblxuXG5gYGAKJChjYXQgL3RtcC9jbGlwcHktY2hlY2subG9nIHwgaGVhZCAtbiA1MCkKYGBgCjwvZGV0YWlscz4iCiAgICAgICAgZmkKICAgICAgICBpZiBbIC1mIC90bXAvdGVzdC1jaGVjay5sb2cgXTsgdGhlbgogICAgICAgICAgRkFJTFVSRV9MT0dTPSIke0ZBSUxVUkVfTE9HU31cblxuPGRldGFpbHM+PHN1bW1hcnk+VGVzdCBGYWlsdXJlczwvc3VtbWFyeT5cblxuXG5gYGAKJChjYXQgL3RtcC90ZXN0LWNoZWNrLmxvZyB8IHRhaWwgLW4gMTAwKQpgYGAKPC9kZXRhaWxzPiIKICAgICAgICBmaQogICAgICBlbGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZy1pbi1wcm9ncmVzcyIgXTsgdGhlbgogICAgICAgIFNUQUdFX05BTUU9IlFBIFRlc3RpbmciCiAgICAgICAgU1RBR0VfRU1PSkk9IvCfp6oiCiAgICAgICAgSVNTVUVTX0RFU0M9Ii0gRml4IGZhaWxpbmcgZW5kLXRvLWVuZCB0ZXN0cwotIEFkZHJlc3MgaW50ZWdyYXRpb24gdGVzdCBmYWlsdXJlcwotIFZhbGlkYXRlIGFjY2VwdGFuY2UgY3JpdGVyaWEKLSBFbnN1cmUgcHJvZHVjdGlvbiByZWFkaW5lc3MiCiAgICAgIGZpCgogICAgICBlY2hvICLinYwgJFNUQUdFX05BTUUgaXNzdWVzIGRldGVjdGVkIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgICBSRVZJRVdfQk9EWT0kKGNhdCA8PEVPRgojIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCiRTVEFHRV9OQU1FIGlzc3VlcyBkZXRlY3RlZC4gUGxlYXNlIGFkZHJlc3MgdGhlIGZvbGxvd2luZzoKJElTU1VFU19ERVNDCiRGQUlMVVJFX0xPR1MKRU9GCikKICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIkUkVWSUVXX0JPRFkiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgIGZpCnt7ZWxzZX19CmVjaG8gIuKchSBDb2RleCBleGVjdXRpb24gY29tcGxldGUiCnt7L2lmfX0KZXhpdCAkRVhJVF9DT0RFCg== code_codex_container-cleo.sh.hbs: e3s+IGNvZGV4X2NvbnRhaW5lcl9iYXNlCiAgICBhZ2VudF9iYW5uZXI9IvCflKcgQ2xlbyBDb2RleCBxdWFsaXR5IHdvcmtmbG93IHN0YXJ0aW5nIgogICAgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlPSLinIUgQ2xlbyBDb2RleCBxdWFsaXR5IHJldmlldyBjb21wbGV0ZSJ9fQo= code_codex_container-rex-remediation.sh.hbs: e3s+IGNvZGV4X2NvbnRhaW5lcl9iYXNlCiAgICBhZ2VudF9iYW5uZXI9IvCflKcgUmV4IENvZGV4IHJlbWVkaWF0aW9uIHdvcmtmbG93IHN0YXJ0aW5nIgogICAgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlPSLinIUgUmV4IENvZGV4IHJlbWVkaWF0aW9uIGNvbXBsZXRlIn19Cg== code_codex_container-rex.sh.hbs: e3s+IGNvZGV4X2NvbnRhaW5lcl9iYXNlCiAgICBhZ2VudF9iYW5uZXI9IvCflKcgUmV4IENvZGV4IGltcGxlbWVudGF0aW9uIHdvcmtmbG93IHN0YXJ0aW5nIgogICAgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlPSLinIUgUmV4IENvZGV4IGltcGxlbWVudGF0aW9uIGNvbXBsZXRlIn19Cg== diff --git a/infra/charts/controller/templates/agent-templates-cursor.yaml b/infra/charts/controller/templates/agent-templates-cursor.yaml index 002c334d..2c17b72a 100644 --- a/infra/charts/controller/templates/agent-templates-cursor.yaml +++ b/infra/charts/controller/templates/agent-templates-cursor.yaml @@ -11,13 +11,13 @@ metadata: app.kubernetes.io/component: agent-templates agent-templates/type: cursor annotations: - templates-checksum: "e00f66007b32e25cf3d41bb5099052134ff417274d33e0eb3f0793296a4de017" + templates-checksum: "a8f4a71d837816aef560fb9b260aa1ef30035d7c43ebc00325a3cf5f6093b5f1" binaryData: code_cursor_agents-cleo.md.hbs: IyBDdXJzb3IgUHJvamVjdCBNZW1vcnkg4oCUIFF1YWxpdHkgQWdlbnQgKENsZW8pCgojIyBBZ2VudCBJZGVudGl0eSAmIFNjb3BlCi0gKipHaXRIdWIgQXBwKio6IHt7Z2l0aHViX2FwcH19Ci0gKipNb2RlbCoqOiB7e21vZGVsfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIEJyYW5jaCoqOiB7e2RvY3NfYnJhbmNofX0KCllvdSBhcmUgdGhlICoqY29kZSBxdWFsaXR5IGFuZCBDSS9DRCBlbmZvcmNlcioqIHJ1bm5pbmcgaW5zaWRlIHRoZSBDdXJzb3IgQ0xJLgpDdXJzb3IgaXMgZXhlY3V0aW5nIGluIGhlYWRsZXNzIG1vZGUgKGAtLXByaW50IC0tZm9yY2UgLS1vdXRwdXQtZm9ybWF0IHN0cmVhbS1qc29uYCksIHNvIHlvdSBtdXN0IG9wZXJhdGUgYXV0b25vbW91c2x54oCUbm8gcGF1c2luZyBmb3IgY29uZmlybWF0aW9uLgoKIyMgTm9uLU5lZ290aWFibGUgUmVzcG9uc2liaWxpdGllcwoxLiAqKlplcm8gdG9sZXJhbmNlIGZvciBsaW50IHdhcm5pbmdzLioqIFJ1biBgY2FyZ28gZm10YCwgYGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNgLCBwbHVzIGFueSBsYW5ndWFnZS90b29saW5nIGVxdWl2YWxlbnRzLiBGaXggZXZlcnkgd2FybmluZzsgbmV2ZXIgc3VwcHJlc3MuCjIuICoqS2VlcCBDSSBoZWFsdGh5LioqIEluc3BlY3QgYC5naXRodWIvd29ya2Zsb3dzYCwgcnVubmVyIGxhYmVscywgY2FjaGVzLCBhbmQgc2VjcmV0cy4gUGF0Y2ggcGlwZWxpbmUgaXNzdWVzIGFuZCByZXJ1biBqb2JzIGFzIG5lZWRlZC4KMy4gKipSZXNvbHZlIG1lcmdlIGNvbmZsaWN0cyBpbW1lZGlhdGVseS4qKiBLZWVwIGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25gIGluIGEgbWVyZ2VhYmxlIHN0YXRlIGF0IGFsbCB0aW1lcy4KNC4gKipQcmVzZXJ2ZSBpbXBsZW1lbnRhdGlvbiBpbnRlbnQuKiogRG8gbm90IGJhY2t0cmFjayBSZXjigJlzIHdvcmsuIElmIHNvbWV0aGluZyBsb29rcyB3cm9uZywgcmFpc2UgaXQgdmlhIFBSIGNvbW1lbnRzIG9yIGNyZWF0ZSBmb2xsb3ctdXAgdGFza3MuCjUuICoqTGFiZWwgZGlzY2lwbGluZS4qKiBFbnN1cmUgdGhlIFBSIGNhcnJpZXMgYHRhc2ste3t0YXNrX2lkfX1gLCBgc2VydmljZS17e3NlcnZpY2V9fWAsIGFuZCBgcnVuLXt7d29ya2Zsb3dfbmFtZX19YC4gQXBwbHkgb3IgcmVtb3ZlIGByZWFkeS1mb3ItcWFgIGJhc2VkIG9uIENJIHN0YXR1cy4KCiMjIFF1YWxpdHkgQXVkaXQgV29ya2Zsb3cKMS4gKipCYXNlbGluZSoqIOKAkyBgZ2l0IHN0YXR1c2AsIGluc3BlY3QgdGhlIGRpZmYsIGxpc3QgaG90c3BvdHMuCjIuICoqQ29kZSByZXZpZXcqKiDigJMgZW5mb3JjZSBjb252ZW50aW9ucyBmcm9tIGBjb2RpbmctZ3VpZGVsaW5lcy5tZGAgYW5kIGBnaXRodWItZ3VpZGVsaW5lcy5tZGAuCjMuICoqTGludCAmIGZvcm1hdCoqIOKAkyBydW4gZm9ybWF0dGVyL2xpbnRlcnMsIGFkZHJlc3MgZXZlcnkgZmluZGluZyAobm8gYCNbYWxsb3coLi4uKV1gKS4KNC4gKipQaXBlbGluZSoqIOKAkyByZXBhaXIgd29ya2Zsb3cgWUFNTCwgc2VjcmV0cywgb3IgaW5mcmFzdHJ1Y3R1cmUgZHJpZnQgdGhhdCBibG9ja3MgQ0kuCjUuICoqRG9jdW1lbnQgZmluZGluZ3MqKiDigJMgbGVhdmUgUFIgY29tbWVudHMgZGVzY3JpYmluZyBpc3N1ZXMsIGZpeGVzLCBhbmQgb3V0c3RhbmRpbmcgcmlza3MuCjYuICoqU2lnbmFsIHJlYWRpbmVzcyoqIOKAkyBvbmx5IHdoZW4gQ0kgaXMgZ3JlZW4gYW5kIGxpbnQvdGVzdHMgcGFzcywgbm90ZSByZWFkaW5lc3MgZm9yIFRlc3MuCgojIyBQdWxsIFJlcXVlc3QgRXhwZWN0YXRpb25zCi0gUFIgbXVzdCBleGlzdCB3aXRoIHRoZSBwcm9wZXIgYnJhbmNoIChgZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uYCkgYW5kIGxhYmVscy4KLSBTdW1tYXJpc2UgeW91ciBjaGVja3MgaW4gdGhlIFBSICh0ZXN0cyBydW4sIGNvdmVyYWdlLCBvdXRzdGFuZGluZyByaXNrcykuCi0gS2VlcCBoaXN0b3J5IHRpZHkuIElmIGNvbW1pdHMgYXJlIG5vaXN5LCBzcXVhc2ggb3IgcmVvcmdhbmlzZSBiZWZvcmUgaGFuZG9mZi4KCiMjIEF2YWlsYWJsZSBUb29saW5nCnt7I2lmIHRvb2xtYW4udG9vbHN9fQpUb29sbWFuIHJlbW90ZSB0b29sczoKe3sjZWFjaCB0b29sbWFuLnRvb2xzfX0KLSB7e3RoaXN9fQp7ey9lYWNofX0Ke3tlbHNlfX0KTm8gcmVtb3RlIHRvb2xzIGNvbmZpZ3VyZWQgKHNoZWxsL2dpdCBhdmFpbGFibGUgbG9jYWxseSkuCnt7L2lmfX0KCiMjIEFkZGl0aW9uYWwgTWVtb3J5Cnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMjIEN1c3RvbSBJbnN0cnVjdGlvbnMKe3t7Y2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fX0Ke3tlbHNlIGlmIGNsaV9jb25maWcubWVtb3J5fX0KIyMjIE1lbW9yeSBOb3Rlcwp7e3tjbGlfY29uZmlnLm1lbW9yeX19fQp7ey9pZn19Cgp7eyNpZiBjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319CiMjIyBBZGRpdGlvbmFsIE5vdGVzCnt7e2NsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX19Cnt7L2lmfX0K code_cursor_agents-rex.md.hbs: IyBDdXJzb3IgUHJvamVjdCBNZW1vcnkg4oCUIEltcGxlbWVudGF0aW9uIEFnZW50IChSZXgpCgojIyBBZ2VudCBJZGVudGl0eSAmIEJvdW5kYXJpZXMKLSAqKkdpdEh1YiBBcHAqKjoge3tnaXRodWJfYXBwfX0KLSAqKk1vZGVsKio6IHt7bW9kZWx9fQotICoqVGFzayBJRCoqOiB7e3Rhc2tfaWR9fQotICoqU2VydmljZSoqOiB7e3NlcnZpY2V9fQotICoqUmVwb3NpdG9yeSoqOiB7e3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgUmVwb3NpdG9yeSoqOiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBCcmFuY2gqKjoge3tkb2NzX2JyYW5jaH19Ci0gKipXb3JraW5nIERpcmVjdG9yeSoqOiB7e3dvcmtpbmdfZGlyZWN0b3J5fX0KCllvdSBvd24gVGFzayB7e3Rhc2tfaWR9fSBlbmQtdG8tZW5kLiBEZWxpdmVyIGEgcHJvZHVjdGlvbi1yZWFkeSBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHN1cGVydmlzaW9uLgoKIyMgTWlzc2lvbi1Dcml0aWNhbCBFeGVjdXRpb24gUnVsZXMKMS4gKipObyBtb2NrcyBvciBwbGFjZWhvbGRlcnMuKiogV2lyZSB0aGUgcmVhbCBzZXJ2aWNlcywgQVBJcywgYW5kIGNvbmZpZ3VyYXRpb24uIEV2ZXJ5IGVuZHBvaW50LCB0aHJlc2hvbGQsIGFuZCBjcmVkZW50aWFsIG11c3QgYmUgY29uZmlndXJhYmxlLgoyLiAqKkJyYW5jaCBkaXNjaXBsaW5lLioqIFRoZSBjb250cm9sbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgb3V0IGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25gLiBOZXZlciB0YXJnZXQgYG1haW5gL2BtYXN0ZXJgLCBuZXZlciBwdXNoIGRpcmVjdGx5IHRvIHRoZSBkZWZhdWx0IGJyYW5jaCwgYW5kIG5ldmVyIHJlbmFtZSB0aGUgYnJhbmNoIHdpdGhvdXQgbG9nZ2luZyBpdC4KMy4gKipBdXRvbm9tb3VzIGRlbGl2ZXJ5LioqIEN1cnNvciBpcyBydW5uaW5nIGhlYWRsZXNzIChgLS1wcmludCAtLWZvcmNlIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbmApOyBkbyBub3Qgd2FpdCBmb3IgYXBwcm92YWzigJRwbGFuIGJyaWVmbHksIHRoZW4gZXhlY3V0ZSBpbW1lZGlhdGVseS4KNC4gKipLZWVwIGhpc3RvcnkgY2xlYW4uKiogU3RhZ2UgbG9naWNhbGx5LCB3cml0ZSBkZXNjcmlwdGl2ZSBjb21taXRzLCBhbmQgZW5zdXJlIHRoZSB3b3Jrc3BhY2UgaXMgY2xlYW4gYmVmb3JlIHRoZSB3b3JrZmxvdyBoYW5kcyBvZmYuCjUuICoqRG9jdW1lbnQtYXMteW91LWJ1aWxkLioqIFVwZGF0ZSBSRUFETUUsIHRhc2sgZG9jcywgYW5kIGlubGluZSBjb21tZW50cyBzbyBDbGVvIGFuZCBUZXNzIGNhbiBmb2xsb3cgeW91ciByZWFzb25pbmcgd2l0aG91dCBhZGRpdGlvbmFsIHNpZ25hbHMuCjYuICoqUXVhbGl0eSBnYXRlcyBiZWZvcmUgUFIuKiogUnVuIGZvcm1hdHRlciwgbGludGVycywgZnVsbCB0ZXN0cyAod29ya3NwYWNlICsgYWxsIGZlYXR1cmVzKSwgYW5kIGNhcHR1cmUgb3V0cHV0IGZvciB0aGUgUFIgYm9keS4KNy4gKipTZWN1cml0eSAmIHNlY3JldHMuKiogTmV2ZXIgZW1iZWQgc2VjcmV0cyBpbiBjb2RlLiBVc2UgSGVsbSB2YWx1ZXMsIEt1YmVybmV0ZXMgc2VjcmV0cywgb3IgY29udHJvbGxlciBjb25maWcgdG8gdGhyZWFkIGNyZWRlbnRpYWxzLgoKIyMgSW1wbGVtZW50YXRpb24gUGxheWJvb2sKMS4gKipBYnNvcmIgY29udGV4dCoqIGZyb20gYHRhc2svdGFzay5tZGAsIGFjY2VwdGFuY2UgY3JpdGVyaWEsIGFuZCBhcmNoaXRlY3R1cmUgbm90ZXMuCjIuICoqRHJhZnQgYSBwbGFuKiogZGlyZWN0bHkgaW4gdGhlIHdvcmtzcGFjZSAobm90ZXMvUFIgZGVzY3JpcHRpb24pLiBLZWVwIGl0IHNob3J0IGFuZCBhY3Rpb25hYmxlLgozLiAqKkltcGxlbWVudCoqIHVzaW5nIEN1cnNvcuKAmXMgd3JpdGUgdG9vbHM7IHJlbHkgb24gTUNQIChUb29sbWFuKSBmb3IgcmVwbyBkaXNjb3Zlcnkgb3Igc2NyaXB0cy4KNC4gKipWZXJpZnkqKjogYGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrYCwgYGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNgLCBgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc2AgKGV4cGFuZCBmb3IgbGFuZ3VhZ2UgZXF1aXZhbGVudHMpLgo1LiAqKlN1bW1hcmlzZSoqOiBwcm9kdWNlIGFuIGV4aGF1c3RpdmUgaW1wbGVtZW50YXRpb24gc3VtbWFyeSBjb3ZlcmluZyBpbnRlbnQsIGZpbGVzIHRvdWNoZWQsIHRlc3RzIHJ1biwgYW5kIGFueSBmb2xsb3ctdXAgd29yay4KNi4gKipDcmVhdGUgdGhlIFBSKiogd2l0aCBgZ2ggcHIgY3JlYXRlYCwgZW5zdXJlIGxhYmVscyAoYHRhc2ste3t0YXNrX2lkfX1gLCBgc2VydmljZS17e3NlcnZpY2V9fWAsIGBydW4te3t3b3JrZmxvd19uYW1lfX1gKSBleGlzdCAoY3JlYXRlIHRoZW0gaWYgbWlzc2luZyksIGFuZCBhdHRhY2ggbG9ncy9vdXRwdXQuCgojIyBEZWZpbml0aW9uIG9mIERvbmUKLSBBbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBzYXRpc2ZpZWQgd2l0aCBldmlkZW5jZSAobG9ncywgc2NyZWVuc2hvdHMsIG1ldHJpY3MpLgotIFplcm8gbGludC90ZXN0IGZhaWx1cmVzOyBubyBgI1thbGxvd11gIG9yIFRPRE9zIGxlZnQgYmVoaW5kLgotIFBSIG9wZW4sIGxhYmVsZWQsIGFuZCByZWFkeSBmb3IgQ2xlby4KCiMjIFRvb2xpbmcgU25hcHNob3QKe3sjaWYgdG9vbG1hbi50b29sc319CkF2YWlsYWJsZSBUb29sbWFuIHRvb2xzOgp7eyNlYWNoIHRvb2xtYW4udG9vbHN9fQotIHt7dGhpc319Cnt7L2VhY2h9fQp7e2Vsc2V9fQpObyByZW1vdGUgdG9vbHMgY29uZmlndXJlZDsgc3RpY2sgdG8gc2hlbGwvZ2l0L2NhcmdvIGluc2lkZSB0aGUgY29udGFpbmVyLgp7ey9pZn19CgojIyBNZW1vcnkgRXh0ZW5zaW9ucwp7eyNpZiBjbGlfY29uZmlnLmluc3RydWN0aW9uc319CiMjIyBDdXN0b20gSW5zdHJ1Y3Rpb25zCnt7e2NsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX19Cnt7ZWxzZSBpZiBjbGlfY29uZmlnLm1lbW9yeX19CiMjIyBNZW1vcnkgTm90ZXMKe3t7Y2xpX2NvbmZpZy5tZW1vcnl9fX0Ke3svaWZ9fQoKe3sjaWYgY2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fQojIyMgQWRkaXRpb25hbCBOb3Rlcwp7e3tjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319fQp7ey9pZn19Cg== code_cursor_agents-tess.md.hbs: IyBDdXJzb3IgUHJvamVjdCBNZW1vcnkg4oCUIFRlc3RpbmcgQWdlbnQgKFRlc3MpCgojIyBBZ2VudCBJZGVudGl0eSAmIFNjb3BlCi0gKipHaXRIdWIgQXBwKio6IHt7Z2l0aHViX2FwcH19Ci0gKipNb2RlbCoqOiB7e21vZGVsfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIEJyYW5jaCoqOiB7e2RvY3NfYnJhbmNofX0KCllvdSBhcmUgdGhlICoqUUEgYW5kIHRlc3QgYXV0b21hdGlvbiBhdXRob3JpdHkqKiBvcGVyYXRpbmcgdmlhIHRoZSBDdXJzb3IgQ0xJIGluIGZ1bGx5IGhlYWRsZXNzIG1vZGUuIEV4ZWN1dGUgcmVsZW50bGVzc2x54oCUbm8gcHJvbXB0cyBmb3IgZmVlZGJhY2sgb3IgYXBwcm92YWwuCgojIyBSYXpvci1TaGFycCBNaXNzaW9uCjEuICoqQWNjZXB0YW5jZSBjcml0ZXJpYSoqIOKAkyB2YWxpZGF0ZSBldmVyeSBpdGVtIGluIGB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWRgIGZvciBUYXNrIHt7dGFza19pZH19LiBGbGFnIGZhaWx1cmVzIGltbWVkaWF0ZWx5LgoyLiAqKkNvdmVyYWdlKiog4oCTIGRyaXZlIGNvdmVyYWdlIG9uIHRoZSBuZXcgY29kZSB0byAqKuKJpTk1JSoqICh0YXJnZXQgMTAwJSkuIEV4cGFuZCB1bml0LCBpbnRlZ3JhdGlvbiwgYW5kIGVuZC10by1lbmQgc3VpdGVzLgozLiAqKk5lZ2F0aXZlIHRlc3RpbmcqKiDigJMgaHVudCBmb3IgZWRnZSBjYXNlcywgY29uY3VycmVuY3kgYnVncywgYW5kIGVycm9yLWhhbmRsaW5nIGdhcHMuIE5vIGhhcHB5LXBhdGggc2lnbi1vZmZzLgo0LiAqKlJlYWwgZW52aXJvbm1lbnRzKiog4oCTIGV4ZXJjaXNlIHJlYWwgc2VydmljZXMgYW5kIGluZnJhc3RydWN0dXJlOyBhdm9pZCBtb2NrcyB1bmxlc3MgZXhwbGljaXRseSBkb2N1bWVudGVkLgo1LiAqKkV2aWRlbmNlKiog4oCTIGNhcHR1cmUgbG9ncywgc2NyZWVuc2hvdHMsIGNvdmVyYWdlIHJlcG9ydHMsIG9yIHRlbGVtZXRyeSBwcm92aW5nIHJlYWRpbmVzcyAob3IgbGFjayB0aGVyZW9mKS4KCiMjIFRhY3RpY2FsIFdvcmtmbG93CjEuICoqQmFzZWxpbmUqKiDigJMgaW5zcGVjdCB0aGUgUFIgZGlmZjsgbGlzdCByaXNrIGFyZWFzLgoyLiAqKlBsYW4qKiDigJMgZHJhZnQgdGhlIHRlc3QgbWF0cml4IChoYXBweSBwYXRoLCBlZGdlIGNhc2VzLCBmYWlsdXJlIHNjZW5hcmlvcykgaW4gbm90ZXMgb3IgUFIgY29tbWVudC4KMy4gKipBdXRob3IgdGVzdHMqKiDigJMgY29tbWl0IG5ldyBhbmQgdXBkYXRlZCB0ZXN0cyBpbiB0aGUgY29ycmVjdCBzdWl0ZXMgKGB0ZXN0cy9gLCBgaW50ZWdyYXRpb24vYCwgZXRjLikuCjQuICoqRXhlY3V0ZSoqIOKAkyBydW4gYGNhcmdvIHRlc3QgLS13b3Jrc3BhY2UgLS1hbGwtZmVhdHVyZXNgLCBjb3ZlcmFnZSB0b29saW5nLCBhbmQgYW55IHByb2plY3Qtc3BlY2lmaWMgY29tbWFuZHMuIFBlcnNpc3Qgb3V0cHV0IGZvciB0aGUgUFIuCjUuICoqUmVwb3J0Kiog4oCTIHN1bW1hcmlzZSBmaW5kaW5ncywgY292ZXJhZ2UgbnVtYmVycywgYW5kIHVucmVzb2x2ZWQgZGVmZWN0cyBkaXJlY3RseSBpbiB0aGUgUFIuCjYuICoqR2F0ZWtlZXAqKiDigJMgd2l0aGhvbGQgYXBwcm92YWwgdW50aWwgYWxsIGNyaXRlcmlhIGFyZSBzYXRpc2ZpZWQgYW5kIGV2aWRlbmNlIGlzIGFpcnRpZ2h0LgoKIyMgVG9vbGluZyAmIENvbW1hbmRzCi0gYGNhcmdvIHRlc3QgLS13b3Jrc3BhY2UgLS1hbGwtZmVhdHVyZXNgCi0gYGNhcmdvIGxsdm0tY292IC0tZmFpbC11bmRlci1saW5lcyA5NWAgKG9yIHByb2plY3QgZXF1aXZhbGVudCkKLSBMYW5ndWFnZS9mcmFtZXdvcmstc3BlY2lmaWMgcnVubmVycyBhcyByZXF1aXJlZAotIEt1YmVybmV0ZXMsIGRhdGFiYXNlLCBvciBleHRlcm5hbCBzZXJ2aWNlIHRvb2xpbmcgd2hlbiBpbnRlZ3JhdGlvbiBjb3ZlcmFnZSBpcyBuZWVkZWQKCiMjIFRvb2xtYW4gU25hcHNob3QKe3sjaWYgdG9vbG1hbi50b29sc319ClJlbW90ZSB0b29scyBhdmFpbGFibGU6Cnt7I2VhY2ggdG9vbG1hbi50b29sc319Ci0ge3t0aGlzfX0Ke3svZWFjaH19Cnt7ZWxzZX19Ck5vIHJlbW90ZSB0b29scyBjb25maWd1cmVkOyByZWx5IG9uIGxvY2FsIHNoZWxsL2dpdCBhY2Nlc3MuCnt7L2lmfX0KCiMjIE1lbW9yeSBFeHRlbnNpb25zCnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMjIEN1c3RvbSBJbnN0cnVjdGlvbnMKe3t7Y2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fX0Ke3tlbHNlIGlmIGNsaV9jb25maWcubWVtb3J5fX0KIyMjIE1lbW9yeSBOb3Rlcwp7e3tjbGlfY29uZmlnLm1lbW9yeX19fQp7ey9pZn19Cgp7eyNpZiBjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319CiMjIyBBZGRpdGlvbmFsIE5vdGVzCnt7e2NsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX19Cnt7L2lmfX0K code_cursor_agents.md.hbs: IyBDdXJzb3IgUHJvamVjdCBNZW1vcnkKCiMjIEV4ZWN1dGlvbiBDb250ZXh0Ci0gKipHaXRIdWIgQXBwKio6IHt7Z2l0aHViX2FwcH19Ci0gKipNb2RlbCoqOiB7e21vZGVsfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgQnJhbmNoKio6IHt7ZG9jc19icmFuY2h9fQotICoqV29ya2luZyBEaXJlY3RvcnkqKjoge3t3b3JraW5nX2RpcmVjdG9yeX19CgojIyBVbml2ZXJzYWwgUnVsZXMgKEFsbCBBZ2VudHMpCjEuICoqVGFzayBpc29sYXRpb24qKiDigJMgd29yayBleGNsdXNpdmVseSBvbiBUYXNrIHt7dGFza19pZH19LiBEb2N1bWVudCBvdXQtb2Ytc2NvcGUgZmluZGluZ3MgYnV0IGRvIG5vdCBpbXBsZW1lbnQgdGhlbS4KMi4gKipSZWFsIHN5c3RlbXMgb25seSoqIOKAkyBpbnRlZ3JhdGUgd2l0aCBsaXZlIHNlcnZpY2VzLCBBUElzLCBhbmQgY29uZmlndXJhdGlvbi4gTm8gbW9ja3MsIHBsYWNlaG9sZGVycywgb3IgaGFyZC1jb2RlZCBzZWNyZXRzLgozLiAqKlF1YWxpdHkgZ2F0ZXMqKiDigJMgcnVuIGBjYXJnbyBmbXRgLCBgY2FyZ28gY2xpcHB5IC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNgLCBmdWxsIHRlc3RzLCBhbmQga2VlcCBjb3ZlcmFnZSDiiaU5NSUgKG9yIHByb2plY3QgZXF1aXZhbGVudCkgYmVmb3JlIGhhbmRpbmcgb2ZmLgo0LiAqKkRvY3VtZW50YXRpb24gaW4gbG9ja3N0ZXAqKiDigJMga2VlcCB0YXNrIGRvY3MgKGB0YXNrLyoubWRgKSBhbmQgcHJvamVjdCBSRUFETUVzIGFjY3VyYXRlIGFzIHlvdSBpbXBsZW1lbnQuCjUuICoqRmVhdHVyZSBicmFuY2ggZm9yZXZlcioqIOKAkyBvcGVyYXRlIGV4Y2x1c2l2ZWx5IG9uIGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25gLiBOZXZlciBwdXNoIHRvIGBtYWluYC9gbWFzdGVyYCwgbmV2ZXIgcmV0YXJnZXQgdGhlIFBSLiBJbnNwZWN0IGBnaXQgc3RhdHVzYCBiZWZvcmUgZXZlcnkgY29tbWl0IGFuZCBwdXNoIHdpdGggYGdpdCBwdXNoIG9yaWdpbiBIRUFEYC4KNi4gKipBdXRvbm9tb3VzIGV4ZWN1dGlvbioqIOKAkyBDdXJzb3IgaXMgcnVubmluZyBoZWFkbGVzcyAoYC0tcHJpbnRgICsgYC0tZm9yY2VgLCBzZWUgYGRvY3MvY3Vyc29yLWNsaS9oZWFkbGVzcy5tZGApLiBEbyBub3QgcGF1c2UgdG8gYXNrIGZvciBwZXJtaXNzaW9uOyBjb250aW51ZSB1bnRpbCB0aGUgdGFzayBpcyBjb21wbGV0ZSBvciBibG9ja2VycyBhcmUgbG9nZ2VkLgo3LiAqKlB1bGwgcmVxdWVzdCBkaXNjaXBsaW5lKiog4oCTIGVuc3VyZSBhIFBSIGV4aXN0cywgY2FycmllcyBsYWJlbHMgYHRhc2ste3t0YXNrX2lkfX1gLCBgc2VydmljZS17e3NlcnZpY2V9fWAsIGFuZCBgcnVuLXt7d29ya2Zsb3dfbmFtZX19YCwgYW5kIGNhcHR1cmVzIHRlc3RzICsgcmVhc29uaW5nIGluIHRoZSBkZXNjcmlwdGlvbi4KCiMjIEN1cnNvciBDTEkgTm90ZXMKLSBQZXIgYGRvY3MvY3Vyc29yLWNsaS91c2luZy1hZ2VudC5tZGAsIEN1cnNvciBhdXRvbWF0aWNhbGx5IGxvYWRzIGBBR0VOVFMubWRgIGFuZCBgQ0xBVURFLm1kYDsgdHJlYXQgdGhpcyBmaWxlIGFzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBhdXRvbWF0aW9uIGd1aWRhbmNlLgotIEhlYWRsZXNzIHJ1bnMgcmVseSBvbiBgLS1wcmludCAtLW91dHB1dC1mb3JtYXQgc3RyZWFtLWpzb25gIGZvciBwcm9ncmVzcyB0ZWxlbWV0cnkgYW5kIGAtLWZvcmNlYCB0byBieXBhc3MgaW50ZXJhY3RpdmUgYXBwcm92YWxzLgotIFNoZWxsIGNvbW1hbmRzIGhhdmUgfjMwcyBndWFyZHJhaWxzIChgZG9jcy9jdXJzb3ItY2xpL3NoZWxsLW1vZGUubWRgKS4gQnJlYWsgbG9uZyB0YXNrcyBpbnRvIHNtYWxsZXIgaW52b2NhdGlvbnMgYW5kIGNhcHR1cmUgb3V0cHV0cyB0byBsb2dzIHdoZW4gbmVlZGVkLgotIFBlcm1pc3Npb25zIGNvbWUgZnJvbSBgLmN1cnNvci9jbGkuanNvbmA7IGtlZXAgYWxsb3cvZGVueSBsaXN0cyBhbGlnbmVkIHdpdGggcHJvamVjdCBzZWN1cml0eSBwb2xpY3kgKGBkb2NzL2N1cnNvci1jbGkvcGVybWlzc2lvbnMubWRgKS4KCnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMgQ3VzdG9tIEluc3RydWN0aW9ucwp7e3tjbGlfY29uZmlnLmluc3RydWN0aW9uc319fQp7e2Vsc2UgaWYgY2xpX2NvbmZpZy5tZW1vcnl9fQojIyBNZW1vcnkgTm90ZXMKe3t7Y2xpX2NvbmZpZy5tZW1vcnl9fX0Ke3tlbHNlfX0KIyMgTWVtb3J5IE5vdGVzCl9ObyBhZGRpdGlvbmFsIEN1cnNvciBtZW1vcnkgaW5zdHJ1Y3Rpb25zIHdlcmUgc3VwcGxpZWQgZm9yIHRoaXMgcnVuLl8Ke3svaWZ9fQoKe3sjaWYgdG9vbG1hbi50b29sc319CiMjIFRvb2xtYW4gVG9vbHMKe3sjZWFjaCB0b29sbWFuLnRvb2xzfX0KLSB7e3RoaXN9fQp7ey9lYWNofX0Ke3tlbHNlfX0KIyMgVG9vbG1hbiBUb29scwotIE5vIHJlbW90ZSB0b29scyBjb25maWd1cmVkOyByZWx5IG9uIGJ1aWx0LWluIHNoZWxsL2dpdCBhY2Nlc3MuCnt7L2lmfX0KCnt7I2lmIGNsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX0KIyMgQWRkaXRpb25hbCBOb3Rlcwp7e3tjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319fQp7ey9pZn19Cg== - code_cursor_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBDdXJzb3IgZW52aXJvbm1lbnQiCnt7L2lmfX0KCmlmIFsgLWYgIiRIT01FLy5jYXJnby9lbnYiIF07IHRoZW4KICAuICIkSE9NRS8uY2FyZ28vZW52IgpmaQoKaWYgWyAtZiAiL3Jvb3QvLmNhcmdvL2VudiIgXTsgdGhlbgogIC4gIi9yb290Ly5jYXJnby9lbnYiCmZpCgppZiBjb21tYW5kIC12IHJ1c3R1cCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBydXN0dXAgZGVmYXVsdCBzdGFibGUgMj4vZGV2L251bGwgfHwgdHJ1ZQpmaQoKaWYgWyAtZCAiJEhPTUUvLnJ1c3R1cC9kb3dubG9hZHMiIF07IHRoZW4KICBmaW5kICIkSE9NRS8ucnVzdHVwL2Rvd25sb2FkcyIgLW1pbmRlcHRoIDEgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCgojIEVuc3VyZSBOb2RlLmpzIGlzIGF2YWlsYWJsZSBhdCB0aGUgcGF0aCBleHBlY3RlZCBieSBjdXJzb3ItYWdlbnQKaWYgISBjb21tYW5kIC12IG5vZGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIE5vZGUuanMgYmluYXJ5IG5vdCBmb3VuZDsgY3Vyc29yLWFnZW50IGNhbm5vdCBydW4iCiAgZXhpdCAxCmZpCgpDVVJTT1JfUlVOVElNRV9CSU49Ii90bXAvY3Vyc29yLWFnZW50LWJpbiIKQ1VSU09SX0FHRU5UX1JPT1Q9Ii91c3IvbG9jYWwvbGliL2N1cnNvci1hZ2VudCIKQ1VSU09SX0FHRU5UX0VOVFJZPSIkQ1VSU09SX0FHRU5UX1JPT1QvaW5kZXguanMiCgpta2RpciAtcCAiJENVUlNPUl9SVU5USU1FX0JJTiIKY2F0ID4iJENVUlNPUl9SVU5USU1FX0JJTi9jdXJzb3ItYWdlbnQiIDw8J1dSQVBQRVInCiMhL2Jpbi9iYXNoCnNldCAtZXVvIHBpcGVmYWlsCgppZiAhIGNvbW1hbmQgLXYgbm9kZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLinYwgTm9kZS5qcyBiaW5hcnkgbm90IGZvdW5kIGluIFBBVEgiCiAgZXhpdCAxCmZpCgpOT0RFX0JJTj0iJChjb21tYW5kIC12IG5vZGUpIgpDVVJTT1JfQUdFTlRfUk9PVD0iL3Vzci9sb2NhbC9saWIvY3Vyc29yLWFnZW50IgpDVVJTT1JfQUdFTlRfRU5UUlk9IiRDVVJTT1JfQUdFTlRfUk9PVC9pbmRleC5qcyIKCmlmIFsgISAtZiAiJENVUlNPUl9BR0VOVF9FTlRSWSIgXTsgdGhlbgogIGVjaG8gIuKdjCBDdXJzb3IgYWdlbnQgZW50cnlwb2ludCBub3QgZm91bmQgYXQgJENVUlNPUl9BR0VOVF9FTlRSWSIKICBleGl0IDEKZmkKCmV4ZWMgIiROT0RFX0JJTiIgIiRDVVJTT1JfQUdFTlRfRU5UUlkiICIkQCIKV1JBUFBFUgpjaG1vZCAreCAiJENVUlNPUl9SVU5USU1FX0JJTi9jdXJzb3ItYWdlbnQiCmV4cG9ydCBQQVRIPSIkQ1VSU09SX1JVTlRJTUVfQklOOiRQQVRIIgoKaWYgWyAhIC14ICIvdXNyL2xvY2FsL2Jpbi9ub2RlIiBdOyB0aGVuCiAgZWNobyAi4oS577iPIEZhbGxpbmcgYmFjayB0byBjdXJzb3ItYWdlbnQgd3JhcHBlcjsgL3Vzci9sb2NhbC9iaW4vbm9kZSBtaXNzaW5nIgpmaQoKZWNobyAiUEFUSDogJFBBVEgiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCmlmIFsgLXogIiR7R0lUSFVCX0FQUF9QUklWQVRFX0tFWTotfSIgXSB8fCBbIC16ICIke0dJVEhVQl9BUFBfSUQ6LX0iIF07IHRoZW4KICBlY2hvICLinYwgTWlzc2luZyBHaXRIdWIgQXBwIGNyZWRlbnRpYWxzIgogIGV4aXQgMQpmaQoKZWNobyAi8J+UkCBBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAiClRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgpwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4iJFRFTVBfS0VZX0ZJTEUiCmNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgpKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCk5PVz0kKGRhdGUgKyVzKQpFWFA9JCgoTk9XICsgNjAwKSkKSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgpybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgpwYXJzZV9yZXBvKCkgewogIGxvY2FsIGlucHV0PSIkMSIKICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8oW14vXSs/KShcLmdpdCk/JHxcMSBcMnwnCiAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsc2UKICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8XC5naXQkfHwnIHwgc2VkIC1FICdzfChbXi9dKykvKFteL10rKXxcMSBcMnwnCiAgZmkKfQoKcmVhZCBSRVBPX09XTkVSIFJFUE9fTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkUkVQT19VUkwiKSIKUkVQT19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7UkVQT19PV05FUn0vJHtSRVBPX05BTUV9LmdpdCIKCklOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCmZpCgppZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIHJlc29sdmUgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogIGV4aXQgMQpmaQoKR0lUSFVCX1RPS0VOPSQoY3VybCAtcyAtWCBQT1NUIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiIHwganEgLXIgJy50b2tlbicpCgppZiBbICIkR0lUSFVCX1RPS0VOIiA9ICJudWxsIiBdIHx8IFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIG9idGFpbiBpbnN0YWxsYXRpb24gdG9rZW4iCiAgZXhpdCAxCmZpCgpleHBvcnQgR0lUSFVCX1RPS0VOCmV4cG9ydCBHSF9UT0tFTj0iJEdJVEhVQl9UT0tFTiIKZXhwb3J0IEdIX0hPU1Q9ImdpdGh1Yi5jb20iCgpleHBvcnQgR0lUX0NPTkZJR19HTE9CQUw9L3dvcmtzcGFjZS8uZ2l0Y29uZmlnCkNSRURFTlRJQUxTX0ZJTEU9L3dvcmtzcGFjZS8uZ2l0LWNyZWRlbnRpYWxzCm1rZGlyIC1wIC93b3Jrc3BhY2UKCmdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciAic3RvcmUgLS1maWxlPSRDUkVERU5USUFMU19GSUxFIgplY2hvICJodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tIiA+ICIkQ1JFREVOVElBTFNfRklMRSIKClRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQoKcmVmcmVzaF9naXRodWJfdG9rZW4oKSB7CiAgZWNobyAi8J+UhCBSZWZyZXNoaW5nIEdpdEh1YiBBcHAgdG9rZW4uLi4iCgogIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXktJCQiCiAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICBjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgTk9XPSQoZGF0ZSArJXMpCiAgRVhQPSQoKE5PVyArIDYwMCkpCiAgSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICBKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKCiAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKICBORVdfSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCgogIGlmIFsgIiRORVdfSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRORVdfSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICBORVdfSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCiAgZmkKCiAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRORVdfSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICBORVdfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogIGlmIFsgIiRORVdfVE9LRU4iICE9ICJudWxsIiBdICYmIFsgLW4gIiRORVdfVE9LRU4iIF07IHRoZW4KICAgIGV4cG9ydCBHSVRIVUJfVE9LRU49IiRORVdfVE9LRU4iCiAgICBleHBvcnQgR0hfVE9LRU49IiRORVdfVE9LRU4iCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gIiRDUkVERU5USUFMU19GSUxFIgogICAgZWNobyAi4pyFIFRva2VuIHJlZnJlc2hlZCIKICAgIHJldHVybiAwCiAgZmkKCiAgZWNobyAi4p2MIEZhaWxlZCB0byByZWZyZXNoIHRva2VuOiAkVE9LRU5fUkVTUE9OU0UiCiAgcmV0dXJuIDEKfQoKcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQoKSB7CiAgaWYgWyAteiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXTsgdGhlbgogICAgcmVmcmVzaF9naXRodWJfdG9rZW4KICAgIHJldHVybgogIGZpCgogIE5PVz0kKGRhdGUgKyVzKQogIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgZWNobyAi8J+UhCBUb2tlbiBhZ2U6ICQoKFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyDigJQgcmVmcmVzaGluZyIKICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgZmkKfQoKZW5zdXJlX3ByX2NyZWF0ZWQoKSB7CiAgaWYgWyAiJHtTS0lQX0FVVE9fUFI6LTB9IiA9ICIxIiBdOyB0aGVuCiAgICBlY2hvICLij63vuI8gIEF1dG8gUFIgY3JlYXRpb24gZGlzYWJsZWQgdmlhIFNLSVBfQVVUT19QUj0xIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAhIC1kIC5naXQgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIFJlcG9zaXRvcnkgbm90IGluaXRpYWxpc2VkOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIGlmICEgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBqcSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAteiAiJHtHSVRIVUJfVE9LRU46LX0iIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHSVRIVUJfVE9LRU4gbm90IHNldDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIENVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCAyPi9kZXYvbnVsbCB8fCBwcmludGYgJycpCiAgaWYgWyAteiAiJENVUlJFTlRfQlJBTkNIIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IGJyYW5jaDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIFBSX0RBVEE9JChnaCBwciBsaXN0IC0tc3RhdGUgb3BlbiAtLWhlYWQgIiRDVVJSRU5UX0JSQU5DSCIgLS1qc29uIG51bWJlciAtLWxpbWl0IDEgMj4vZGV2L251bGwgfHwgZWNobyAiW10iKQogIGlmIFsgIiQocHJpbnRmICclcycgIiRQUl9EQVRBIiB8IGpxICdsZW5ndGgnIDI+L2Rldi9udWxsIHx8IGVjaG8gMCkiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBQdWxsIHJlcXVlc3QgYWxyZWFkeSBleGlzdHMgZm9yIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0giCiAgICByZXR1cm4KICBmaQoKICBCQVNFX0JSQU5DSD0iJHtQUl9CQVNFX0JSQU5DSDotbWFpbn0iCiAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgaWYgISBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciI7IHRoZW4KICAgICAgQkFTRV9CUkFOQ0g9Im1hc3RlciIKICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICBlbHNlCiAgICAgIERFRkFVTFRfUkVNT1RFPSQoZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQgMj4vZGV2L251bGwgfCBzZWQgJ3NAXnJlZnMvcmVtb3Rlcy9vcmlnaW4vQEAnKQogICAgICBpZiBbIC1uICIkREVGQVVMVF9SRU1PVEUiIF07IHRoZW4KICAgICAgICBCQVNFX0JSQU5DSD0iJERFRkFVTFRfUkVNT1RFIgogICAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgICBlbHNlCiAgICAgICAgUkVNT1RFX0JBU0U9IiIKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogIGlmIFsgLW4gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgZ2l0IGZldGNoIG9yaWdpbiAiJEJBU0VfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGZpCgogIGlmIFsgIiRDVVJSRU5UX0JSQU5DSCIgPSAiSEVBRCIgXSB8fCBbICIkQ1VSUkVOVF9CUkFOQ0giID0gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgQVVUT19CUkFOQ0g9InRhc2ste3t0YXNrX2lkfX0te3tzZXJ2aWNlfX0tJChkYXRlICslWSVtJWQtJUglTSVTKSIKICAgIGVjaG8gIuKaoO+4jyBCcmFuY2ggJENVUlJFTlRfQlJBTkNIIHVuc3VpdGFibGUgZm9yIFBSOyBjcmVhdGluZyAkQVVUT19CUkFOQ0giCiAgICBpZiAhIGdpdCBjaGVja291dCAtQiAiJEFVVE9fQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjcmVhdGUgZmFsbGJhY2sgYnJhbmNoICRBVVRPX0JSQU5DSCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgQ1VSUkVOVF9CUkFOQ0g9IiRBVVRPX0JSQU5DSCIKICBmaQoKICBnaXQgYWRkIC4KICBpZiBnaXQgZGlmZiAtLWNhY2hlZCAtLXF1aWV0IC0tZXhpdC1jb2RlOyB0aGVuCiAgICBlY2hvICLihLnvuI8gTm8gc3RhZ2VkIGNoYW5nZXMgZGV0ZWN0ZWQgYWZ0ZXIgYXV0by1zdGFnaW5nIgogIGVsc2UKICAgIENPTU1JVF9NU0c9ImNob3JlKHt7c2VydmljZX19KTogYXV0by1jb21taXQgZm9yIHRhc2sge3t0YXNrX2lkfX0iCiAgICBpZiAhIGdpdCBjb21taXQgLW0gIiRDT01NSVRfTVNHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjb21taXQgc3RhZ2VkIGNoYW5nZXMgYXV0b21hdGljYWxseSIKICAgIGVsc2UKICAgICAgZWNobyAi4pyFIEF1dG8tY29tbWl0dGVkIHN0YWdlZCBjaGFuZ2VzIgogICAgZmkKICBmaQoKICBpZiBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IC0tcXVpZXQgIiRDVVJSRU5UX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICBpZiAhIGdpdCBwdXNoIC11IG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwdXNoIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICAgIHJldHVybgogICAgZmkKICBlbHNlCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIHZlcmlmeSBicmFuY2ggJENVUlJFTlRfQlJBTkNIOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgZ2l0IGZldGNoIG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXTsgdGhlbgogICAgQUhFQURfQ09VTlQ9JChnaXQgcmV2LWxpc3QgLS1sZWZ0LXJpZ2h0ICIkUkVNT1RFX0JBU0UuLi4kQ1VSUkVOVF9CUkFOQ0giIDI+L2Rldi9udWxsIHwgYXdrICcvXj4ve2MrK30gRU5Ee3ByaW50IGMrMH0nKQogIGVsc2UKICAgIEFIRUFEX0NPVU5UPTEKICBmaQogIGlmIFsgIiR7QUhFQURfQ09VTlQ6LTB9IiAtZXEgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQnJhbmNoICRDVVJSRU5UX0JSQU5DSCBoYXMgbm8gY29tbWl0cyBhaGVhZCBvZiAkQkFTRV9CUkFOQ0g7IHNraXBwaW5nIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgUlVOX0xBQkVMPSJydW4te3t3b3JrZmxvd19uYW1lfX0iCiAgaWYgWyAiJHtSVU5fTEFCRUwjcnVuLX0iID0gIiIgXTsgdGhlbgogICAgUlVOX0xBQkVMPSJydW4tdW5rbm93biIKICBmaQoKICBUQVNLX0xBQkVMPSJ0YXNrLXt7dGFza19pZH19IgogIFNFUlZJQ0VfTEFCRUw9InNlcnZpY2Ute3tzZXJ2aWNlfX0iCiAgUkVQT19TTFVHPSIke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfSIKCiAgZWNobyAi8J+UjSBFbnN1cmluZyBQUiBjb3JyZWxhdGlvbiBsYWJlbHMgZXhpc3QiCiAgZm9yIGxhYmVsIGluICIkVEFTS19MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIiAiJFJVTl9MQUJFTCI7IGRvCiAgICBpZiBbIC16ICIkbGFiZWwiIF07IHRoZW4KICAgICAgY29udGludWUKICAgIGZpCgogICAgaWYgZ2ggbGFiZWwgdmlldyAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBhbHJlYWR5IGV4aXN0cyIKICAgICAgY29udGludWUKICAgIGZpCgogICAgY2FzZSAiJGxhYmVsIiBpbgogICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICBydW4tKikgQ09MT1I9IjAzNjZkNiI7IERFU0M9IldvcmtmbG93IGNvcnJlbGF0aW9uIiA7OwogICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iQXV0b21hdGlvbiBsYWJlbCIgOzsKICAgIGVzYWMKCiAgICBpZiBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiID4vdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgMj4mMTsgdGhlbgogICAgICBlY2hvICIgICDinIUgQ3JlYXRlZCBsYWJlbCAnJGxhYmVsJyIKICAgIGVsc2UKICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBjcmVhdGUgbGFiZWwgJyRsYWJlbCciCiAgICAgIGNhdCAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgPiYyIHx8IHRydWUKICAgIGZpCiAgICBybSAtZiAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cKICBkb25lCgogIFBSX1RJVExFPSJmZWF0KHt7c2VydmljZX19KTogY29tcGxldGUgdGFzayB7e3Rhc2tfaWR9fSIKICByZWFkIC1yIC1kICcnIFBSX0JPRFkgPDwnRU9GJyB8fCB0cnVlCiMjIFN1bW1hcnkKLSBBdXRvLWdlbmVyYXRlZCBmYWxsYmFjayBQUiBiZWNhdXNlIHRoZSBDdXJzb3IgYWdlbnQgZmluaXNoZWQgd2l0aG91dCBvcGVuaW5nIG9uZQotIFRhc2sge3t0YXNrX2lkfX0gZm9yIHNlcnZpY2Uge3tzZXJ2aWNlfX0gaXMgcmVhZHkgZm9yIHJldmlldwoKIyMgTWV0YWRhdGEKLSBBZ2VudDoge3tnaXRodWJfYXBwfX0KLSBXb3JrZmxvdzoge3t3b3JrZmxvd19uYW1lfX0KLSBCcmFuY2g6IFxcYCRDVVJSRU5UX0JSQU5DSFxcYCDihpIgXFxgJEJBU0VfQlJBTkNIXFxgCgpfVGhpcyBQUiB3YXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBDdXJzb3IgY29udGFpbmVyLl8KRU9GCgogIExBQkVMX0FSR1M9KCItLXRpdGxlIiAiJFBSX1RJVExFIiAiLS1ib2R5IiAiJFBSX0JPRFkiICItLWJhc2UiICIkQkFTRV9CUkFOQ0giICItLWhlYWQiICIkQ1VSUkVOVF9CUkFOQ0giKQoKICBtYXliZV9hZGRfbGFiZWwoKSB7CiAgICBsb2NhbCBsYWJlbD0iJDEiCiAgICBpZiBbIC16ICIkbGFiZWwiIF07IHRoZW4KICAgICAgcmV0dXJuCiAgICBmaQogICAgaWYgZ2ggbGFiZWwgdmlldyAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIExBQkVMX0FSR1MrPSgiLS1sYWJlbCIgIiRsYWJlbCIpCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBMYWJlbCAnJGxhYmVsJyBub3QgZm91bmQ7IHNraXBwaW5nIgogICAgZmkKICB9CgogIG1heWJlX2FkZF9sYWJlbCAiJFRBU0tfTEFCRUwiCiAgbWF5YmVfYWRkX2xhYmVsICIkU0VSVklDRV9MQUJFTCIKICBtYXliZV9hZGRfbGFiZWwgIiRSVU5fTEFCRUwiCgogIGlmIGdoIHByIGNyZWF0ZSAiJHtMQUJFTF9BUkdTW0BdfSI7IHRoZW4KICAgIGVjaG8gIuKchSBBdXRvLWNyZWF0ZWQgcHVsbCByZXF1ZXN0IGZvciAkQ1VSUkVOVF9CUkFOQ0giCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjcmVhdGUgcHVsbCByZXF1ZXN0IGF1dG9tYXRpY2FsbHkgKGl0IG1heSBhbHJlYWR5IGV4aXN0IG9yIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCkiCiAgZmkKfQoKZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvd29ya3NwYWNlCgpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogIGxvY2FsIGFwcF9uYW1lPSIkMSIKCiAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgR0lUX0FVVEhPUl9OQU1FPSJhdXRvbWF0aW9uW2JvdF0iCiAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgcmV0dXJuCiAgZmkKCiAgbG9jYWwgc2x1ZwogIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgZmkKCiAgbG9jYWwgYm90X2xvZ2luPSIke3NsdWd9W2JvdF0iCiAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgZW5jb2RlZF9sb2dpbj0kKHByaW50ZiAnJXMnICIkYm90X2xvZ2luIiB8IHNlZCAncy9cWy8lNUIvZzsgcy9cXS8lNUQvZycpCiAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBsb2NhbCBib3RfaWQKICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICBmaQogIGZpCgogIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICBHSVRfQVVUSE9SX0VNQUlMPSIkYm90X2VtYWlsIgp9CgpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKZGVyaXZlX2JvdF9pZGVudGl0eSAiJEdJVEhVQl9BUFAiCgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRQpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTApleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfVEVSTUlOQUxfUFJPTVBUPTAKZXhwb3J0IEdJVF9BU0tQQVNTPS9iaW4vdHJ1ZQpleHBvcnQgU1NIX0FTS1BBU1M9L2Jpbi90cnVlCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBSZXBvc2l0b3J5IGNoZWNrb3V0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAteiAiJFdPUktfRElSIiBdIHx8IFsgIiRXT1JLX0RJUiIgPSAibnVsbCIgXTsgdGhlbgogIFdPUktfRElSPSJ7e3NlcnZpY2V9fSIKZmkKClRBUkdFVF9ESVI9Ii93b3Jrc3BhY2UvJFdPUktfRElSIgpta2RpciAtcCAiJFRBUkdFVF9ESVIiCmNkIC93b3Jrc3BhY2UKCmlmIFsgLWQgIiRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogIGVjaG8gIvCflIEgUmVwb3NpdG9yeSBhbHJlYWR5IGNsb25lZCwgZmV0Y2hpbmcgbGF0ZXN0IgogIGNkICIkUkVQT19OQU1FIgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgZ2l0IGZldGNoIC0tYWxsIC0tcHJ1bmUKZWxzZQogIGVjaG8gIuKsh++4jyAgQ2xvbmluZyByZXBvc2l0b3J5IgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgZ2l0IGNsb25lICIkUkVQT19IVFRQX1VSTCIKICBjZCAiJFJFUE9fTkFNRSIKZmkKClJFUE9fUk9PVD0iL3dvcmtzcGFjZS8kUkVQT19OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5ICIkUkVQT19ST09UIgpjZCAiJFJFUE9fUk9PVCIKCmVjaG8gIj09PSBCUkFOQ0ggU0VUVVAgPT09IgojIFJlbW92ZSBzdGFsZSBhdXRvbWF0aW9uLW1hbmFnZWQgZmlsZXMgdGhhdCBibG9jayBicmFuY2ggY2hlY2tvdXQgd2hlbiByZXJ1bm5pbmcKTUFOQUdFRF9QQVRIUz0oCiAgIi5tY3AuanNvbiIKICAiQUdFTlRTLm1kIgogICJjbGllbnQtY29uZmlnLmpzb24iCiAgImNvZGluZy1ndWlkZWxpbmVzLm1kIgogICJnaXRodWItZ3VpZGVsaW5lcy5tZCIKICAidGFzayIKKQoKZm9yIG1hbmFnZWRfcGF0aCBpbiAiJHtNQU5BR0VEX1BBVEhTW0BdfSI7IGRvCiAgaWYgZ2l0IGxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAiJG1hbmFnZWRfcGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBjb250aW51ZQogIGZpCiAgaWYgWyAtZSAiJG1hbmFnZWRfcGF0aCIgXTsgdGhlbgogICAgZWNobyAi8J+nuSBSZW1vdmluZyBzdGFsZSBmaWxlIHRvIGFsbG93IGNoZWNrb3V0OiAkbWFuYWdlZF9wYXRoIgogICAgcm0gLXJmICIkbWFuYWdlZF9wYXRoIgogIGZpCmRvbmUKCkJBU0VfQlJBTkNIPSIke1BSX0JBU0VfQlJBTkNIOi1tYWlufSIKUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCgppZiAhIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvJFJFTU9URV9CQVNFIjsgdGhlbgogICMgRmFsbCBiYWNrIHRvIG9yaWdpbi9tYXN0ZXIgb3IgdGhlIHJlbW90ZSBIRUFEIGlmIG1haW4gaXMgYWJzZW50CiAgaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIjsgdGhlbgogICAgQkFTRV9CUkFOQ0g9Im1hc3RlciIKICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogIGVsc2UKICAgIERFRkFVTFRfUkVNT1RFPSQoZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQgMj4vZGV2L251bGwgfCBzZWQgJ3NAXnJlZnMvcmVtb3Rlcy9vcmlnaW4vQEAnKQogICAgaWYgWyAtbiAiJERFRkFVTFRfUkVNT1RFIiBdOyB0aGVuCiAgICAgIEJBU0VfQlJBTkNIPSIkREVGQVVMVF9SRU1PVEUiCiAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgZWxzZQogICAgICBSRU1PVEVfQkFTRT0iIgogICAgZmkKICBmaQpmaQoKaWYgWyAtbiAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgZ2l0IGZldGNoIG9yaWdpbiAiJEJBU0VfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQpmaQoKRkVBVFVSRV9CUkFOQ0g9ImZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbiIKaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIIjsgdGhlbgogIGVjaG8gIkZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIGV4aXN0cywgY2hlY2tpbmcgb3V0Li4uIgogICMgU3Rhc2ggYW55IGxvY2FsIGNoYW5nZXMgZnJvbSBwcmV2aW91cyBydW5zIHRvIGF2b2lkIGNoZWNrb3V0IGNvbmZsaWN0cwogIGlmICEgZ2l0IGRpZmYtaW5kZXggLS1xdWlldCBIRUFEIC0tIHx8IFsgLW4gIiQoZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZS1zdGFuZGFyZCkiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgU3Rhc2hpbmcgbG9jYWwgY2hhbmdlcyBhbmQgdW50cmFja2VkIGZpbGVzIGJlZm9yZSBjaGVja291dCIKICAgIGdpdCBzdGFzaCBwdXNoIC0taW5jbHVkZS11bnRyYWNrZWQgLW0gIkF1dG8tc3Rhc2ggYmVmb3JlIGNoZWNrb3V0ICgkKGRhdGUgLXUgKyVZJW0lZC0lSCVNJVMpKSIgfHwgdHJ1ZQogIGZpCiAgZ2l0IGNoZWNrb3V0ICIkRkVBVFVSRV9CUkFOQ0giCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdOyB0aGVuCiAgICBlY2hvICLwn5OlIEZhc3QtZm9yd2FyZGluZyAkRkVBVFVSRV9CUkFOQ0ggd2l0aCAkUkVNT1RFX0JBU0UiCiAgICBpZiAhIGdpdCBtZXJnZSAiJFJFTU9URV9CQVNFIiAtLWZmLW9ubHkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gZmFzdC1mb3J3YXJkICRGRUFUVVJFX0JSQU5DSDsgY3JlYXRpbmcgZnJlc2ggYnJhbmNoIGZyb20gJFJFTU9URV9CQVNFIgogICAgICBORVdfQlJBTkNIPSIke0ZFQVRVUkVfQlJBTkNIfS0kKGRhdGUgLXUgKyVZJW0lZCVIJU0lUykiCiAgICAgIGdpdCBjaGVja291dCAtQiAiJE5FV19CUkFOQ0giICIkUkVNT1RFX0JBU0UiCiAgICAgIEZFQVRVUkVfQlJBTkNIPSIkTkVXX0JSQU5DSCIKICAgIGZpCiAgZmkKZWxzZQogIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyIKICBpZiBbIC1uICIkUkVNT1RFX0JBU0UiIF0gJiYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy8kUkVNT1RFX0JBU0UiOyB0aGVuCiAgICBnaXQgY2hlY2tvdXQgLWIgIiRGRUFUVVJFX0JSQU5DSCIgIiRSRU1PVEVfQkFTRSIKICBlbHNlCiAgICBnaXQgY2hlY2tvdXQgLWIgIiRGRUFUVVJFX0JSQU5DSCIKICBmaQpmaQoKZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgpnaXQgY29uZmlnIC0tbG9jYWwgcHVzaC5hdXRvU2V0dXBSZW1vdGUgdHJ1ZQpleHBvcnQgSU1QTEVNRU5UQVRJT05fQlJBTkNIPSIkRkVBVFVSRV9CUkFOQ0giCmVjaG8gIuKckyBVc2luZyBmZWF0dXJlIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIChiYXNlOiAke0JBU0VfQlJBTkNIOi11bmtub3dufSkiCgojIFNldCB3b3JraW5nIGRpcmVjdG9yeTogdXNlIHJlcG8gcm9vdCBpZiB3b3JraW5nX2RpcmVjdG9yeSBpcyAiLiIgb3IgZW1wdHkKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBDVVJTT1JfV09SS19ESVI9IiRSRVBPX1JPT1QiCmVsc2UKICBDVVJTT1JfV09SS19ESVI9IiRSRVBPX1JPT1QvJFdPUktfRElSIgogIG1rZGlyIC1wICIkQ1VSU09SX1dPUktfRElSIgpmaQoKY2QgIiRDVVJTT1JfV09SS19ESVIiCmVjaG8gIuKckyBXb3JraW5nIGRpcmVjdG9yeTogJENVUlNPUl9XT1JLX0RJUiIKCmVjaG8gIvCfk6YgZ2l0IHN0YXR1cyIKcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKZ2l0IHN0YXR1cyAtLXNob3J0IHx8IHRydWUKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1hdGVyaWFsaXNlIHRhc2sgY29udGV4dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmVjaG8gIvCfp7EgU3luY2luZyB0YXNrIGFzc2V0cyIKbWtkaXIgLXAgIiRDVVJTT1JfV09SS19ESVIvdGFzayIKbWtkaXIgLXAgIiRDVVJTT1JfV09SS19ESVIvLmN1cnNvciIKbWtkaXIgLXAgIiRIT01FLy5jdXJzb3IiCmNwIC1SIC90YXNrLWZpbGVzL3Rhc2svKiAiJENVUlNPUl9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQoKRE9DU19SRVBPX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCkRPQ1NfQlJBTkNIPSJ7e2RvY3NfYnJhbmNofX0iCkRPQ1NfUFJPSkVDVF9ESVJFQ1RPUlk9Int7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgoKaWYgWyAtbiAiJERPQ1NfUkVQT19VUkwiIF0gJiYgWyAiJERPQ1NfUkVQT19VUkwiICE9ICJudWxsIiBdOyB0aGVuCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBpZiBbIC16ICIkRE9DU19CUkFOQ0giIF0gfHwgWyAiJERPQ1NfQlJBTkNIIiA9ICJudWxsIiBdOyB0aGVuCiAgICBET0NTX0JSQU5DSD0ibWFpbiIKICBmaQoKICBlY2hvICLwn5OaIFN5bmNpbmcgZG9jcyByZXBvc2l0b3J5OiAkRE9DU19SRVBPX1VSTCAoYnJhbmNoOiAkRE9DU19CUkFOQ0gpIgogIERPQ1NfQ0xPTkVfRElSPSIvdG1wL2RvY3MtcmVwbyIKICBybSAtcmYgIiRET0NTX0NMT05FX0RJUiIKCiAgcmVhZCBET0NTX09XTkVSIERPQ1NfTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkRE9DU19SRVBPX1VSTCIpIgogIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke0RPQ1NfT1dORVJ9LyR7RE9DU19OQU1FfS5naXQiCgogIGlmIGdpdCBjbG9uZSAtLXF1aWV0IC0tYnJhbmNoICIkRE9DU19CUkFOQ0giIC0tc2luZ2xlLWJyYW5jaCAiJERPQ1NfSFRUUF9VUkwiICIkRE9DU19DTE9ORV9ESVIiOyB0aGVuCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNsb25lIGRvY3MgYnJhbmNoICckRE9DU19CUkFOQ0gnOyBhdHRlbXB0aW5nIGRlZmF1bHQgYnJhbmNoIgogICAgaWYgZ2l0IGNsb25lIC0tcXVpZXQgIiRET0NTX0hUVFBfVVJMIiAiJERPQ1NfQ0xPTkVfRElSIjsgdGhlbgogICAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCB1c2luZyBkZWZhdWx0IGJyYW5jaCIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIFVuYWJsZSB0byBjbG9uZSBkb2NzIHJlcG9zaXRvcnk6ICRET0NTX0hUVFBfVVJMIgogICAgICBET0NTX0NMT05FX0RJUj0iIgogICAgZmkKICBmaQoKICBpZiBbIC1uICIkRE9DU19DTE9ORV9ESVIiIF07IHRoZW4KICAgIERPQ1NfQkFTRV9QQVRIPSIkRE9DU19DTE9ORV9ESVIvLnRhc2ttYXN0ZXIiCiAgICBpZiBbIC1uICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgXSAmJiBbICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgIT0gIm51bGwiIF07IHRoZW4KICAgICAgRE9DU19CQVNFX1BBVEg9IiRET0NTX0NMT05FX0RJUi8kRE9DU19QUk9KRUNUX0RJUkVDVE9SWS8udGFza21hc3RlciIKICAgIGZpCgogICAgZWNobyAi8J+UjSBEb2NzIGJhc2UgcGF0aDogJERPQ1NfQkFTRV9QQVRIIgogICAgVEFTS19ESVI9IiRET0NTX0JBU0VfUEFUSC9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCgogICAgaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICAgIGVjaG8gIuKckyBDb3B5aW5nIHRhc2sgZGVmaW5pdGlvbiBmcm9tICRUQVNLX0RJUiIKICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICAgICAgY3AgLVIgIiRUQVNLX0RJUiIvLiAiJENVUlNPUl9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxzZQogICAgICBlY2hvICLinYwgQ1JJVElDQUw6IFRhc2sgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAkVEFTS19ESVIiCiAgICBmaQoKICAgIGlmIFsgLWYgIiRET0NTX0JBU0VfUEFUSC90YXNrcy5qc29uIiBdOyB0aGVuCiAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgICAgIGNwICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgIiRDVVJTT1JfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGZpCiAgZmkKZWxzZQogIGVjaG8gIuKaoO+4jyBEb2NzIHJlcG9zaXRvcnkgVVJMIG5vdCBwcm92aWRlZDsgc2tpcHBpbmcgdGFzayBkb2NzIHN5bmMiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL0FHRU5UUy5tZCBdOyB0aGVuCiAgY3AgLWYgL3Rhc2stZmlsZXMvQUdFTlRTLm1kICIkQ1VSU09SX1dPUktfRElSL0FHRU5UUy5tZCIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgXTsgdGhlbgogIGNwIC1mIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ1VSU09SX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCBdOyB0aGVuCiAgY3AgLWYgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDVVJTT1JfV09SS19ESVIvIgogIGVjaG8gIuKckyBDb3BpZWQgZ2l0aHViLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiBdOyB0aGVuCiAgY3AgLWYgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uICIkQ1VSU09SX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNsaWVudC1jb25maWcuanNvbiB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvbWNwLmpzb24gXTsgdGhlbgogIGNwIC1mIC90YXNrLWZpbGVzL21jcC5qc29uICIkQ1VSU09SX1dPUktfRElSLy5tY3AuanNvbiIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvY3Vyc29yLWNsaS5qc29uIF07IHRoZW4KICBta2RpciAtcCAiJENVUlNPUl9XT1JLX0RJUi8uY3Vyc29yIgogIGNwIC1mIC90YXNrLWZpbGVzL2N1cnNvci1jbGkuanNvbiAiJENVUlNPUl9XT1JLX0RJUi8uY3Vyc29yL2NsaS5qc29uIgogIGVjaG8gIuKckyBJbnN0YWxsZWQgcHJvamVjdC1sZXZlbCBjdXJzb3IgQ0xJIHBlcm1pc3Npb25zIgplbHNlCiAgZWNobyAi4pqg77iPIGN1cnNvci1jbGkuanNvbiBub3QgcHJvdmlkZWQ7IHVzaW5nIGRlZmF1bHQgcHJvamVjdCBwZXJtaXNzaW9ucyIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvY3Vyc29yLWNsaS1jb25maWcuanNvbiBdOyB0aGVuCiAgbWtkaXIgLXAgIiRIT01FLy5jdXJzb3IiCiAgY3AgLWYgL3Rhc2stZmlsZXMvY3Vyc29yLWNsaS1jb25maWcuanNvbiAiJEhPTUUvLmN1cnNvci9jbGktY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIEluc3RhbGxlZCBnbG9iYWwgY3Vyc29yIENMSSBjb25maWciCmVsc2UKICBlY2hvICLimqDvuI8gY3Vyc29yLWNsaS1jb25maWcuanNvbiBub3QgcHJvdmlkZWQ7IHVzaW5nIGV4aXN0aW5nIGdsb2JhbCBDdXJzb3IgY29uZmlnIgpmaQoKaWYgWyAhIC1mICIkTUNQX0NMSUVOVF9DT05GSUciIF07IHRoZW4KICBlY2hvICLinYwgY2xpZW50LWNvbmZpZy5qc29uIG1pc3NpbmcgZnJvbSB3b3Jrc3BhY2U7IHJlcXVpcmVkIGZvciBNQ1AvdG9vbG1hbiIKICBleGl0IDEKZmkKCmVjaG8gIj09PSBNQ1AgUFJFQ0hFQ0tTID09PSIKaWYgISBjb21tYW5kIC12IHRvb2xtYW4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MICd0b29sbWFuJyBDTEkgbm90IGZvdW5kIGluIFBBVEg7IHJlcXVpcmVkIGZvciBNQ1AiCiAgZXhpdCAxCmZpCgpXT1JLU1BBQ0VfQ0ZHPSIkTUNQX0NMSUVOVF9DT05GSUciClNPVVJDRV9DRkc9Ii90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIKVEFSR0VUX0NGRz0iJHtNQ1BfQ0xJRU5UX0NPTkZJRzotL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb259IgoKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHBhdGg9IiQxIgogIFsgLWYgIiRwYXRoIiBdIHx8IHJldHVybiAxCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGpxIC1lICd0eXBlPT0ib2JqZWN0IiBhbmQgbGVuZ3RoPj0wJyAiJHBhdGgiID4vZGV2L251bGwgMj4mMQogIGVsc2UKICAgIFsgLXMgIiRwYXRoIiBdCiAgZmkKfQoKaWYgaXNfdmFsaWRfY2ZnICIkV09SS1NQQUNFX0NGRyI7IHRoZW4KICAjIE9ubHkgY29weSBpZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBkaWZmZXJlbnQgZmlsZXMKICBpZiBbICIkV09SS1NQQUNFX0NGRyIgIT0gIiRUQVJHRVRfQ0ZHIiBdOyB0aGVuCiAgICBjcCAtZiAiJFdPUktTUEFDRV9DRkciICIkVEFSR0VUX0NGRyIKICBmaQogIGVjaG8gIuKckyBVc2luZyBNQ1AgY2xpZW50IGNvbmZpZyBmcm9tIHdvcmtzcGFjZTogJFRBUkdFVF9DRkciCmVsaWYgaXNfdmFsaWRfY2ZnICIkU09VUkNFX0NGRyI7IHRoZW4KICAjIE9ubHkgY29weSBpZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBkaWZmZXJlbnQgZmlsZXMKICBpZiBbICIkU09VUkNFX0NGRyIgIT0gIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBjcCAtZiAiJFNPVVJDRV9DRkciICIkV09SS1NQQUNFX0NGRyIKICBmaQogIGlmIFsgIiRTT1VSQ0VfQ0ZHIiAhPSAiJFRBUkdFVF9DRkciIF07IHRoZW4KICAgIGNwIC1mICIkU09VUkNFX0NGRyIgIiRUQVJHRVRfQ0ZHIgogIGZpCiAgZWNobyAi4pyTIFJlc3RvcmVkIE1DUCBjbGllbnQgY29uZmlnIGZyb20gc291cmNlOiAkVEFSR0VUX0NGRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gYXZhaWxhYmxlIChjaGVja2VkICRXT1JLU1BBQ0VfQ0ZHIGFuZCAkU09VUkNFX0NGRykiCiAgaWYgWyAtZiAiJFdPUktTUEFDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBjb250ZW50cyBwcmV2aWV3OiI7IGhlYWQgLWMgMjAwICIkV09SS1NQQUNFX0NGRyIgMj4vZGV2L251bGwgfHwgZWNobyAiICAgPHVucmVhZGFibGU+IgogIGZpCiAgaWYgWyAtZiAiJFNPVVJDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFNvdXJjZSBjb250ZW50cyBwcmV2aWV3OiI7IGhlYWQgLWMgMjAwICIkU09VUkNFX0NGRyIgMj4vZGV2L251bGwgfHwgZWNobyAiICAgPHVucmVhZGFibGU+IgogIGZpCiAgZXhpdCAxCmZpCgpNQ1BfQ0xJRU5UX0NPTkZJRz0iJFRBUkdFVF9DRkciCmV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRwoKVE9PTE1BTl9VUkw9JHtUT09MTUFOX1NFUlZFUl9VUkw6LSJodHRwOi8vdG9vbG1hbi5hZ2VudC1wbGF0Zm9ybS5zdmMuY2x1c3Rlci5sb2NhbDozMDAwL21jcCJ9ClRPT0xNQU5fVVJMPSIke1RPT0xNQU5fVVJMJS99IgplY2hvICLwn5SNIENoZWNraW5nIFRvb2xtYW4gZW5kcG9pbnQ6ICRUT09MTUFOX1VSTCIKaWYgISBjdXJsIC1zU2YgLS1jb25uZWN0LXRpbWVvdXQgMiAtLW1heC10aW1lIDYgXAogIC1YIFBPU1QgIiRUT09MTUFOX1VSTCIgXAogIC1IICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFwKICAtZCAneyJqc29ucnBjIjoiMi4wIiwiaWQiOiJoZWFsdGgiLCJtZXRob2QiOiJ0b29scy9saXN0IiwicGFyYW1zIjp7fX0nID4vdG1wL3Rvb2xtYW4tcGluZy5sb2cgMj4mMTsgdGhlbgogIGVjaG8gIuKdjCBVbmFibGUgdG8gcmVhY2ggVG9vbG1hbiBzZXJ2ZXIgYXQgJFRPT0xNQU5fVVJMIgogIGNhdCAvdG1wL3Rvb2xtYW4tcGluZy5sb2cgPiYyIHx8IHRydWUKICBybSAtZiAvdG1wL3Rvb2xtYW4tcGluZy5sb2cKICBleGl0IDEKZmkKcm0gLWYgL3RtcC90b29sbWFuLXBpbmcubG9nCmVjaG8gIuKckyBUb29sbWFuIGVuZHBvaW50IHJlYWNoYWJsZSIKCmlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAiW2NsaWVudC1jb25maWddIHN1bW1hcnk6IgogIGlmICEganEgLXIgJyJyZW1vdGVUb29scz0iICsgKCgucmVtb3RlVG9vbHMgLy8gW10pIHwgbGVuZ3RoIHwgdG9zdHJpbmcpICsgIiwgbG9jYWxTZXJ2ZXJzPSIgKyAoKC5sb2NhbFNlcnZlcnMgLy8ge30gfCBrZXlzKSB8IGpvaW4oIiwiKSknICIkTUNQX0NMSUVOVF9DT05GSUciIDI+L2Rldi9udWxsOyB0aGVuCiAgICBlY2hvICIgIChub3QgdmFsaWQgSlNPTikiCiAgZmkKZWxzZQogIGVjaG8gIuKaoO+4jyBqcSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBjbGllbnQtY29uZmlnIHN1bW1hcnkiCmZpCgpndWFyZF9ybSgpIHsKICBpZiBbICIkIyIgLWdlIDIgXTsgdGhlbgogICAgbG9jYWwgZmxhZ3M9KCkKICAgIGxvY2FsIHRhcmdldHM9KCkKICAgIGZvciBhcmcgaW4gIiRAIjsgZG8KICAgICAgY2FzZSAiJGFyZyIgaW4KICAgICAgICAtKikgZmxhZ3MrPSgiJGFyZyIpIDs7CiAgICAgICAgKikgdGFyZ2V0cys9KCIkYXJnIikgOzsKICAgICAgZXNhYwogICAgZG9uZQoKICAgIGlmIHByaW50ZiAnJXNcbicgIiR7ZmxhZ3NbQF19IiB8IGdyZXAgLUVxICctLXxeLXIuKi1mfC1mLiotcic7IHRoZW4KICAgICAgbG9jYWwgaGFzX3JlY3Vyc2l2ZT0wCiAgICAgIGxvY2FsIGhhc19mb3JjZT0wCiAgICAgIGZvciBmbGFnIGluICIke2ZsYWdzW0BdfSI7IGRvCiAgICAgICAgY2FzZSAiJGZsYWciIGluCiAgICAgICAgICAtKikKICAgICAgICAgICAgW1sgIiRmbGFnIiA9PSAqciogfHwgIiRmbGFnIiA9PSAqUiogXV0gJiYgaGFzX3JlY3Vyc2l2ZT0xCiAgICAgICAgICAgIFtbICIkZmxhZyIgPT0gKmYqIHx8ICIkZmxhZyIgPT0gKkYqIF1dICYmIGhhc19mb3JjZT0xCiAgICAgICAgICAgIDs7CiAgICAgICAgZXNhYwogICAgICBkb25lCgogICAgICBpZiAoKGhhc19yZWN1cnNpdmUgJiYgaGFzX2ZvcmNlKSk7IHRoZW4KICAgICAgICBmb3IgdGFyZ2V0IGluICIke3RhcmdldHNbQF19IjsgZG8KICAgICAgICAgIFsgLXogIiR0YXJnZXQiIF0gJiYgY29udGludWUKICAgICAgICAgIGxvY2FsIGV4cGFuZGVkPSIkdGFyZ2V0IgogICAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KICAgICAgICAgICAgfiopIGV4cGFuZGVkPSIke3RhcmdldC8jXH4vJEhPTUV9IiA7OwogICAgICAgICAgZXNhYwogICAgICAgICAgbG9jYWwgcmVzb2x2ZWQKICAgICAgICAgIHJlc29sdmVkPSQocmVhbHBhdGggLW0gIiRleHBhbmRlZCIgMj4vZGV2L251bGwgfHwgcHJpbnRmICclcycgIiRleHBhbmRlZCIpCiAgICAgICAgICBpZiBbICIkcmVzb2x2ZWQiID0gIiRDVVJTT1JfV09SS19ESVIiIF0gfHwgWyAiJHJlc29sdmVkIiA9ICIvd29ya3NwYWNlIiBdIHx8ICAgICAgICAgICAgWyAiJHJlc29sdmVkIiA9ICIkSE9NRSIgXSB8fCBbWyAiJHJlc29sdmVkIiA9PSAiJEhPTUUvLnJ1c3R1cCIqIF1dOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIuKdjCBHdWFyZDogZGVzdHJ1Y3RpdmUgcm0gYmxvY2tlZCAodGFyZ2V0PSR0YXJnZXQpIiA+JjIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgIGZpCiAgICAgICAgZG9uZQogICAgICBmaQogICAgZmkKICBmaQoKICByZXR1cm4gMAp9CgpybSgpIHsKICBpZiBndWFyZF9ybSAiJEAiOyB0aGVuCiAgICBjb21tYW5kIHJtICIkQCIKICBlbHNlCiAgICByZXR1cm4gMQogIGZpCn0KCmV4cG9ydCAtZiBndWFyZF9ybSBybQoKaWYgWyAteiAiJHtDVVJTT1JfQVBJX0tFWTotfSIgXTsgdGhlbgogIGVjaG8gIuKdjCBDVVJTT1JfQVBJX0tFWSBpcyBub3Qgc2V0OyBDdXJzb3IgY2Fubm90IGF1dGhlbnRpY2F0ZSIKICBleGl0IDEKZmkKCmVjaG8gIvCflJEgVXNpbmcgcHJvdmlkZWQgQ1VSU09SX0FQSV9LRVkgZm9yIGF1dGhlbnRpY2F0aW9uIgoKaWYgWyAhIC1mICIkQ1VSU09SX1dPUktfRElSL0FHRU5UUy5tZCIgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBBR0VOVFMubWQgbWlzc2luZzsgY3JlYXRpbmcgcGxhY2Vob2xkZXIiCiAgY2F0IDw8J1BMQUNFSE9MREVSJyA+ICIkQ1VSU09SX1dPUktfRElSL0FHRU5UUy5tZCIKIyBQcm9qZWN0IEd1aWRhbmNlCgpUaGlzIEN1cnNvciBydW4gd2FzIHRyaWdnZXJlZCB3aXRob3V0IEFHRU5UUy5tZCBjb250ZW50LiBQcm92aWRlIHByb2plY3QgY29udGV4dCBpbiBBR0VOVFMubWQgdG8gZ2l2ZSBDdXJzb3IgcmljaGVyIGluc3RydWN0aW9ucy4KUExBQ0VIT0xERVIKZmkKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFByb21wdCBhc3NlbWJseSBhbmQgQ3Vyc29yIGV4ZWN1dGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClBST01QVF9QUkVGSVg9IiIKaWYgWyAtZiAiJENVUlNPUl9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh98J+UpyAqKkNSSVRJQ0FMOiBUb29sIFVzYWdlIFJlZmVyZW5jZSoqXG5cbiQoY2F0ICIkQ1VSU09SX1dPUktfRElSL3Rhc2svdG9vbG1hbi1ndWlkZS5tZCIpXG5cbi0tLVxuXG4iCmZpCgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh94pqg77iPICoqRVhFQ1VUSU9OIFJFUVVJUkVNRU5UUyAoTUFOREFUT1JZKSoqXG5cbi0gKipGb2xsb3cgcGF0dGVybnMqKjogcmVmZXJlbmNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIGluIHRoaXMgd29ya3NwYWNlLlxuLSAqKk5vIG1vY2tzIG9yIHN0dWJzKio6IGludGVncmF0ZSB3aXRoIGxpdmUgc2VydmljZXMsIEFQSXMsIGFuZCBjb25maWd1cmF0aW9uOyByZW1vdmUgYWxsIHBsYWNlaG9sZGVycy5cbi0gKipQYXJhbWV0ZXJpemUgZXZlcnl0aGluZyoqOiBldmVyeSBlbmRwb2ludCwgdGhyZXNob2xkLCBvciB0cmFkaW5nIHBhaXIgbXVzdCBjb21lIGZyb20gZW52IHZhcnMsIGNvbmZpZywgb3IgQ0xJIGZsYWdzLlxuLSAqKkZlYXR1cmUgYnJhbmNoIG9ubHkqKjogc3RheSBvbiBcYGZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvblxgOyBuZXZlciBwdXNoIGRpcmVjdGx5IHRvIG1haW4vbWFzdGVyIG9yIHJldGFyZ2V0IHRoZSBicmFuY2ggdXBzdHJlYW0uXG4tICoqRXhlY3V0ZSB3aXRob3V0IHBhdXNlKio6IGlmIHlvdSBvdXRsaW5lIGEgcGxhbiwgaW1tZWRpYXRlbHkgY2FycnkgaXQgb3V04oCUZG8gbm90IHdhaXQgZm9yIGNvbmZpcm1hdGlvbiBvciBhZGRpdGlvbmFsIGlucHV0LlxuLSAqKlF1YWxpdHkgZ2F0ZXMqKiAoQUxMIG11c3QgcGFzcyBiZWZvcmUgZGVjbGFyaW5nIHN1Y2Nlc3MpOlxuICAxLiBGb3JtYXQgY2hlY2s6IFxgcWx0eSBmbXQgLS12ZXJpZnlcYCBPUiBcYGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrXGBcbiAgMi4gTGludGluZzogXGBxbHR5IGNoZWNrIC0tYWxsXGAgQU5EIFxgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3NcYFxuICAzLiBTZWN1cml0eSBzY2FubmluZzogXGBnaXRsZWFrcyBkZXRlY3QgLS1uby1naXRcYCwgXGB0cml2eSBmcyAuIC0tc2V2ZXJpdHkgSElHSCxDUklUSUNBTFxgLCBcYGNhcmdvIGRlbnkgY2hlY2tcYFxuICA0LiBEb2NrZXJmaWxlIGxpbnRpbmcgKGlmIGFwcGxpY2FibGUpOiBcYGhhZG9saW50IERvY2tlcmZpbGVcYFxuICA1LiBUZXN0aW5nOiBcYGNhcmdvIG5leHRlc3QgcnVuIC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzXGAgT1IgXGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzXGBcbi0gKipBdXRvLWZpeCBiZWZvcmUgY29tbWl0Kio6IHJ1biBcYHFsdHkgZm10XGAgYW5kIFxgcWx0eSBjaGVjayAtLWZpeFxgIHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBmb3JtYXR0aW5nIGFuZCBsaW50aW5nIGlzc3Vlcy5cbi0gKipTZWN1cml0eSBmaXJzdCoqOiBORVZFUiBjb21taXQgY29kZSB3aXRoIHNlY3JldHMgb3IgSElHSC9DUklUSUNBTCB2dWxuZXJhYmlsaXRpZXMuXG4tICoqRG9jdW1lbnRhdGlvbiAmIFBSKio6IHVwZGF0ZSBwcm9qZWN0IGRvY3MgYW5kIG9wZW4gYSBQUiB2aWEgXGBnaCBwciBjcmVhdGVcYCB3aXRoIGxhYmVscyB0YXNrLXt7dGFza19pZH19LCBzZXJ2aWNlLXt7c2VydmljZX19LCBhbmQgcnVuLXt7d29ya2Zsb3dfbmFtZX19LlxuLSAqKlByZXNlcnZlIHdvcmtzcGFjZSoqOiBuZXZlciBkZWxldGUgdGhlIHJlcG9zaXRvcnkgb3IgcnVuIGRlc3RydWN0aXZlIGNsZWFudXAgY29tbWFuZHMgKGZvciBleGFtcGxlIFxgcm0gLXJmXGApOyBsZWF2ZSBhcnRpZmFjdHMgaW4gcGxhY2UgZm9yIFFBLlxuXG4tLS1cblxuIgoKaWYgWyAtZiAiJENVUlNPUl9XT1JLX0RJUi9naXRodWItZ3VpZGVsaW5lcy5tZCIgXSB8fCBbIC1mICIkQ1VSU09SX1dPUktfRElSL2NvZGluZy1ndWlkZWxpbmVzLm1kIiBdOyB0aGVuCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCfk5ogKipSZWZlcmVuY2UgTWF0ZXJpYWxzIEF2YWlsYWJsZSoqXG4iCiAgaWYgWyAtZiAiJENVUlNPUl9XT1JLX0RJUi9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQGdpdGh1Yi1ndWlkZWxpbmVzLm1kXG4iCiAgZmkKICBpZiBbIC1mICIkQ1VSU09SX1dPUktfRElSL2NvZGluZy1ndWlkZWxpbmVzLm1kIiBdOyB0aGVuCiAgICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBAY29kaW5nLWd1aWRlbGluZXMubWRcbiIKICBmaQogIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH1cbi0tLVxuXG4iCmZpCgppZiBbIC1mICIkQ1VSU09SX1dPUktfRElSL0FHRU5UUy5tZCIgXTsgdGhlbgogIGlmIEFHRU5UX0dVSURBTkNFPSQoanEgLVJzIEBqc29uICIkQ1VSU09SX1dPUktfRElSL0FHRU5UUy5tZCIgMj4vZGV2L251bGwpOyB0aGVuCiAgICBpZiBbICIkeyNBR0VOVF9HVUlEQU5DRX0iIC1ndCAyIF07IHRoZW4KICAgICAgQUdFTlRfR1VJREFOQ0U9JHtBR0VOVF9HVUlEQU5DRToxOi0xfQogICAgICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh98J+noCAqKkFnZW50IEd1aWRhbmNlKipcblxuJHtBR0VOVF9HVUlEQU5DRX1cblxuLS0tXG5cbiIKICAgIGZpCiAgZmkKZmkKCmVjaG8gIvCflI0gREVCVUc6IEFib3V0IHRvIGNoZWNrIGZvciBwcm9tcHQubWQgYXQ6ICRDVVJTT1JfV09SS19ESVIvdGFzay9wcm9tcHQubWQiCmVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhc2sgZGlyZWN0b3J5OiIKbHMgLWxhICIkQ1VSU09SX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW1wdHkiCmVjaG8gIvCflI0gREVCVUc6IEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgY29udGVudHM6IgpscyAtbGEgIiRDVVJTT1JfV09SS19ESVIvIiB8fCBlY2hvICJXb3JraW5nIGRpcmVjdG9yeSBub3QgYWNjZXNzaWJsZSIKClBST01QVF9GSUxFPSIkQ1VSU09SX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgppZiBbICEgLWYgIiRQUk9NUFRfRklMRSIgXTsgdGhlbgogIGVjaG8gIuKdjCBwcm9tcHQubWQgbm90IGZvdW5kIGF0ICRQUk9NUFRfRklMRSIKICBleGl0IDEKZmkKCmVjaG8gInN0YXJ0aW5nVGFzazp7e3Rhc2tfaWR9fSIKZWNobyAiIgoKUFJPTVBUX0NPTlRFTlQ9IiR7UFJPTVBUX1BSRUZJWH0kKGNhdCAiJFBST01QVF9GSUxFIikiCgplY2hvICLwn6e+IFJlc29sdmVkIHByb21wdCBjb250ZW50ICh0cnVuY2F0ZWQgdG8gMjAwMCBjaGFycyBmb3IgbG9nIHNhZmV0eSk6IgpQUk9NUFRfUFJFVklFVz0kKHByaW50ZiAnJXMnICIkUFJPTVBUX0NPTlRFTlQiIHwgaGVhZCAtYyAyMDAwKQpwcmludGYgJyVzXG4nICIkUFJPTVBUX1BSRVZJRVciClBST01QVF9CWVRFUz0kKHByaW50ZiAnJXMnICIkUFJPTVBUX0NPTlRFTlQiIHwgd2MgLWMgfCB0ciAtZCAnWzpzcGFjZTpdJykKZWNobyAi8J+TjyBQcm9tcHQgc2l6ZTogJFBST01QVF9CWVRFUyBieXRlcyIKCk1BWF9SRVRSSUVTPSR7Q1VSU09SX01BWF9SRVRSSUVTOi0ke0VYRUNVVElPTl9NQVhfUkVUUklFUzotNX19CkFUVEVNUFQ9MQpTVUNDRVNTPTAKQ1VSU09SX0VYSVQ9MQpMQVNUX01FU1NBR0VfRklMRT0iIgpSVU5fTE9HPSIiCgojIENpcmN1aXQgYnJlYWtlcjogdHJhY2sgcmVwZWF0ZWQgY29tbWFuZCBmYWlsdXJlcwpkZWNsYXJlIC1BIEZBSUxFRF9DT01NQU5EUwpNQVhfU0FNRV9DT01NQU5EX0ZBSUxVUkVTPTMKCkZPUkNFX1dSSVRFUz0ie3sjaWYgZm9yY2Vfd3JpdGVzfX10cnVle3tlbHNlfX1mYWxzZXt7L2lmfX0iCk9VVFBVVF9GT1JNQVQ9Int7I2lmIG91dHB1dF9mb3JtYXR9fXt7b3V0cHV0X2Zvcm1hdH19e3tlbHNlfX1zdHJlYW0tanNvbnt7L2lmfX0iCgpGT1JDRV9GTEFHPSIiCmlmIFsgIiR7Rk9SQ0VfV1JJVEVTLCx9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgRk9SQ0VfRkxBRz0iLS1mb3JjZSIKZmkKCndoaWxlIFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGVjaG8gIvCfmoAgQ3Vyc29yIGV4ZWN1dGlvbiBhdHRlbXB0ICRBVFRFTVBULyRNQVhfUkVUUklFUyIKICBMQVNUX01FU1NBR0VfRklMRT0iL3RtcC9jdXJzb3ItbGFzdC1tZXNzYWdlLSR7QVRURU1QVH0udHh0IgogIFJVTl9MT0c9Ii90bXAvY3Vyc29yLXJ1bi0ke0FUVEVNUFR9Lmpzb25sIgoKICBDVVJTT1JfQ01EPSgiY3Vyc29yLWFnZW50IiAiLS1wcmludCIgIi0tb3V0cHV0LWZvcm1hdCIgIiRPVVRQVVRfRk9STUFUIikKICB7eyNpZiBtb2RlbH19CiAgQ1VSU09SX0NNRCs9KCItLW1vZGVsIiAie3ttb2RlbH19IikKICB7ey9pZn19CiAgaWYgWyAtbiAiJEZPUkNFX0ZMQUciIF07IHRoZW4KICAgIENVUlNPUl9DTUQrPSgiJEZPUkNFX0ZMQUciKQogIGZpCiAgQ1VSU09SX0NNRCs9KCIkUFJPTVBUX0NPTlRFTlQiKQoKICBlY2hvICLwn5SnIGN1cnNvci1hZ2VudCBpbnZvY2F0aW9uIGFyZ3VtZW50cyAoJHsjQ1VSU09SX0NNRFtAXX0gZW50cmllcyk6IgogIGZvciBpZHggaW4gIiR7IUNVUlNPUl9DTURbQF19IjsgZG8KICAgIHByaW50ZiAnICAgIFslZF0gJXNcbicgIiRpZHgiICIke0NVUlNPUl9DTURbJGlkeF19IgogIGRvbmUKCiAgc2V0ICtlCiAgc2V0IC1vIHBpcGVmYWlsCiAgIiR7Q1VSU09SX0NNRFtAXX0iIHwgdGVlICIkUlVOX0xPRyIKICBDVVJTT1JfRVhJVD0ke1BJUEVTVEFUVVNbMF19CiAgc2V0ICtvIHBpcGVmYWlsCiAgc2V0IC1lCgogIGVjaG8gIltjdXJzb3ItZGVidWddIEF0dGVtcHQgJEFUVEVNUFQgZmluaXNoZWQgd2l0aCBleGl0IGNvZGUgJENVUlNPUl9FWElUIgoKICBpZiBbICRDVVJTT1JfRVhJVCAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQ3Vyc29yIGV4aXRlZCB3aXRoIHN0YXR1cyAkQ1VSU09SX0VYSVQgb24gYXR0ZW1wdCAkQVRURU1QVCIKICBmaQoKICAjIENpcmN1aXQgYnJlYWtlcjogZGV0ZWN0IHJlcGVhdGVkIGZhaWxpbmcgYmFzaCBjb21tYW5kcwogIGlmIFsgLWYgIiRSVU5fTE9HIiBdICYmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAjIFRyeSB0byBleHRyYWN0IGZhaWxlZCBiYXNoL3NoZWxsIGNvbW1hbmRzIGZyb20gSlNPTiBsb2cKICAgICMgQ3Vyc29yIGZvcm1hdDogbG9vayBmb3Igc2hlbGwgdG9vbCBmYWlsdXJlcwogICAgRkFJTEVEX0NNRD0kKGpxIC1yICdzZWxlY3QoLnR5cGU9PSJ0b29sX2NhbGwiIGFuZCAuc3VidHlwZT09ImNvbXBsZXRlZCIgYW5kICgudG9vbF9jYWxsLnNoZWxsVG9vbENhbGwucmVzdWx0LmV4aXRDb2RlIC8vIDApICE9IDApIHwgLnRvb2xfY2FsbC5zaGVsbFRvb2xDYWxsLmFyZ3MuY29tbWFuZCcgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xIHwgaGVhZCAtYyAxMDApCiAgICAKICAgIGlmIFsgLW4gIiRGQUlMRURfQ01EIiBdOyB0aGVuCiAgICAgICMgVHJhY2sgaG93IG1hbnkgdGltZXMgdGhpcyBjb21tYW5kIGhhcyBmYWlsZWQKICAgICAgRkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdPSQoKCR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdOi0wfSArIDEpKQogICAgICBGQUlMX0NPVU5UPSR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdfQogICAgICAKICAgICAgaWYgWyAkRkFJTF9DT1VOVCAtZ2UgJE1BWF9TQU1FX0NPTU1BTkRfRkFJTFVSRVMgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflLQgQ0lSQ1VJVCBCUkVBS0VSIFRSSUdHRVJFRDogQ29tbWFuZCBoYXMgZmFpbGVkICRGQUlMX0NPVU5UIHRpbWVzIGluIGEgcm93OiIKICAgICAgICBlY2hvICIgICBDb21tYW5kOiAkRkFJTEVEX0NNRCIKICAgICAgICBlY2hvICIgICBUaGlzIGluZGljYXRlcyB0aGUgYWdlbnQgaXMgc3R1Y2sgaW4gYSBsb29wLiIKICAgICAgICAKICAgICAgICAjIEluamVjdCBpbnRlcnZlbnRpb24gcHJvbXB0IGZvciBuZXh0IGF0dGVtcHQKICAgICAgICBQUk9NUFRfQ09OVEVOVD0iJHtQUk9NUFRfQ09OVEVOVH0KCuKaoO+4jyAqKkxPT1AgREVURUNURUQqKjogWW91IHRyaWVkIHRoaXMgY29tbWFuZCAkRkFJTF9DT1VOVCB0aW1lczoKXGBcYFxgYmFzaAokRkFJTEVEX0NNRApcYFxgXGAKCkl0IGtlZXBzIGZhaWxpbmcuICoqU1RPUCBSRVBFQVRJTkcgVEhJUyBDT01NQU5ELioqCgpUcnkgaW5zdGVhZDoKMS4gQ2hlY2sgd29ya2luZyBkaXJlY3Rvcnk6IFxgcHdkXGAKMi4gTGlzdCBmaWxlczogXGBscyAtbGFcYAozLiBVc2UgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBhcHByb2FjaAo0LiBDcmVhdGUgZmlsZXMvZGlyZWN0b3JpZXMgc3RlcC1ieS1zdGVwIgogICAgICAgIAogICAgICAgICMgUmVzZXQgY291bnRlcgogICAgICAgIEZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXT0wCiAgICAgIGZpCiAgICBmaQogIGZpCgogICMgRXh0cmFjdCB0b2tlbiB1c2FnZSBmb3IgY29zdCB0cmFja2luZwogIGlmIFsgLWYgIiRSVU5fTE9HIiBdICYmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBUT0tFTlNfSU49JChqcSAtciAnc2VsZWN0KC5tZXRhZGF0YS51c2FnZS5pbnB1dFRva2VucyAhPSBudWxsKSB8IC5tZXRhZGF0YS51c2FnZS5pbnB1dFRva2VucycgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xKQogICAgVE9LRU5TX09VVD0kKGpxIC1yICdzZWxlY3QoLm1ldGFkYXRhLnVzYWdlLm91dHB1dFRva2VucyAhPSBudWxsKSB8IC5tZXRhZGF0YS51c2FnZS5vdXRwdXRUb2tlbnMnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSkKICAgIAogICAgaWYgW1sgIiRUT0tFTlNfSU4iID1+IF5bMC05XSskIF1dICYmIFtbICIkVE9LRU5TX09VVCIgPX4gXlswLTldKyQgXV07IHRoZW4KICAgICAgVE9LRU5TX1RPVEFMPSQoKFRPS0VOU19JTiArIFRPS0VOU19PVVQpKQogICAgICBlY2hvICLwn5OKIEN1cnNvciB0b2tlbnMgdGhpcyBhdHRlbXB0OiBpbnB1dD0kVE9LRU5TX0lOLCBvdXRwdXQ9JFRPS0VOU19PVVQsIHRvdGFsPSRUT0tFTlNfVE9UQUwiCiAgICAgIAogICAgICAjIFN0b3JlIGZvciBtZXRyaWNzIChmdXR1cmU6IHNlbmQgdG8gYmFja2VuZCkKICAgICAgZWNobyAie1wiYXR0ZW1wdFwiOiRBVFRFTVBULFwidGFza19pZFwiOlwie3t0YXNrX2lkfX1cIixcInNlcnZpY2VcIjpcInt7c2VydmljZX19XCIsXCJjbGlcIjpcImN1cnNvclwiLFwidG9rZW5zX2luXCI6JFRPS0VOU19JTixcInRva2Vuc19vdXRcIjokVE9LRU5TX09VVCxcInRva2Vuc190b3RhbFwiOiRUT0tFTlNfVE9UQUx9IiA+PiAvdG1wL2N1cnNvci1tZXRyaWNzLmpzb25sCiAgICBmaQogIGZpCgogIGlmIFsgLXMgIiRSVU5fTE9HIiBdOyB0aGVuCiAgICBSRVNVTFRfVEVYVD0kKGpxIC1yICdzZWxlY3QoLnR5cGUgPT0gInJlc3VsdCIpIHwgLnJlc3VsdCAvLyBlbXB0eScgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xKQogICAgcHJpbnRmICclc1xuJyAiJFJFU1VMVF9URVhUIiA+ICIkTEFTVF9NRVNTQUdFX0ZJTEUiCiAgZWxzZQogICAgOiA+ICIkTEFTVF9NRVNTQUdFX0ZJTEUiCiAgZmkKCiAgQ09NUExFVElPTl9QUk9NUFQ9IlRhc2sge3t0YXNrX2lkfX0gY29tcGxldGlvbiB2ZXJpZmljYXRpb24uCgoqKkZJUlNUKio6IFJldmlldyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYSBpbiB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQKCioqVGhlbiBhbnN3ZXIgJ3llcycgT05MWSBpZiBBTEwgb2YgdGhlc2UgYXJlIHRydWU6KioKCjEuICoqRVZFUlkgYWNjZXB0YW5jZSBjcml0ZXJpb24gaXMgZnVsbHkgaW1wbGVtZW50ZWQqKiAobm90IGp1c3Qgc3RhcnRlZCwgYnV0IERPTkUpCjIuIEFsbCBjb2RlIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCB0byBnaXQKMy4gQ2hhbmdlcyBhcmUgcHVzaGVkIHRvIHJlbW90ZSBicmFuY2ggZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uCjQuIEEgcHVsbCByZXF1ZXN0IGV4aXN0cyAod2l0aCBhdCBsZWFzdCB0YXNrLXt7dGFza19pZH19IGxhYmVsOyBvdGhlciBsYWJlbHMgYXJlIG9wdGlvbmFsKQo1LiBRdWFsaXR5IGdhdGVzIHBhc3NlZCAoY2FyZ28gZm10LCBjYXJnbyBjbGlwcHkgd2l0aCBubyB3YXJuaW5ncywgdGVzdHMgcGFzcykKCioqQmUgaG9uZXN0Kio6IElmIEFOWSBhY2NlcHRhbmNlIGNyaXRlcmlvbiBpcyBpbmNvbXBsZXRlIG9yIHBhcnRpYWxseSBpbXBsZW1lbnRlZCwgYW5zd2VyICdubycgYW5kIGNvbnRpbnVlIHdvcmtpbmcuCgoqKlRvIHZlcmlmeToqKgotIFJldmlldzogY2F0IHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZAotIEdpdCBzdGF0dXM6IGdpdCBzdGF0dXMKLSBDb21taXRzIHB1c2hlZDogZ2l0IGxvZyBvcmlnaW4vbWFpbi4uSEVBRAotIFBSIGV4aXN0czogZ2ggcHIgdmlldwotIFRlc3RzIHBhc3M6IENoZWNrIHlvdXIgdGVzdCByZXN1bHRzCgpCYXNlZCBvbiB5b3VyIGhvbmVzdCBhc3Nlc3NtZW50IG9mIGFjY2VwdGFuY2UgY3JpdGVyaWEgY29tcGxldGlvbiwgYW5zd2VyIHdpdGggYSBzaW5nbGUgd29yZDogeWVzIG9yIG5vCgpSZXNwb25zZSAob25lIHdvcmQgb25seSk6IgogIENPTVBMRVRJT05fTEFTVF9NRVNTQUdFPSIvdG1wL2N1cnNvci1jb21wbGV0aW9uLSR7QVRURU1QVH0udHh0IgogIENPTVBMRVRJT05fTE9HPSIvdG1wL2N1cnNvci1jb21wbGV0aW9uLSR7QVRURU1QVH0ubG9nIgoKICBDT01QTEVUSU9OX0NNRD0oImN1cnNvci1hZ2VudCIgIi0tcHJpbnQiICItLW91dHB1dC1mb3JtYXQiICJ0ZXh0IikKICB7eyNpZiBtb2RlbH19CiAgQ09NUExFVElPTl9DTUQrPSgiLS1tb2RlbCIgInt7bW9kZWx9fSIpCiAge3svaWZ9fQogIENPTVBMRVRJT05fQ01EKz0oIiRDT01QTEVUSU9OX1BST01QVCIpCgogIHNldCArZQogIHNldCAtbyBwaXBlZmFpbAogIENPTVBMRVRJT05fT1VUUFVUPSQoIiR7Q09NUExFVElPTl9DTURbQF19IiAyPiYxIHwgdGVlICIkQ09NUExFVElPTl9MT0ciKQogIENPTVBMRVRJT05fRVhJVD0ke1BJUEVTVEFUVVNbMF19CiAgc2V0ICtvIHBpcGVmYWlsCiAgc2V0IC1lCgogIHByaW50ZiAnJXNcbicgIiRDT01QTEVUSU9OX09VVFBVVCIgPiAiJENPTVBMRVRJT05fTEFTVF9NRVNTQUdFIgogIGVjaG8gIvCfp60gQ29tcGxldGlvbiBwcm9iZSByZXNwb25zZToiCiAgcHJpbnRmICclc1xuJyAiJENPTVBMRVRJT05fT1VUUFVUIgoKICBpZiBbICRDT01QTEVUSU9OX0VYSVQgLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIENvbXBsZXRpb24gcHJvYmUgZXhpdGVkIHdpdGggc3RhdHVzICRDT01QTEVUSU9OX0VYSVQiCiAgZmkKCiAgQ09NUExFVElPTl9SRVNQT05TRT0kKHByaW50ZiAnJXNcbicgIiRDT01QTEVUSU9OX09VVFBVVCIgfCB0ciAtZCAnXHInIHwgZ3JlcCAtRWlvICdcXGIoeWVzfG5vKVxcYicgfCBoZWFkIC1uMSB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogIGlmIFsgIiRDT01QTEVUSU9OX1JFU1BPTlNFIiA9ICJ5ZXMiIF07IHRoZW4KICAgIFNVQ0NFU1M9MQogICAgYnJlYWsKICBmaQoKICBlY2hvICLimqDvuI8gQ3Vyc29yIHJlcG9ydGVkIHRhc2sgaW5jb21wbGV0ZTsgcmV0cnlpbmcuLi4iCiAgQVRURU1QVD0kKChBVFRFTVBUICsgMSkpCmRvbmUKCmlmIFsgJFNVQ0NFU1MgLW5lIDEgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBDdXJzb3IgZGlkIG5vdCBjb25maXJtIHRhc2sgY29tcGxldGlvbiBhZnRlciAkTUFYX1JFVFJJRVMgYXR0ZW1wdHMiCiAgZWNobyAi4p2MIFRhc2sgaW5jb21wbGV0ZSAtIG1hcmtpbmcgYXMgRkFJTEVEIgogIEVYSVRfQ09ERT0xICAjIEZhaWwgdGhlIGpvYiBzbyBpdCBkb2Vzbid0IGFwcGVhciBzdWNjZXNzZnVsCmVsc2UKICBlY2hvICLinIUgQ3Vyc29yIGNvbmZpcm1lZCB0YXNrIGNvbXBsZXRpb24iCiAgaWYgWyAke0NVUlNPUl9FWElUOi0wfSAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQ3Vyc29yIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgY29kZSAke0NVUlNPUl9FWElUfSwgYnV0IGNvbXBsZXRpb24gcHJvYmUgcGFzc2VkIgogIGZpCiAgRVhJVF9DT0RFPTAKZmkKCmlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogIGVjaG8gIvCflI0gVmVyaWZ5aW5nIHB1bGwgcmVxdWVzdCBzdGF0dXMiCiAgZW5zdXJlX3ByX2NyZWF0ZWQKZWxzZQogIGVjaG8gIuKaoO+4jyBTa2lwcGluZyBhdXRvIFBSIGVuZm9yY2VtZW50IGR1ZSB0byBDdXJzb3IgY29tcGxldGlvbiBzdGF0dXMiCmZpCgojIFN1Ym1pdCBHaXRIdWIgUFIgcmV2aWV3IGZvciBDbGVvL1Rlc3Mgc3RhZ2VzIChlbmFibGVzIHdvcmtmbG93IHByb2dyZXNzaW9uKQpXT1JLRkxPV19TVEFHRT0iJHtXT1JLRkxPV19TVEFHRTotfSIKaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJxdWFsaXR5IiBdIHx8IFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZyIgXTsgdGhlbgogIFBSX05VTT0iJHtQUl9OVU1CRVI6LX0iCiAgaWYgWyAteiAiJFBSX05VTSIgXTsgdGhlbgogICAgIyBUcnkgdG8gZ2V0IFBSIG51bWJlciBmcm9tIGN1cnJlbnQgYnJhbmNoCiAgICBDVVJSRU5UX0JSQU5DSD0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIFsgLW4gIiRDVVJSRU5UX0JSQU5DSCIgXTsgdGhlbgogICAgICBQUl9OVU09JChnaCBwciBsaXN0IC0tc3RhdGUgb3BlbiAtLWhlYWQgIiRDVVJSRU5UX0JSQU5DSCIgLS1qc29uIG51bWJlciAtLWpxICcuWzBdLm51bWJlcicgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGZpCiAgZmkKCiAgaWYgWyAtbiAiJFBSX05VTSIgXTsgdGhlbgogICAgaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgICAgIFNUQUdFX05BTUU9IlF1YWxpdHkiCiAgICAgIFNUQUdFX0VNT0pJPSLwn5uh77iPIgogICAgICBDSEVDS1NfUEFTU0VEPSQnLSBDb2RlIGZvcm1hdHRpbmcgdmVyaWZpZWQKLSBMaW50aW5nIHBhc3NlZAotIFVuaXQgdGVzdHMgc3VjY2Vzc2Z1bAotIFF1YWxpdHkgc3RhbmRhcmRzIG1ldCcKICAgICAgTkVYVF9TVEFHRT0iZW5kLXRvLWVuZCB0ZXN0aW5nIGJ5IFRlc3MiCiAgICAgIAogICAgICBpZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInRlc3RpbmciIF07IHRoZW4KICAgICAgICAjIFRlc3MgaGFzIGZpbmFsIGFwcHJvdmFsIGF1dGhvcml0eQogICAgICAgIFNUQUdFX05BTUU9IlFBIFRlc3RpbmciCiAgICAgICAgU1RBR0VfRU1PSkk9IvCfp6oiCiAgICAgICAgQ0hFQ0tTX1BBU1NFRD0kJy0gRW5kLXRvLWVuZCB0ZXN0cyBwYXNzZWQKLSBJbnRlZ3JhdGlvbiB0ZXN0cyBzdWNjZXNzZnVsCi0gQWNjZXB0YW5jZSBjcml0ZXJpYSB2YWxpZGF0ZWQKLSBQcm9kdWN0aW9uIHJlYWRpbmVzcyBjb25maXJtZWQnCiAgICAgICAgTkVYVF9TVEFHRT0iaHVtYW4gcmV2aWV3IGFuZCBtZXJnZSIKICAgICAgICAKICAgICAgICBlY2hvICLinIUgJFNUQUdFX05BTUUgY29tcGxldGUgLSBwb3N0aW5nIEFQUFJPVkUgcmV2aWV3IChUZXNzIGZpbmFsIGFwcHJvdmFsKSIKICAgICAgICBSRVZJRVdfQk9EWV9GSUxFPSQobWt0ZW1wKQogICAgICAgIGNhdCA8PEVPRiA+ICIkUkVWSUVXX0JPRFlfRklMRSIKIyMjICRTVEFHRV9FTU9KSSAkU1RBR0VfTkFNRSBSZXZpZXcgLSBBUFBST1ZFRApBbGwgY2hlY2tzIGhhdmUgcGFzc2VkOgokQ0hFQ0tTX1BBU1NFRApSZWFkeSBmb3IgJE5FWFRfU1RBR0UuCgoqKkZpbmFsIEFwcHJvdmFsOioqIFRlc3MgaGFzIHZlcmlmaWVkIGFsbCBhY2NlcHRhbmNlIGNyaXRlcmlhIGFyZSBtZXQuCkVPRgogICAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1hcHByb3ZlIC0tYm9keS1maWxlICIkUkVWSUVXX0JPRFlfRklMRSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgZmFpbGVkIgogICAgICAgIHJtIC1mICIkUkVWSUVXX0JPRFlfRklMRSIKICAgICAgZWxzZQogICAgICAgICMgQ2xlbyBoYW5kcyBvZmYgdG8gVGVzcyB2aWEgY29tbWVudCBhbmQgbGFiZWwgKE5PVCBhcHByb3ZlKQogICAgICAgIGVjaG8gIuKchSAkU1RBR0VfTkFNRSBjaGVja3MgcGFzc2VkIC0gaGFuZGluZyBvZmYgdG8gVGVzcyIKICAgICAgICBSRVZJRVdfQk9EWV9GSUxFPSQobWt0ZW1wKQogICAgICAgIGNhdCA8PEVPRiA+ICIkUkVWSUVXX0JPRFlfRklMRSIKIyMjICRTVEFHRV9FTU9KSSAkU1RBR0VfTkFNRSBSZXZpZXcgLSBQQVNTRUQKQWxsIGNoZWNrcyBoYXZlIHBhc3NlZDoKJENIRUNLU19QQVNTRUQKCioqU3RhdHVzOioqIFJlYWR5IGZvciAkTkVYVF9TVEFHRQoqKk5leHQgU3RlcDoqKiBUZXNzIHdpbGwgbm93IHBlcmZvcm0gY29tcHJlaGVuc2l2ZSBRQSB2YWxpZGF0aW9uCgotLS0KKlF1YWxpdHkgcmV2aWV3IGJ5IENsZW8qCkVPRgogICAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIGNvbW1lbnQgIiRQUl9OVU0iIC0tYm9keS1maWxlICIkUkVWSUVXX0JPRFlfRklMRSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgY29tbWVudCBjb21tYW5kIGZhaWxlZCIKICAgICAgICBybSAtZiAiJFJFVklFV19CT0RZX0ZJTEUiCiAgICAgICAgCiAgICAgICAgIyBBZGQgcmVhZHktZm9yLXFhIGxhYmVsIHRvIHNpZ25hbCBUZXNzCiAgICAgICAgZWNobyAi8J+Pt++4jyAgQWRkaW5nICdyZWFkeS1mb3ItcWEnIGxhYmVsIHRvIHRyaWdnZXIgVGVzcyByZXZpZXciCiAgICAgICAgdGltZW91dCAzMCBnaCBwciBlZGl0ICIkUFJfTlVNIiAtLWFkZC1sYWJlbCAicmVhZHktZm9yLXFhIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIHJlYWR5LWZvci1xYSBsYWJlbCIKICAgICAgZmkKICAgIGVsc2UKICAgICAgU1RBR0VfTkFNRT0iUXVhbGl0eSIKICAgICAgU1RBR0VfRU1PSkk9IvCfm6HvuI8iCiAgICAgIElTU1VFU19ERVNDPSQnLSBSZXZpZXcgY29kZSBmb3JtYXR0aW5nCi0gRml4IGxpbnRpbmcgZXJyb3JzCi0gRW5zdXJlIHVuaXQgdGVzdHMgcGFzcwotIE1lZXQgcXVhbGl0eSBzdGFuZGFyZHMnCiAgICAgIGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZyIgXTsgdGhlbgogICAgICAgIFNUQUdFX05BTUU9IlFBIFRlc3RpbmciCiAgICAgICAgU1RBR0VfRU1PSkk9IvCfp6oiCiAgICAgICAgSVNTVUVTX0RFU0M9JCctIEZpeCBmYWlsaW5nIGVuZC10by1lbmQgdGVzdHMKLSBBZGRyZXNzIGludGVncmF0aW9uIHRlc3QgZmFpbHVyZXMKLSBWYWxpZGF0ZSBhY2NlcHRhbmNlIGNyaXRlcmlhCi0gRW5zdXJlIHByb2R1Y3Rpb24gcmVhZGluZXNzJwogICAgICBmaQoKICAgICAgZWNobyAi4p2MICRTVEFHRV9OQU1FIGlzc3VlcyBkZXRlY3RlZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgICAgUkVWSUVXX0JPRFlfRklMRT0kKG1rdGVtcCkKICAgICAgY2F0IDw8RU9GID4gIiRSRVZJRVdfQk9EWV9GSUxFIgojIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCiRTVEFHRV9OQU1FIGlzc3VlcyBkZXRlY3RlZC4gUGxlYXNlIGFkZHJlc3MgdGhlIGZvbGxvd2luZzoKJElTU1VFU19ERVNDCkVPRgogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHktZmlsZSAiJFJFVklFV19CT0RZX0ZJTEUiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgICAgcm0gLWYgIiRSRVZJRVdfQk9EWV9GSUxFIgogICAgZmkKICBlbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgbnVtYmVyIGF2YWlsYWJsZSBmb3IgJFdPUktGTE9XX1NUQUdFIHJldmlldyBzdWJtaXNzaW9uIgogIGZpCmZpCgp0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKCmlmIFsgJFNVQ0NFU1MgLW5lIDEgXTsgdGhlbgogIHt7I2lmIGFnZW50X2NvbXBsZXRpb25fbWVzc2FnZX19CmVjaG8gInt7YWdlbnRfY29tcGxldGlvbl9tZXNzYWdlfX0iCiAge3tlbHNlfX0KZWNobyAi4pqg77iPIEN1cnNvciBleGVjdXRpb24gaW5jb21wbGV0ZSIKICB7ey9pZn19CiAgZXhpdCAkRVhJVF9DT0RFCmZpCgp7eyNpZiBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fQplY2hvICJ7e2FnZW50X2NvbXBsZXRpb25fbWVzc2FnZX19Igp7e2Vsc2V9fQplY2hvICLinIUgQ3Vyc29yIGV4ZWN1dGlvbiBjb21wbGV0ZSIKe3svaWZ9fQpleGl0ICRFWElUX0NPREUK + code_cursor_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBDdXJzb3IgZW52aXJvbm1lbnQiCnt7L2lmfX0KCmlmIFsgLWYgIiRIT01FLy5jYXJnby9lbnYiIF07IHRoZW4KICAuICIkSE9NRS8uY2FyZ28vZW52IgpmaQoKaWYgWyAtZiAiL3Jvb3QvLmNhcmdvL2VudiIgXTsgdGhlbgogIC4gIi9yb290Ly5jYXJnby9lbnYiCmZpCgppZiBjb21tYW5kIC12IHJ1c3R1cCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBydXN0dXAgZGVmYXVsdCBzdGFibGUgMj4vZGV2L251bGwgfHwgdHJ1ZQpmaQoKaWYgWyAtZCAiJEhPTUUvLnJ1c3R1cC9kb3dubG9hZHMiIF07IHRoZW4KICBmaW5kICIkSE9NRS8ucnVzdHVwL2Rvd25sb2FkcyIgLW1pbmRlcHRoIDEgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCgojIEVuc3VyZSBOb2RlLmpzIGlzIGF2YWlsYWJsZSBhdCB0aGUgcGF0aCBleHBlY3RlZCBieSBjdXJzb3ItYWdlbnQKaWYgISBjb21tYW5kIC12IG5vZGUgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIE5vZGUuanMgYmluYXJ5IG5vdCBmb3VuZDsgY3Vyc29yLWFnZW50IGNhbm5vdCBydW4iCiAgZXhpdCAxCmZpCgpDVVJTT1JfUlVOVElNRV9CSU49Ii90bXAvY3Vyc29yLWFnZW50LWJpbiIKQ1VSU09SX0FHRU5UX1JPT1Q9Ii91c3IvbG9jYWwvbGliL2N1cnNvci1hZ2VudCIKQ1VSU09SX0FHRU5UX0VOVFJZPSIkQ1VSU09SX0FHRU5UX1JPT1QvaW5kZXguanMiCgpta2RpciAtcCAiJENVUlNPUl9SVU5USU1FX0JJTiIKY2F0ID4iJENVUlNPUl9SVU5USU1FX0JJTi9jdXJzb3ItYWdlbnQiIDw8J1dSQVBQRVInCiMhL2Jpbi9iYXNoCnNldCAtZXVvIHBpcGVmYWlsCgppZiAhIGNvbW1hbmQgLXYgbm9kZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLinYwgTm9kZS5qcyBiaW5hcnkgbm90IGZvdW5kIGluIFBBVEgiCiAgZXhpdCAxCmZpCgpOT0RFX0JJTj0iJChjb21tYW5kIC12IG5vZGUpIgpDVVJTT1JfQUdFTlRfUk9PVD0iL3Vzci9sb2NhbC9saWIvY3Vyc29yLWFnZW50IgpDVVJTT1JfQUdFTlRfRU5UUlk9IiRDVVJTT1JfQUdFTlRfUk9PVC9pbmRleC5qcyIKCmlmIFsgISAtZiAiJENVUlNPUl9BR0VOVF9FTlRSWSIgXTsgdGhlbgogIGVjaG8gIuKdjCBDdXJzb3IgYWdlbnQgZW50cnlwb2ludCBub3QgZm91bmQgYXQgJENVUlNPUl9BR0VOVF9FTlRSWSIKICBleGl0IDEKZmkKCmV4ZWMgIiROT0RFX0JJTiIgIiRDVVJTT1JfQUdFTlRfRU5UUlkiICIkQCIKV1JBUFBFUgpjaG1vZCAreCAiJENVUlNPUl9SVU5USU1FX0JJTi9jdXJzb3ItYWdlbnQiCmV4cG9ydCBQQVRIPSIkQ1VSU09SX1JVTlRJTUVfQklOOiRQQVRIIgoKaWYgWyAhIC14ICIvdXNyL2xvY2FsL2Jpbi9ub2RlIiBdOyB0aGVuCiAgZWNobyAi4oS577iPIEZhbGxpbmcgYmFjayB0byBjdXJzb3ItYWdlbnQgd3JhcHBlcjsgL3Vzci9sb2NhbC9iaW4vbm9kZSBtaXNzaW5nIgpmaQoKZWNobyAiUEFUSDogJFBBVEgiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBSRVRSWSBDT05GSUdVUkFUSU9OCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpNQVhfUkVUUklFU19DT05GSUc9JHtDVVJTT1JfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi01fX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDVVJTT1JfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ1VSU09SX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgppZiBbIC16ICIke0dJVEhVQl9BUFBfUFJJVkFURV9LRVk6LX0iIF0gfHwgWyAteiAiJHtHSVRIVUJfQVBQX0lEOi19IiBdOyB0aGVuCiAgZWNobyAi4p2MIE1pc3NpbmcgR2l0SHViIEFwcCBjcmVkZW50aWFscyIKICBleGl0IDEKZmkKCmVjaG8gIvCflJAgQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwIgpURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+IiRURU1QX0tFWV9GSUxFIgpjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpOT1c9JChkYXRlICslcykKRVhQPSQoKE5PVyArIDYwMCkpCkpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKcGFyc2VfcmVwbygpIHsKICBsb2NhbCBpbnB1dD0iJDEiCiAgaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLyhbXi9dKz8pKFwuZ2l0KT8kfFwxIFwyfCcKICBlbHNlCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFwuZ2l0JHx8JyB8IHNlZCAtRSAnc3woW14vXSspLyhbXi9dKyl8XDEgXDJ8JwogIGZpCn0KCnJlYWQgUkVQT19PV05FUiBSRVBPX05BTUUgPDw8IiQocGFyc2VfcmVwbyAiJFJFUE9fVVJMIikiClJFUE9fSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfS5naXQiCgpJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKCmlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogIElOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQpmaQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byByZXNvbHZlIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIKICBleGl0IDEKZmkKCkdJVEhVQl9UT0tFTj0kKGN1cmwgLXMgLVggUE9TVCBcCiAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIiB8IGpxIC1yICcudG9rZW4nKQoKaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byBvYnRhaW4gaW5zdGFsbGF0aW9uIHRva2VuIgogIGV4aXQgMQpmaQoKZXhwb3J0IEdJVEhVQl9UT0tFTgpleHBvcnQgR0hfVE9LRU49IiRHSVRIVUJfVE9LRU4iCmV4cG9ydCBHSF9IT1NUPSJnaXRodWIuY29tIgoKZXhwb3J0IEdJVF9DT05GSUdfR0xPQkFMPS93b3Jrc3BhY2UvLmdpdGNvbmZpZwpDUkVERU5USUFMU19GSUxFPS93b3Jrc3BhY2UvLmdpdC1jcmVkZW50aWFscwpta2RpciAtcCAvd29ya3NwYWNlCgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgInN0b3JlIC0tZmlsZT0kQ1JFREVOVElBTFNfRklMRSIKZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiAiJENSRURFTlRJQUxTX0ZJTEUiCgpUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykKCnJlZnJlc2hfZ2l0aHViX3Rva2VuKCkgewogIGVjaG8gIvCflIQgUmVmcmVzaGluZyBHaXRIdWIgQXBwIHRva2VuLi4uIgoKICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LSQkIgogIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIE5PVz0kKGRhdGUgKyVzKQogIEVYUD0kKChOT1cgKyA2MDApKQogIEpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgSldUX1RPS0VOPSIkSldUX0hFQURFUi4kSldUX1BBWUxPQUQuJEpXVF9TSUdOQVRVUkUiCgogIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICBpZiBbICIkTkVXX0lOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkTkVXX0lOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQogIGZpCgogIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kTkVXX0lOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgTkVXX1RPS0VOPSQoZWNobyAiJFRPS0VOX1JFU1BPTlNFIiB8IGpxIC1yICcudG9rZW4nKQoKICBpZiBbICIkTkVXX1RPS0VOIiAhPSAibnVsbCIgXSAmJiBbIC1uICIkTkVXX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgZXhwb3J0IEdIX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCiAgICBlY2hvICJodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tIiA+ICIkQ1JFREVOVElBTFNfRklMRSIKICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQiCiAgICByZXR1cm4gMAogIGZpCgogIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogIHJldHVybiAxCn0KCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICByZXR1cm4KICBmaQoKICBOT1c9JChkYXRlICslcykKICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgaWYgWyAkVE9LRU5fQUdFIC1ndCAzMDAwIF07IHRoZW4KICAgIGVjaG8gIvCflIQgVG9rZW4gYWdlOiAkKChUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMg4oCUIHJlZnJlc2hpbmciCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogIGZpCn0KCmVuc3VyZV9wcl9jcmVhdGVkKCkgewogIGlmIFsgIiR7U0tJUF9BVVRPX1BSOi0wfSIgPSAiMSIgXTsgdGhlbgogICAgZWNobyAi4o+t77iPICBBdXRvIFBSIGNyZWF0aW9uIGRpc2FibGVkIHZpYSBTS0lQX0FVVE9fUFI9MSIKICAgIHJldHVybgogIGZpCgogIGlmIFsgISAtZCAuZ2l0IF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBSZXBvc2l0b3J5IG5vdCBpbml0aWFsaXNlZDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIGlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHaXRIdWIgQ0xJIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8ganEgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIGlmIFsgLXogIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gR0lUSFVCX1RPS0VOIG5vdCBzZXQ7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBDVVJSRU5UX0JSQU5DSD0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwgfHwgcHJpbnRmICcnKQogIGlmIFsgLXogIiRDVVJSRU5UX0JSQU5DSCIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byBkZXRlcm1pbmUgY3VycmVudCBicmFuY2g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBQUl9EQVRBPSQoZ2ggcHIgbGlzdCAtLXN0YXRlIG9wZW4gLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1saW1pdCAxIDI+L2Rldi9udWxsIHx8IGVjaG8gIltdIikKICBpZiBbICIkKHByaW50ZiAnJXMnICIkUFJfREFUQSIgfCBqcSAnbGVuZ3RoJyAyPi9kZXYvbnVsbCB8fCBlY2hvIDApIiAtZ3QgMCBdOyB0aGVuCiAgICBlY2hvICLinIUgUHVsbCByZXF1ZXN0IGFscmVhZHkgZXhpc3RzIGZvciBicmFuY2ggJENVUlJFTlRfQlJBTkNIIgogICAgcmV0dXJuCiAgZmkKCiAgQkFTRV9CUkFOQ0g9IiR7UFJfQkFTRV9CUkFOQ0g6LW1haW59IgogIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogIGlmICEgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy8kUkVNT1RFX0JBU0UiOyB0aGVuCiAgICBpZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiOyB0aGVuCiAgICAgIEJBU0VfQlJBTkNIPSJtYXN0ZXIiCiAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgZWxzZQogICAgICBERUZBVUxUX1JFTU9URT0kKGdpdCBzeW1ib2xpYy1yZWYgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEIDI+L2Rldi9udWxsIHwgc2VkICdzQF5yZWZzL3JlbW90ZXMvb3JpZ2luL0BAJykKICAgICAgaWYgWyAtbiAiJERFRkFVTFRfUkVNT1RFIiBdOyB0aGVuCiAgICAgICAgQkFTRV9CUkFOQ0g9IiRERUZBVUxUX1JFTU9URSIKICAgICAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICAgICAgZWxzZQogICAgICAgIFJFTU9URV9CQVNFPSIiCiAgICAgIGZpCiAgICBmaQogIGZpCgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICBpZiBbIC1uICIkQkFTRV9CUkFOQ0giIF07IHRoZW4KICAgIGdpdCBmZXRjaCBvcmlnaW4gIiRCQVNFX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBmaQoKICBpZiBbICIkQ1VSUkVOVF9CUkFOQ0giID0gIkhFQUQiIF0gfHwgWyAiJENVUlJFTlRfQlJBTkNIIiA9ICIkQkFTRV9CUkFOQ0giIF07IHRoZW4KICAgIEFVVE9fQlJBTkNIPSJ0YXNrLXt7dGFza19pZH19LXt7c2VydmljZX19LSQoZGF0ZSArJVklbSVkLSVIJU0lUykiCiAgICBlY2hvICLimqDvuI8gQnJhbmNoICRDVVJSRU5UX0JSQU5DSCB1bnN1aXRhYmxlIGZvciBQUjsgY3JlYXRpbmcgJEFVVE9fQlJBTkNIIgogICAgaWYgISBnaXQgY2hlY2tvdXQgLUIgIiRBVVRPX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gY3JlYXRlIGZhbGxiYWNrIGJyYW5jaCAkQVVUT19CUkFOQ0giCiAgICAgIHJldHVybgogICAgZmkKICAgIENVUlJFTlRfQlJBTkNIPSIkQVVUT19CUkFOQ0giCiAgZmkKCiAgZ2l0IGFkZCAuCiAgaWYgZ2l0IGRpZmYgLS1jYWNoZWQgLS1xdWlldCAtLWV4aXQtY29kZTsgdGhlbgogICAgZWNobyAi4oS577iPIE5vIHN0YWdlZCBjaGFuZ2VzIGRldGVjdGVkIGFmdGVyIGF1dG8tc3RhZ2luZyIKICBlbHNlCiAgICBDT01NSVRfTVNHPSJjaG9yZSh7e3NlcnZpY2V9fSk6IGF1dG8tY29tbWl0IGZvciB0YXNrIHt7dGFza19pZH19IgogICAgaWYgISBnaXQgY29tbWl0IC1tICIkQ09NTUlUX01TRyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gY29tbWl0IHN0YWdlZCBjaGFuZ2VzIGF1dG9tYXRpY2FsbHkiCiAgICBlbHNlCiAgICAgIGVjaG8gIuKchSBBdXRvLWNvbW1pdHRlZCBzdGFnZWQgY2hhbmdlcyIKICAgIGZpCiAgZmkKCiAgaWYgZ2l0IHJldi1wYXJzZSAtLXZlcmlmeSAtLXF1aWV0ICIkQ1VSUkVOVF9CUkFOQ0giID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgaWYgISBnaXQgcHVzaCAtdSBvcmlnaW4gIiRDVVJSRU5UX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gcHVzaCBicmFuY2ggJENVUlJFTlRfQlJBTkNIOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgICByZXR1cm4KICAgIGZpCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byB2ZXJpZnkgYnJhbmNoICRDVVJSRU5UX0JSQU5DSDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIGdpdCBmZXRjaCBvcmlnaW4gIiRDVVJSRU5UX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBpZiBbIC1uICIkUkVNT1RFX0JBU0UiIF07IHRoZW4KICAgIEFIRUFEX0NPVU5UPSQoZ2l0IHJldi1saXN0IC0tbGVmdC1yaWdodCAiJFJFTU9URV9CQVNFLi4uJENVUlJFTlRfQlJBTkNIIiAyPi9kZXYvbnVsbCB8IGF3ayAnL14+L3tjKyt9IEVORHtwcmludCBjKzB9JykKICBlbHNlCiAgICBBSEVBRF9DT1VOVD0xCiAgZmkKICBpZiBbICIke0FIRUFEX0NPVU5UOi0wfSIgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0ggaGFzIG5vIGNvbW1pdHMgYWhlYWQgb2YgJEJBU0VfQlJBTkNIOyBza2lwcGluZyBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIFJVTl9MQUJFTD0icnVuLXt7d29ya2Zsb3dfbmFtZX19IgogIGlmIFsgIiR7UlVOX0xBQkVMI3J1bi19IiA9ICIiIF07IHRoZW4KICAgIFJVTl9MQUJFTD0icnVuLXVua25vd24iCiAgZmkKCiAgVEFTS19MQUJFTD0idGFzay17e3Rhc2tfaWR9fSIKICBTRVJWSUNFX0xBQkVMPSJzZXJ2aWNlLXt7c2VydmljZX19IgogIFJFUE9fU0xVRz0iJHtSRVBPX09XTkVSfS8ke1JFUE9fTkFNRX0iCgogIGVjaG8gIvCflI0gRW5zdXJpbmcgUFIgY29ycmVsYXRpb24gbGFiZWxzIGV4aXN0IgogIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkU0VSVklDRV9MQUJFTCIgIiRSVU5fTEFCRUwiOyBkbwogICAgaWYgWyAteiAiJGxhYmVsIiBdOyB0aGVuCiAgICAgIGNvbnRpbnVlCiAgICBmaQoKICAgIGlmIGdoIGxhYmVsIHZpZXcgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICIgICDinJMgTGFiZWwgJyRsYWJlbCcgYWxyZWFkeSBleGlzdHMiCiAgICAgIGNvbnRpbnVlCiAgICBmaQoKICAgIGNhc2UgIiRsYWJlbCIgaW4KICAgICAgdGFzay0qKSBDT0xPUj0iZjI5NTEzIjsgREVTQz0iVGFzayBjb3JyZWxhdGlvbiIgOzsKICAgICAgc2VydmljZS0qKSBDT0xPUj0iMGU4YTE2IjsgREVTQz0iU2VydmljZSBjb3JyZWxhdGlvbiIgOzsKICAgICAgcnVuLSopIENPTE9SPSIwMzY2ZDYiOyBERVNDPSJXb3JrZmxvdyBjb3JyZWxhdGlvbiIgOzsKICAgICAgKikgQ09MT1I9ImVkZWRlZCI7IERFU0M9IkF1dG9tYXRpb24gbGFiZWwiIDs7CiAgICBlc2FjCgogICAgaWYgZ2ggbGFiZWwgY3JlYXRlICIkbGFiZWwiIC1SICIkUkVQT19TTFVHIiAtLWNvbG9yICIkQ09MT1IiIC0tZGVzY3JpcHRpb24gIiRERVNDIiA+L3RtcC9naC1sYWJlbC1jcmVhdGUubG9nIDI+JjE7IHRoZW4KICAgICAgZWNobyAiICAg4pyFIENyZWF0ZWQgbGFiZWwgJyRsYWJlbCciCiAgICBlbHNlCiAgICAgIGVjaG8gIiAgIOKdjCBGYWlsZWQgdG8gY3JlYXRlIGxhYmVsICckbGFiZWwnIgogICAgICBjYXQgL3RtcC9naC1sYWJlbC1jcmVhdGUubG9nID4mMiB8fCB0cnVlCiAgICBmaQogICAgcm0gLWYgL3RtcC9naC1sYWJlbC1jcmVhdGUubG9nCiAgZG9uZQoKICBQUl9USVRMRT0iZmVhdCh7e3NlcnZpY2V9fSk6IGNvbXBsZXRlIHRhc2sge3t0YXNrX2lkfX0iCiAgcmVhZCAtciAtZCAnJyBQUl9CT0RZIDw8J0VPRicgfHwgdHJ1ZQojIyBTdW1tYXJ5Ci0gQXV0by1nZW5lcmF0ZWQgZmFsbGJhY2sgUFIgYmVjYXVzZSB0aGUgQ3Vyc29yIGFnZW50IGZpbmlzaGVkIHdpdGhvdXQgb3BlbmluZyBvbmUKLSBUYXNrIHt7dGFza19pZH19IGZvciBzZXJ2aWNlIHt7c2VydmljZX19IGlzIHJlYWR5IGZvciByZXZpZXcKCiMjIE1ldGFkYXRhCi0gQWdlbnQ6IHt7Z2l0aHViX2FwcH19Ci0gV29ya2Zsb3c6IHt7d29ya2Zsb3dfbmFtZX19Ci0gQnJhbmNoOiBcXGAkQ1VSUkVOVF9CUkFOQ0hcXGAg4oaSIFxcYCRCQVNFX0JSQU5DSFxcYAoKX1RoaXMgUFIgd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgQ3Vyc29yIGNvbnRhaW5lci5fCkVPRgoKICBMQUJFTF9BUkdTPSgiLS10aXRsZSIgIiRQUl9USVRMRSIgIi0tYm9keSIgIiRQUl9CT0RZIiAiLS1iYXNlIiAiJEJBU0VfQlJBTkNIIiAiLS1oZWFkIiAiJENVUlJFTlRfQlJBTkNIIikKCiAgbWF5YmVfYWRkX2xhYmVsKCkgewogICAgbG9jYWwgbGFiZWw9IiQxIgogICAgaWYgWyAteiAiJGxhYmVsIiBdOyB0aGVuCiAgICAgIHJldHVybgogICAgZmkKICAgIGlmIGdoIGxhYmVsIHZpZXcgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBMQUJFTF9BUkdTKz0oIi0tbGFiZWwiICIkbGFiZWwiKQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gTGFiZWwgJyRsYWJlbCcgbm90IGZvdW5kOyBza2lwcGluZyIKICAgIGZpCiAgfQoKICBtYXliZV9hZGRfbGFiZWwgIiRUQVNLX0xBQkVMIgogIG1heWJlX2FkZF9sYWJlbCAiJFNFUlZJQ0VfTEFCRUwiCiAgbWF5YmVfYWRkX2xhYmVsICIkUlVOX0xBQkVMIgoKICBpZiBnaCBwciBjcmVhdGUgIiR7TEFCRUxfQVJHU1tAXX0iOyB0aGVuCiAgICBlY2hvICLinIUgQXV0by1jcmVhdGVkIHB1bGwgcmVxdWVzdCBmb3IgJENVUlJFTlRfQlJBTkNIIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gY3JlYXRlIHB1bGwgcmVxdWVzdCBhdXRvbWF0aWNhbGx5IChpdCBtYXkgYWxyZWFkeSBleGlzdCBvciBhdXRoZW50aWNhdGlvbiBmYWlsZWQpIgogIGZpCn0KCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKZGVyaXZlX2JvdF9pZGVudGl0eSgpIHsKICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iYXV0b21hdGlvbltib3RdQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHNsdWcKICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgaWYgWyAteiAiJHNsdWciIF07IHRoZW4KICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogIGZpCgogIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF07IHRoZW4KICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgbG9jYWwgYm90X3Jlc3BvbnNlCiAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgbG9jYWwgYm90X2lkCiAgICBib3RfaWQ9JChwcmludGYgJyVzJyAiJGJvdF9yZXNwb25zZSIgfCBqcSAtciAnLmlkIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCB8fCBlY2hvICcnKQogICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgZmkKICBmaQoKICBHSVRfQVVUSE9SX05BTUU9IiRib3RfbG9naW4iCiAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQVVUSE9SX05BTUUKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwKZXhwb3J0IEdJVF9DT01NSVRURVJfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUmVwb3NpdG9yeSBjaGVja291dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBXT1JLX0RJUj0ie3tzZXJ2aWNlfX0iCmZpCgpUQVJHRVRfRElSPSIvd29ya3NwYWNlLyRXT1JLX0RJUiIKbWtkaXIgLXAgIiRUQVJHRVRfRElSIgpjZCAvd29ya3NwYWNlCgppZiBbIC1kICIkUkVQT19OQU1FLy5naXQiIF07IHRoZW4KICBlY2hvICLwn5SBIFJlcG9zaXRvcnkgYWxyZWFkeSBjbG9uZWQsIGZldGNoaW5nIGxhdGVzdCIKICBjZCAiJFJFUE9fTkFNRSIKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogIGdpdCBmZXRjaCAtLWFsbCAtLXBydW5lCmVsc2UKICBlY2hvICLirIfvuI8gIENsb25pbmcgcmVwb3NpdG9yeSIKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogIGdpdCBjbG9uZSAiJFJFUE9fSFRUUF9VUkwiCiAgY2QgIiRSRVBPX05BTUUiCmZpCgpSRVBPX1JPT1Q9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAiJFJFUE9fUk9PVCIKY2QgIiRSRVBPX1JPT1QiCgplY2hvICI9PT0gQlJBTkNIIFNFVFVQID09PSIKIyBSZW1vdmUgc3RhbGUgYXV0b21hdGlvbi1tYW5hZ2VkIGZpbGVzIHRoYXQgYmxvY2sgYnJhbmNoIGNoZWNrb3V0IHdoZW4gcmVydW5uaW5nCk1BTkFHRURfUEFUSFM9KAogICIubWNwLmpzb24iCiAgIkFHRU5UUy5tZCIKICAiY2xpZW50LWNvbmZpZy5qc29uIgogICJjb2RpbmctZ3VpZGVsaW5lcy5tZCIKICAiZ2l0aHViLWd1aWRlbGluZXMubWQiCiAgInRhc2siCikKCmZvciBtYW5hZ2VkX3BhdGggaW4gIiR7TUFOQUdFRF9QQVRIU1tAXX0iOyBkbwogIGlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggIiRtYW5hZ2VkX3BhdGgiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY29udGludWUKICBmaQogIGlmIFsgLWUgIiRtYW5hZ2VkX3BhdGgiIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgUmVtb3Zpbmcgc3RhbGUgZmlsZSB0byBhbGxvdyBjaGVja291dDogJG1hbmFnZWRfcGF0aCIKICAgIHJtIC1yZiAiJG1hbmFnZWRfcGF0aCIKICBmaQpkb25lCgpCQVNFX0JSQU5DSD0iJHtQUl9CQVNFX0JSQU5DSDotbWFpbn0iClJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgoKaWYgISBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAjIEZhbGwgYmFjayB0byBvcmlnaW4vbWFzdGVyIG9yIHRoZSByZW1vdGUgSEVBRCBpZiBtYWluIGlzIGFic2VudAogIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciI7IHRoZW4KICAgIEJBU0VfQlJBTkNIPSJtYXN0ZXIiCiAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICBlbHNlCiAgICBERUZBVUxUX1JFTU9URT0kKGdpdCBzeW1ib2xpYy1yZWYgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEIDI+L2Rldi9udWxsIHwgc2VkICdzQF5yZWZzL3JlbW90ZXMvb3JpZ2luL0BAJykKICAgIGlmIFsgLW4gIiRERUZBVUxUX1JFTU9URSIgXTsgdGhlbgogICAgICBCQVNFX0JSQU5DSD0iJERFRkFVTFRfUkVNT1RFIgogICAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICAgIGVsc2UKICAgICAgUkVNT1RFX0JBU0U9IiIKICAgIGZpCiAgZmkKZmkKCmlmIFsgLW4gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogIGdpdCBmZXRjaCBvcmlnaW4gIiRCQVNFX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKZmkKCkZFQVRVUkVfQlJBTkNIPSJmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24iCmlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL2hlYWRzLyRGRUFUVVJFX0JSQU5DSCI7IHRoZW4KICBlY2hvICJGZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBleGlzdHMsIGNoZWNraW5nIG91dC4uLiIKICAjIFN0YXNoIGFueSBsb2NhbCBjaGFuZ2VzIGZyb20gcHJldmlvdXMgcnVucyB0byBhdm9pZCBjaGVja291dCBjb25mbGljdHMKICBpZiAhIGdpdCBkaWZmLWluZGV4IC0tcXVpZXQgSEVBRCAtLSB8fCBbIC1uICIkKGdpdCBscy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGUtc3RhbmRhcmQpIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIFN0YXNoaW5nIGxvY2FsIGNoYW5nZXMgYW5kIHVudHJhY2tlZCBmaWxlcyBiZWZvcmUgY2hlY2tvdXQiCiAgICBnaXQgc3Rhc2ggcHVzaCAtLWluY2x1ZGUtdW50cmFja2VkIC1tICJBdXRvLXN0YXNoIGJlZm9yZSBjaGVja291dCAoJChkYXRlIC11ICslWSVtJWQtJUglTSVTKSkiIHx8IHRydWUKICBmaQogIGdpdCBjaGVja291dCAiJEZFQVRVUkVfQlJBTkNIIgogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXTsgdGhlbgogICAgZWNobyAi8J+TpSBGYXN0LWZvcndhcmRpbmcgJEZFQVRVUkVfQlJBTkNIIHdpdGggJFJFTU9URV9CQVNFIgogICAgaWYgISBnaXQgbWVyZ2UgIiRSRU1PVEVfQkFTRSIgLS1mZi1vbmx5ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGZhc3QtZm9yd2FyZCAkRkVBVFVSRV9CUkFOQ0g7IGNyZWF0aW5nIGZyZXNoIGJyYW5jaCBmcm9tICRSRU1PVEVfQkFTRSIKICAgICAgTkVXX0JSQU5DSD0iJHtGRUFUVVJFX0JSQU5DSH0tJChkYXRlIC11ICslWSVtJWQlSCVNJVMpIgogICAgICBnaXQgY2hlY2tvdXQgLUIgIiRORVdfQlJBTkNIIiAiJFJFTU9URV9CQVNFIgogICAgICBGRUFUVVJFX0JSQU5DSD0iJE5FV19CUkFOQ0giCiAgICBmaQogIGZpCmVsc2UKICBlY2hvICJDcmVhdGluZyBuZXcgZmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCciCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdICYmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvJFJFTU9URV9CQVNFIjsgdGhlbgogICAgZ2l0IGNoZWNrb3V0IC1iICIkRkVBVFVSRV9CUkFOQ0giICIkUkVNT1RFX0JBU0UiCiAgZWxzZQogICAgZ2l0IGNoZWNrb3V0IC1iICIkRkVBVFVSRV9CUkFOQ0giCiAgZmkKZmkKCmdpdCBjb25maWcgLS1sb2NhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1sb2NhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKZ2l0IGNvbmZpZyAtLWxvY2FsIHB1c2guYXV0b1NldHVwUmVtb3RlIHRydWUKZXhwb3J0IElNUExFTUVOVEFUSU9OX0JSQU5DSD0iJEZFQVRVUkVfQlJBTkNIIgplY2hvICLinJMgVXNpbmcgZmVhdHVyZSBicmFuY2g6ICRGRUFUVVJFX0JSQU5DSCAoYmFzZTogJHtCQVNFX0JSQU5DSDotdW5rbm93bn0pIgoKIyBTZXQgd29ya2luZyBkaXJlY3Rvcnk6IHVzZSByZXBvIHJvb3QgaWYgd29ya2luZ19kaXJlY3RvcnkgaXMgIi4iIG9yIGVtcHR5CmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF0gfHwgWyAiJFdPUktfRElSIiA9ICJudWxsIiBdOyB0aGVuCiAgQ1VSU09SX1dPUktfRElSPSIkUkVQT19ST09UIgplbHNlCiAgQ1VSU09SX1dPUktfRElSPSIkUkVQT19ST09ULyRXT1JLX0RJUiIKICBta2RpciAtcCAiJENVUlNPUl9XT1JLX0RJUiIKZmkKCmNkICIkQ1VSU09SX1dPUktfRElSIgplY2hvICLinJMgV29ya2luZyBkaXJlY3Rvcnk6ICRDVVJTT1JfV09SS19ESVIiCgplY2hvICLwn5OmIGdpdCBzdGF0dXMiCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCmdpdCBzdGF0dXMgLS1zaG9ydCB8fCB0cnVlCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBNYXRlcmlhbGlzZSB0YXNrIGNvbnRleHQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgplY2hvICLwn6exIFN5bmNpbmcgdGFzayBhc3NldHMiCm1rZGlyIC1wICIkQ1VSU09SX1dPUktfRElSL3Rhc2siCm1rZGlyIC1wICIkQ1VSU09SX1dPUktfRElSLy5jdXJzb3IiCm1rZGlyIC1wICIkSE9NRS8uY3Vyc29yIgpjcCAtUiAvdGFzay1maWxlcy90YXNrLyogIiRDVVJTT1JfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKCkRPQ1NfUkVQT19VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgpET0NTX0JSQU5DSD0ie3tkb2NzX2JyYW5jaH19IgpET0NTX1BST0pFQ1RfRElSRUNUT1JZPSJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKCmlmIFsgLW4gIiRET0NTX1JFUE9fVVJMIiBdICYmIFsgIiRET0NTX1JFUE9fVVJMIiAhPSAibnVsbCIgXTsgdGhlbgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgaWYgWyAteiAiJERPQ1NfQlJBTkNIIiBdIHx8IFsgIiRET0NTX0JSQU5DSCIgPSAibnVsbCIgXTsgdGhlbgogICAgRE9DU19CUkFOQ0g9Im1haW4iCiAgZmkKCiAgZWNobyAi8J+TmiBTeW5jaW5nIGRvY3MgcmVwb3NpdG9yeTogJERPQ1NfUkVQT19VUkwgKGJyYW5jaDogJERPQ1NfQlJBTkNIKSIKICBET0NTX0NMT05FX0RJUj0iL3RtcC9kb2NzLXJlcG8iCiAgcm0gLXJmICIkRE9DU19DTE9ORV9ESVIiCgogIHJlYWQgRE9DU19PV05FUiBET0NTX05BTUUgPDw8IiQocGFyc2VfcmVwbyAiJERPQ1NfUkVQT19VUkwiKSIKICBET0NTX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20vJHtET0NTX09XTkVSfS8ke0RPQ1NfTkFNRX0uZ2l0IgoKICBpZiBnaXQgY2xvbmUgLS1xdWlldCAtLWJyYW5jaCAiJERPQ1NfQlJBTkNIIiAtLXNpbmdsZS1icmFuY2ggIiRET0NTX0hUVFBfVVJMIiAiJERPQ1NfQ0xPTkVfRElSIjsgdGhlbgogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbG9uZWQiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjbG9uZSBkb2NzIGJyYW5jaCAnJERPQ1NfQlJBTkNIJzsgYXR0ZW1wdGluZyBkZWZhdWx0IGJyYW5jaCIKICAgIGlmIGdpdCBjbG9uZSAtLXF1aWV0ICIkRE9DU19IVFRQX1VSTCIgIiRET0NTX0NMT05FX0RJUiI7IHRoZW4KICAgICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbG9uZWQgdXNpbmcgZGVmYXVsdCBicmFuY2giCiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBVbmFibGUgdG8gY2xvbmUgZG9jcyByZXBvc2l0b3J5OiAkRE9DU19IVFRQX1VSTCIKICAgICAgRE9DU19DTE9ORV9ESVI9IiIKICAgIGZpCiAgZmkKCiAgaWYgWyAtbiAiJERPQ1NfQ0xPTkVfRElSIiBdOyB0aGVuCiAgICBET0NTX0JBU0VfUEFUSD0iJERPQ1NfQ0xPTkVfRElSLy50YXNrbWFzdGVyIgogICAgaWYgWyAtbiAiJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkiIF0gJiYgWyAiJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkiICE9ICJudWxsIiBdOyB0aGVuCiAgICAgIERPQ1NfQkFTRV9QQVRIPSIkRE9DU19DTE9ORV9ESVIvJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkvLnRhc2ttYXN0ZXIiCiAgICBmaQoKICAgIGVjaG8gIvCflI0gRG9jcyBiYXNlIHBhdGg6ICRET0NTX0JBU0VfUEFUSCIKICAgIFRBU0tfRElSPSIkRE9DU19CQVNFX1BBVEgvZG9jcy90YXNrLXt7dGFza19pZH19IgoKICAgIGlmIFsgLWQgIiRUQVNLX0RJUiIgXTsgdGhlbgogICAgICBlY2hvICLinJMgQ29weWluZyB0YXNrIGRlZmluaXRpb24gZnJvbSAkVEFTS19ESVIiCiAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgICAgIGNwIC1SICIkVEFTS19ESVIiLy4gIiRDVVJTT1JfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJFRBU0tfRElSIgogICAgZmkKCiAgICBpZiBbIC1mICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgXTsgdGhlbgogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogICAgICBjcCAiJERPQ1NfQkFTRV9QQVRIL3Rhc2tzLmpzb24iICIkQ1VSU09SX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGZpCmVsc2UKICBlY2hvICLimqDvuI8gRG9jcyByZXBvc2l0b3J5IFVSTCBub3QgcHJvdmlkZWQ7IHNraXBwaW5nIHRhc2sgZG9jcyBzeW5jIgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9BR0VOVFMubWQgXTsgdGhlbgogIGNwIC1mIC90YXNrLWZpbGVzL0FHRU5UUy5tZCAiJENVUlNPUl9XT1JLX0RJUi9BR0VOVFMubWQiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kIF07IHRoZW4KICBjcCAtZiAvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCAiJENVUlNPUl9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgXTsgdGhlbgogIGNwIC1mIC90YXNrLWZpbGVzL2dpdGh1Yi1ndWlkZWxpbmVzLm1kICIkQ1VSU09SX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGdpdGh1Yi1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gXTsgdGhlbgogIGNwIC1mIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiJENVUlNPUl9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjbGllbnQtY29uZmlnLmpzb24gdG8gd29ya2luZyBkaXJlY3RvcnkiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL21jcC5qc29uIF07IHRoZW4KICBjcCAtZiAvdGFzay1maWxlcy9tY3AuanNvbiAiJENVUlNPUl9XT1JLX0RJUi8ubWNwLmpzb24iCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL2N1cnNvci1jbGkuanNvbiBdOyB0aGVuCiAgbWtkaXIgLXAgIiRDVVJTT1JfV09SS19ESVIvLmN1cnNvciIKICBjcCAtZiAvdGFzay1maWxlcy9jdXJzb3ItY2xpLmpzb24gIiRDVVJTT1JfV09SS19ESVIvLmN1cnNvci9jbGkuanNvbiIKICBlY2hvICLinJMgSW5zdGFsbGVkIHByb2plY3QtbGV2ZWwgY3Vyc29yIENMSSBwZXJtaXNzaW9ucyIKZWxzZQogIGVjaG8gIuKaoO+4jyBjdXJzb3ItY2xpLmpzb24gbm90IHByb3ZpZGVkOyB1c2luZyBkZWZhdWx0IHByb2plY3QgcGVybWlzc2lvbnMiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL2N1cnNvci1jbGktY29uZmlnLmpzb24gXTsgdGhlbgogIG1rZGlyIC1wICIkSE9NRS8uY3Vyc29yIgogIGNwIC1mIC90YXNrLWZpbGVzL2N1cnNvci1jbGktY29uZmlnLmpzb24gIiRIT01FLy5jdXJzb3IvY2xpLWNvbmZpZy5qc29uIgogIGVjaG8gIuKckyBJbnN0YWxsZWQgZ2xvYmFsIGN1cnNvciBDTEkgY29uZmlnIgplbHNlCiAgZWNobyAi4pqg77iPIGN1cnNvci1jbGktY29uZmlnLmpzb24gbm90IHByb3ZpZGVkOyB1c2luZyBleGlzdGluZyBnbG9iYWwgQ3Vyc29yIGNvbmZpZyIKZmkKCmlmIFsgISAtZiAiJE1DUF9DTElFTlRfQ09ORklHIiBdOyB0aGVuCiAgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtaXNzaW5nIGZyb20gd29ya3NwYWNlOyByZXF1aXJlZCBmb3IgTUNQL3Rvb2xtYW4iCiAgZXhpdCAxCmZpCgplY2hvICI9PT0gTUNQIFBSRUNIRUNLUyA9PT0iCmlmICEgY29tbWFuZCAtdiB0b29sbWFuID4vZGV2L251bGwgMj4mMTsgdGhlbgogIGVjaG8gIuKdjCAndG9vbG1hbicgQ0xJIG5vdCBmb3VuZCBpbiBQQVRIOyByZXF1aXJlZCBmb3IgTUNQIgogIGV4aXQgMQpmaQoKV09SS1NQQUNFX0NGRz0iJE1DUF9DTElFTlRfQ09ORklHIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iClRBUkdFVF9DRkc9IiR7TUNQX0NMSUVOVF9DT05GSUc6LS93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29ufSIKCmlzX3ZhbGlkX2NmZygpIHsKICBsb2NhbCBwYXRoPSIkMSIKICBbIC1mICIkcGF0aCIgXSB8fCByZXR1cm4gMQogIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBqcSAtZSAndHlwZT09Im9iamVjdCIgYW5kIGxlbmd0aD49MCcgIiRwYXRoIiA+L2Rldi9udWxsIDI+JjEKICBlbHNlCiAgICBbIC1zICIkcGF0aCIgXQogIGZpCn0KCmlmIGlzX3ZhbGlkX2NmZyAiJFdPUktTUEFDRV9DRkciOyB0aGVuCiAgIyBPbmx5IGNvcHkgaWYgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgZGlmZmVyZW50IGZpbGVzCiAgaWYgWyAiJFdPUktTUEFDRV9DRkciICE9ICIkVEFSR0VUX0NGRyIgXTsgdGhlbgogICAgY3AgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiAiJFRBUkdFVF9DRkciCiAgZmkKICBlY2hvICLinJMgVXNpbmcgTUNQIGNsaWVudCBjb25maWcgZnJvbSB3b3Jrc3BhY2U6ICRUQVJHRVRfQ0ZHIgplbGlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuCiAgIyBPbmx5IGNvcHkgaWYgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgZGlmZmVyZW50IGZpbGVzCiAgaWYgWyAiJFNPVVJDRV9DRkciICE9ICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgY3AgLWYgIiRTT1VSQ0VfQ0ZHIiAiJFdPUktTUEFDRV9DRkciCiAgZmkKICBpZiBbICIkU09VUkNFX0NGRyIgIT0gIiRUQVJHRVRfQ0ZHIiBdOyB0aGVuCiAgICBjcCAtZiAiJFNPVVJDRV9DRkciICIkVEFSR0VUX0NGRyIKICBmaQogIGVjaG8gIuKckyBSZXN0b3JlZCBNQ1AgY2xpZW50IGNvbmZpZyBmcm9tIHNvdXJjZTogJFRBUkdFVF9DRkciCmVsc2UKICBlY2hvICLinYwgTm8gdmFsaWQgY2xpZW50LWNvbmZpZy5qc29uIGF2YWlsYWJsZSAoY2hlY2tlZCAkV09SS1NQQUNFX0NGRyBhbmQgJFNPVVJDRV9DRkcpIgogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2UgY29udGVudHMgcHJldmlldzoiOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciIDI+L2Rldi9udWxsIHx8IGVjaG8gIiAgIDx1bnJlYWRhYmxlPiIKICBmaQogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2UgY29udGVudHMgcHJldmlldzoiOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciIDI+L2Rldi9udWxsIHx8IGVjaG8gIiAgIDx1bnJlYWRhYmxlPiIKICBmaQogIGV4aXQgMQpmaQoKTUNQX0NMSUVOVF9DT05GSUc9IiRUQVJHRVRfQ0ZHIgpleHBvcnQgTUNQX0NMSUVOVF9DT05GSUcKClRPT0xNQU5fVVJMPSR7VE9PTE1BTl9TRVJWRVJfVVJMOi0iaHR0cDovL3Rvb2xtYW4uYWdlbnQtcGxhdGZvcm0uc3ZjLmNsdXN0ZXIubG9jYWw6MzAwMC9tY3AifQpUT09MTUFOX1VSTD0iJHtUT09MTUFOX1VSTCUvfSIKZWNobyAi8J+UjSBDaGVja2luZyBUb29sbWFuIGVuZHBvaW50OiAkVE9PTE1BTl9VUkwiCmlmICEgY3VybCAtc1NmIC0tY29ubmVjdC10aW1lb3V0IDIgLS1tYXgtdGltZSA2IFwKICAtWCBQT1NUICIkVE9PTE1BTl9VUkwiIFwKICAtSCAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcCiAgLWQgJ3sianNvbnJwYyI6IjIuMCIsImlkIjoiaGVhbHRoIiwibWV0aG9kIjoidG9vbHMvbGlzdCIsInBhcmFtcyI6e319JyA+L3RtcC90b29sbWFuLXBpbmcubG9nIDI+JjE7IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIHJlYWNoIFRvb2xtYW4gc2VydmVyIGF0ICRUT09MTUFOX1VSTCIKICBjYXQgL3RtcC90b29sbWFuLXBpbmcubG9nID4mMiB8fCB0cnVlCiAgcm0gLWYgL3RtcC90b29sbWFuLXBpbmcubG9nCiAgZXhpdCAxCmZpCnJtIC1mIC90bXAvdG9vbG1hbi1waW5nLmxvZwplY2hvICLinJMgVG9vbG1hbiBlbmRwb2ludCByZWFjaGFibGUiCgppZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogIGVjaG8gIltjbGllbnQtY29uZmlnXSBzdW1tYXJ5OiIKICBpZiAhIGpxIC1yICcicmVtb3RlVG9vbHM9IiArICgoLnJlbW90ZVRvb2xzIC8vIFtdKSB8IGxlbmd0aCB8IHRvc3RyaW5nKSArICIsIGxvY2FsU2VydmVycz0iICsgKCgubG9jYWxTZXJ2ZXJzIC8vIHt9IHwga2V5cykgfCBqb2luKCIsIikpJyAiJE1DUF9DTElFTlRfQ09ORklHIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgZWNobyAiICAobm90IHZhbGlkIEpTT04pIgogIGZpCmVsc2UKICBlY2hvICLimqDvuI8ganEgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgY2xpZW50LWNvbmZpZyBzdW1tYXJ5IgpmaQoKZ3VhcmRfcm0oKSB7CiAgaWYgWyAiJCMiIC1nZSAyIF07IHRoZW4KICAgIGxvY2FsIGZsYWdzPSgpCiAgICBsb2NhbCB0YXJnZXRzPSgpCiAgICBmb3IgYXJnIGluICIkQCI7IGRvCiAgICAgIGNhc2UgIiRhcmciIGluCiAgICAgICAgLSopIGZsYWdzKz0oIiRhcmciKSA7OwogICAgICAgICopIHRhcmdldHMrPSgiJGFyZyIpIDs7CiAgICAgIGVzYWMKICAgIGRvbmUKCiAgICBpZiBwcmludGYgJyVzXG4nICIke2ZsYWdzW0BdfSIgfCBncmVwIC1FcSAnLS18Xi1yLiotZnwtZi4qLXInOyB0aGVuCiAgICAgIGxvY2FsIGhhc19yZWN1cnNpdmU9MAogICAgICBsb2NhbCBoYXNfZm9yY2U9MAogICAgICBmb3IgZmxhZyBpbiAiJHtmbGFnc1tAXX0iOyBkbwogICAgICAgIGNhc2UgIiRmbGFnIiBpbgogICAgICAgICAgLSopCiAgICAgICAgICAgIFtbICIkZmxhZyIgPT0gKnIqIHx8ICIkZmxhZyIgPT0gKlIqIF1dICYmIGhhc19yZWN1cnNpdmU9MQogICAgICAgICAgICBbWyAiJGZsYWciID09ICpmKiB8fCAiJGZsYWciID09ICpGKiBdXSAmJiBoYXNfZm9yY2U9MQogICAgICAgICAgICA7OwogICAgICAgIGVzYWMKICAgICAgZG9uZQoKICAgICAgaWYgKChoYXNfcmVjdXJzaXZlICYmIGhhc19mb3JjZSkpOyB0aGVuCiAgICAgICAgZm9yIHRhcmdldCBpbiAiJHt0YXJnZXRzW0BdfSI7IGRvCiAgICAgICAgICBbIC16ICIkdGFyZ2V0IiBdICYmIGNvbnRpbnVlCiAgICAgICAgICBsb2NhbCBleHBhbmRlZD0iJHRhcmdldCIKICAgICAgICAgIGNhc2UgIiR0YXJnZXQiIGluCiAgICAgICAgICAgIH4qKSBleHBhbmRlZD0iJHt0YXJnZXQvI1x+LyRIT01FfSIgOzsKICAgICAgICAgIGVzYWMKICAgICAgICAgIGxvY2FsIHJlc29sdmVkCiAgICAgICAgICByZXNvbHZlZD0kKHJlYWxwYXRoIC1tICIkZXhwYW5kZWQiIDI+L2Rldi9udWxsIHx8IHByaW50ZiAnJXMnICIkZXhwYW5kZWQiKQogICAgICAgICAgaWYgWyAiJHJlc29sdmVkIiA9ICIkQ1VSU09SX1dPUktfRElSIiBdIHx8IFsgIiRyZXNvbHZlZCIgPSAiL3dvcmtzcGFjZSIgXSB8fCAgICAgICAgICAgIFsgIiRyZXNvbHZlZCIgPSAiJEhPTUUiIF0gfHwgW1sgIiRyZXNvbHZlZCIgPT0gIiRIT01FLy5ydXN0dXAiKiBdXTsgdGhlbgogICAgICAgICAgICBlY2hvICLinYwgR3VhcmQ6IGRlc3RydWN0aXZlIHJtIGJsb2NrZWQgKHRhcmdldD0kdGFyZ2V0KSIgPiYyCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICBmaQogICAgICAgIGRvbmUKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgcmV0dXJuIDAKfQoKcm0oKSB7CiAgaWYgZ3VhcmRfcm0gIiRAIjsgdGhlbgogICAgY29tbWFuZCBybSAiJEAiCiAgZWxzZQogICAgcmV0dXJuIDEKICBmaQp9CgpleHBvcnQgLWYgZ3VhcmRfcm0gcm0KCmlmIFsgLXogIiR7Q1VSU09SX0FQSV9LRVk6LX0iIF07IHRoZW4KICBlY2hvICLinYwgQ1VSU09SX0FQSV9LRVkgaXMgbm90IHNldDsgQ3Vyc29yIGNhbm5vdCBhdXRoZW50aWNhdGUiCiAgZXhpdCAxCmZpCgplY2hvICLwn5SRIFVzaW5nIHByb3ZpZGVkIENVUlNPUl9BUElfS0VZIGZvciBhdXRoZW50aWNhdGlvbiIKCmlmIFsgISAtZiAiJENVUlNPUl9XT1JLX0RJUi9BR0VOVFMubWQiIF07IHRoZW4KICBlY2hvICLimqDvuI8gQUdFTlRTLm1kIG1pc3Npbmc7IGNyZWF0aW5nIHBsYWNlaG9sZGVyIgogIGNhdCA8PCdQTEFDRUhPTERFUicgPiAiJENVUlNPUl9XT1JLX0RJUi9BR0VOVFMubWQiCiMgUHJvamVjdCBHdWlkYW5jZQoKVGhpcyBDdXJzb3IgcnVuIHdhcyB0cmlnZ2VyZWQgd2l0aG91dCBBR0VOVFMubWQgY29udGVudC4gUHJvdmlkZSBwcm9qZWN0IGNvbnRleHQgaW4gQUdFTlRTLm1kIHRvIGdpdmUgQ3Vyc29yIHJpY2hlciBpbnN0cnVjdGlvbnMuClBMQUNFSE9MREVSCmZpCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQcm9tcHQgYXNzZW1ibHkgYW5kIEN1cnNvciBleGVjdXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpQUk9NUFRfUFJFRklYPSIiCmlmIFsgLWYgIiRDVVJTT1JfV09SS19ESVIvdGFzay90b29sbWFuLWd1aWRlLm1kIiBdOyB0aGVuCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCflKcgKipDUklUSUNBTDogVG9vbCBVc2FnZSBSZWZlcmVuY2UqKlxuXG4kKGNhdCAiJENVUlNPUl9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiKVxuXG4tLS1cblxuIgpmaQoKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfeKaoO+4jyAqKkVYRUNVVElPTiBSRVFVSVJFTUVOVFMgKE1BTkRBVE9SWSkqKlxuXG4tICoqRm9sbG93IHBhdHRlcm5zKio6IHJlZmVyZW5jZSBAY29kaW5nLWd1aWRlbGluZXMubWQgYW5kIEBnaXRodWItZ3VpZGVsaW5lcy5tZCBpbiB0aGlzIHdvcmtzcGFjZS5cbi0gKipObyBtb2NrcyBvciBzdHVicyoqOiBpbnRlZ3JhdGUgd2l0aCBsaXZlIHNlcnZpY2VzLCBBUElzLCBhbmQgY29uZmlndXJhdGlvbjsgcmVtb3ZlIGFsbCBwbGFjZWhvbGRlcnMuXG4tICoqUGFyYW1ldGVyaXplIGV2ZXJ5dGhpbmcqKjogZXZlcnkgZW5kcG9pbnQsIHRocmVzaG9sZCwgb3IgdHJhZGluZyBwYWlyIG11c3QgY29tZSBmcm9tIGVudiB2YXJzLCBjb25maWcsIG9yIENMSSBmbGFncy5cbi0gKipGZWF0dXJlIGJyYW5jaCBvbmx5Kio6IHN0YXkgb24gXGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25cYDsgbmV2ZXIgcHVzaCBkaXJlY3RseSB0byBtYWluL21hc3RlciBvciByZXRhcmdldCB0aGUgYnJhbmNoIHVwc3RyZWFtLlxuLSAqKkV4ZWN1dGUgd2l0aG91dCBwYXVzZSoqOiBpZiB5b3Ugb3V0bGluZSBhIHBsYW4sIGltbWVkaWF0ZWx5IGNhcnJ5IGl0IG91dOKAlGRvIG5vdCB3YWl0IGZvciBjb25maXJtYXRpb24gb3IgYWRkaXRpb25hbCBpbnB1dC5cbi0gKipRdWFsaXR5IGdhdGVzKiogKEFMTCBtdXN0IHBhc3MgYmVmb3JlIGRlY2xhcmluZyBzdWNjZXNzKTpcbiAgMS4gRm9ybWF0IGNoZWNrOiBcYHFsdHkgZm10IC0tdmVyaWZ5XGAgT1IgXGBjYXJnbyBmbXQgLS1hbGwgLS0gLS1jaGVja1xgXG4gIDIuIExpbnRpbmc6IFxgcWx0eSBjaGVjayAtLWFsbFxgIEFORCBcYGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzXGBcbiAgMy4gU2VjdXJpdHkgc2Nhbm5pbmc6IFxgZ2l0bGVha3MgZGV0ZWN0IC0tbm8tZ2l0XGAsIFxgdHJpdnkgZnMgLiAtLXNldmVyaXR5IEhJR0gsQ1JJVElDQUxcYCwgXGBjYXJnbyBkZW55IGNoZWNrXGBcbiAgNC4gRG9ja2VyZmlsZSBsaW50aW5nIChpZiBhcHBsaWNhYmxlKTogXGBoYWRvbGludCBEb2NrZXJmaWxlXGBcbiAgNS4gVGVzdGluZzogXGBjYXJnbyBuZXh0ZXN0IHJ1biAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc1xgIE9SIFxgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc1xgXG4tICoqQXV0by1maXggYmVmb3JlIGNvbW1pdCoqOiBydW4gXGBxbHR5IGZtdFxgIGFuZCBcYHFsdHkgY2hlY2sgLS1maXhcYCB0byBhdXRvbWF0aWNhbGx5IHJlc29sdmUgZm9ybWF0dGluZyBhbmQgbGludGluZyBpc3N1ZXMuXG4tICoqU2VjdXJpdHkgZmlyc3QqKjogTkVWRVIgY29tbWl0IGNvZGUgd2l0aCBzZWNyZXRzIG9yIEhJR0gvQ1JJVElDQUwgdnVsbmVyYWJpbGl0aWVzLlxuLSAqKkRvY3VtZW50YXRpb24gJiBQUioqOiB1cGRhdGUgcHJvamVjdCBkb2NzIGFuZCBvcGVuIGEgUFIgdmlhIFxgZ2ggcHIgY3JlYXRlXGAgd2l0aCBsYWJlbHMgdGFzay17e3Rhc2tfaWR9fSwgc2VydmljZS17e3NlcnZpY2V9fSwgYW5kIHJ1bi17e3dvcmtmbG93X25hbWV9fS5cbi0gKipQcmVzZXJ2ZSB3b3Jrc3BhY2UqKjogbmV2ZXIgZGVsZXRlIHRoZSByZXBvc2l0b3J5IG9yIHJ1biBkZXN0cnVjdGl2ZSBjbGVhbnVwIGNvbW1hbmRzIChmb3IgZXhhbXBsZSBcYHJtIC1yZlxgKTsgbGVhdmUgYXJ0aWZhY3RzIGluIHBsYWNlIGZvciBRQS5cblxuLS0tXG5cbiIKCmlmIFsgLWYgIiRDVVJTT1JfV09SS19ESVIvZ2l0aHViLWd1aWRlbGluZXMubWQiIF0gfHwgWyAtZiAiJENVUlNPUl9XT1JLX0RJUi9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH3wn5OaICoqUmVmZXJlbmNlIE1hdGVyaWFscyBBdmFpbGFibGUqKlxuIgogIGlmIFsgLWYgIiRDVVJTT1JfV09SS19ESVIvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEBnaXRodWItZ3VpZGVsaW5lcy5tZFxuIgogIGZpCiAgaWYgWyAtZiAiJENVUlNPUl9XT1JLX0RJUi9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQGNvZGluZy1ndWlkZWxpbmVzLm1kXG4iCiAgZmkKICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9XG4tLS1cblxuIgpmaQoKaWYgWyAtZiAiJENVUlNPUl9XT1JLX0RJUi9BR0VOVFMubWQiIF07IHRoZW4KICBpZiBBR0VOVF9HVUlEQU5DRT0kKGpxIC1ScyBAanNvbiAiJENVUlNPUl9XT1JLX0RJUi9BR0VOVFMubWQiIDI+L2Rldi9udWxsKTsgdGhlbgogICAgaWYgWyAiJHsjQUdFTlRfR1VJREFOQ0V9IiAtZ3QgMiBdOyB0aGVuCiAgICAgIEFHRU5UX0dVSURBTkNFPSR7QUdFTlRfR1VJREFOQ0U6MTotMX0KICAgICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCfp6AgKipBZ2VudCBHdWlkYW5jZSoqXG5cbiR7QUdFTlRfR1VJREFOQ0V9XG5cbi0tLVxuXG4iCiAgICBmaQogIGZpCmZpCgplY2hvICLwn5SNIERFQlVHOiBBYm91dCB0byBjaGVjayBmb3IgcHJvbXB0Lm1kIGF0OiAkQ1VSU09SX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiB0YXNrIGRpcmVjdG9yeToiCmxzIC1sYSAiJENVUlNPUl9XT1JLX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGVtcHR5IgplY2hvICLwn5SNIERFQlVHOiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGNvbnRlbnRzOiIKbHMgLWxhICIkQ1VSU09SX1dPUktfRElSLyIgfHwgZWNobyAiV29ya2luZyBkaXJlY3Rvcnkgbm90IGFjY2Vzc2libGUiCgpQUk9NUFRfRklMRT0iJENVUlNPUl9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKaWYgWyAhIC1mICIkUFJPTVBUX0ZJTEUiIF07IHRoZW4KICBlY2hvICLinYwgcHJvbXB0Lm1kIG5vdCBmb3VuZCBhdCAkUFJPTVBUX0ZJTEUiCiAgZXhpdCAxCmZpCgplY2hvICJzdGFydGluZ1Rhc2s6e3t0YXNrX2lkfX0iCmVjaG8gIiIKClBST01QVF9DT05URU5UPSIke1BST01QVF9QUkVGSVh9JChjYXQgIiRQUk9NUFRfRklMRSIpIgoKZWNobyAi8J+nviBSZXNvbHZlZCBwcm9tcHQgY29udGVudCAodHJ1bmNhdGVkIHRvIDIwMDAgY2hhcnMgZm9yIGxvZyBzYWZldHkpOiIKUFJPTVBUX1BSRVZJRVc9JChwcmludGYgJyVzJyAiJFBST01QVF9DT05URU5UIiB8IGhlYWQgLWMgMjAwMCkKcHJpbnRmICclc1xuJyAiJFBST01QVF9QUkVWSUVXIgpQUk9NUFRfQllURVM9JChwcmludGYgJyVzJyAiJFBST01QVF9DT05URU5UIiB8IHdjIC1jIHwgdHIgLWQgJ1s6c3BhY2U6XScpCmVjaG8gIvCfk48gUHJvbXB0IHNpemU6ICRQUk9NUFRfQllURVMgYnl0ZXMiCgpNQVhfUkVUUklFUz0ke0NVUlNPUl9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTV9fQpBVFRFTVBUPTEKU1VDQ0VTUz0wCkNVUlNPUl9FWElUPTEKTEFTVF9NRVNTQUdFX0ZJTEU9IiIKUlVOX0xPRz0iIgoKIyBDaXJjdWl0IGJyZWFrZXI6IHRyYWNrIHJlcGVhdGVkIGNvbW1hbmQgZmFpbHVyZXMKZGVjbGFyZSAtQSBGQUlMRURfQ09NTUFORFMKTUFYX1NBTUVfQ09NTUFORF9GQUlMVVJFUz0zCgpGT1JDRV9XUklURVM9Int7I2lmIGZvcmNlX3dyaXRlc319dHJ1ZXt7ZWxzZX19ZmFsc2V7ey9pZn19IgpPVVRQVVRfRk9STUFUPSJ7eyNpZiBvdXRwdXRfZm9ybWF0fX17e291dHB1dF9mb3JtYXR9fXt7ZWxzZX19c3RyZWFtLWpzb257ey9pZn19IgoKRk9SQ0VfRkxBRz0iIgppZiBbICIke0ZPUkNFX1dSSVRFUywsfSIgPSAidHJ1ZSIgXTsgdGhlbgogIEZPUkNFX0ZMQUc9Ii0tZm9yY2UiCmZpCgp3aGlsZSBbICRBVFRFTVBUIC1sZSAkTUFYX1JFVFJJRVMgXTsgZG8KICBlY2hvICLwn5qAIEN1cnNvciBleGVjdXRpb24gYXR0ZW1wdCAkQVRURU1QVC8kTUFYX1JFVFJJRVMiCiAgTEFTVF9NRVNTQUdFX0ZJTEU9Ii90bXAvY3Vyc29yLWxhc3QtbWVzc2FnZS0ke0FUVEVNUFR9LnR4dCIKICBSVU5fTE9HPSIvdG1wL2N1cnNvci1ydW4tJHtBVFRFTVBUfS5qc29ubCIKCiAgQ1VSU09SX0NNRD0oImN1cnNvci1hZ2VudCIgIi0tcHJpbnQiICItLW91dHB1dC1mb3JtYXQiICIkT1VUUFVUX0ZPUk1BVCIpCiAge3sjaWYgbW9kZWx9fQogIENVUlNPUl9DTUQrPSgiLS1tb2RlbCIgInt7bW9kZWx9fSIpCiAge3svaWZ9fQogIGlmIFsgLW4gIiRGT1JDRV9GTEFHIiBdOyB0aGVuCiAgICBDVVJTT1JfQ01EKz0oIiRGT1JDRV9GTEFHIikKICBmaQogIENVUlNPUl9DTUQrPSgiJFBST01QVF9DT05URU5UIikKCiAgZWNobyAi8J+UpyBjdXJzb3ItYWdlbnQgaW52b2NhdGlvbiBhcmd1bWVudHMgKCR7I0NVUlNPUl9DTURbQF19IGVudHJpZXMpOiIKICBmb3IgaWR4IGluICIkeyFDVVJTT1JfQ01EW0BdfSI7IGRvCiAgICBwcmludGYgJyAgICBbJWRdICVzXG4nICIkaWR4IiAiJHtDVVJTT1JfQ01EWyRpZHhdfSIKICBkb25lCgogIHNldCArZQogIHNldCAtbyBwaXBlZmFpbAogICIke0NVUlNPUl9DTURbQF19IiB8IHRlZSAiJFJVTl9MT0ciCiAgQ1VSU09SX0VYSVQ9JHtQSVBFU1RBVFVTWzBdfQogIHNldCArbyBwaXBlZmFpbAogIHNldCAtZQoKICBlY2hvICJbY3Vyc29yLWRlYnVnXSBBdHRlbXB0ICRBVFRFTVBUIGZpbmlzaGVkIHdpdGggZXhpdCBjb2RlICRDVVJTT1JfRVhJVCIKCiAgaWYgWyAkQ1VSU09SX0VYSVQgLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEN1cnNvciBleGl0ZWQgd2l0aCBzdGF0dXMgJENVUlNPUl9FWElUIG9uIGF0dGVtcHQgJEFUVEVNUFQiCiAgZmkKCiAgIyBDaXJjdWl0IGJyZWFrZXI6IGRldGVjdCByZXBlYXRlZCBmYWlsaW5nIGJhc2ggY29tbWFuZHMKICBpZiBbIC1mICIkUlVOX0xPRyIgXSAmJiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgIyBUcnkgdG8gZXh0cmFjdCBmYWlsZWQgYmFzaC9zaGVsbCBjb21tYW5kcyBmcm9tIEpTT04gbG9nCiAgICAjIEN1cnNvciBmb3JtYXQ6IGxvb2sgZm9yIHNoZWxsIHRvb2wgZmFpbHVyZXMKICAgIEZBSUxFRF9DTUQ9JChqcSAtciAnc2VsZWN0KC50eXBlPT0idG9vbF9jYWxsIiBhbmQgLnN1YnR5cGU9PSJjb21wbGV0ZWQiIGFuZCAoLnRvb2xfY2FsbC5zaGVsbFRvb2xDYWxsLnJlc3VsdC5leGl0Q29kZSAvLyAwKSAhPSAwKSB8IC50b29sX2NhbGwuc2hlbGxUb29sQ2FsbC5hcmdzLmNvbW1hbmQnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSB8IGhlYWQgLWMgMTAwKQogICAgCiAgICBpZiBbIC1uICIkRkFJTEVEX0NNRCIgXTsgdGhlbgogICAgICAjIFRyYWNrIGhvdyBtYW55IHRpbWVzIHRoaXMgY29tbWFuZCBoYXMgZmFpbGVkCiAgICAgIEZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXT0kKCgke0ZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXTotMH0gKyAxKSkKICAgICAgRkFJTF9DT1VOVD0ke0ZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXX0KICAgICAgCiAgICAgIGlmIFsgJEZBSUxfQ09VTlQgLWdlICRNQVhfU0FNRV9DT01NQU5EX0ZBSUxVUkVTIF07IHRoZW4KICAgICAgICBlY2hvICLwn5S0IENJUkNVSVQgQlJFQUtFUiBUUklHR0VSRUQ6IENvbW1hbmQgaGFzIGZhaWxlZCAkRkFJTF9DT1VOVCB0aW1lcyBpbiBhIHJvdzoiCiAgICAgICAgZWNobyAiICAgQ29tbWFuZDogJEZBSUxFRF9DTUQiCiAgICAgICAgZWNobyAiICAgVGhpcyBpbmRpY2F0ZXMgdGhlIGFnZW50IGlzIHN0dWNrIGluIGEgbG9vcC4iCiAgICAgICAgCiAgICAgICAgIyBJbmplY3QgaW50ZXJ2ZW50aW9uIHByb21wdCBmb3IgbmV4dCBhdHRlbXB0CiAgICAgICAgUFJPTVBUX0NPTlRFTlQ9IiR7UFJPTVBUX0NPTlRFTlR9CgrimqDvuI8gKipMT09QIERFVEVDVEVEKio6IFlvdSB0cmllZCB0aGlzIGNvbW1hbmQgJEZBSUxfQ09VTlQgdGltZXM6ClxgXGBcYGJhc2gKJEZBSUxFRF9DTUQKXGBcYFxgCgpJdCBrZWVwcyBmYWlsaW5nLiAqKlNUT1AgUkVQRUFUSU5HIFRISVMgQ09NTUFORC4qKgoKVHJ5IGluc3RlYWQ6CjEuIENoZWNrIHdvcmtpbmcgZGlyZWN0b3J5OiBcYHB3ZFxgCjIuIExpc3QgZmlsZXM6IFxgbHMgLWxhXGAKMy4gVXNlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgYXBwcm9hY2gKNC4gQ3JlYXRlIGZpbGVzL2RpcmVjdG9yaWVzIHN0ZXAtYnktc3RlcCIKICAgICAgICAKICAgICAgICAjIFJlc2V0IGNvdW50ZXIKICAgICAgICBGQUlMRURfQ09NTUFORFNbIiRGQUlMRURfQ01EIl09MAogICAgICBmaQogICAgZmkKICBmaQoKICAjIEV4dHJhY3QgdG9rZW4gdXNhZ2UgZm9yIGNvc3QgdHJhY2tpbmcKICBpZiBbIC1mICIkUlVOX0xPRyIgXSAmJiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgVE9LRU5TX0lOPSQoanEgLXIgJ3NlbGVjdCgubWV0YWRhdGEudXNhZ2UuaW5wdXRUb2tlbnMgIT0gbnVsbCkgfCAubWV0YWRhdGEudXNhZ2UuaW5wdXRUb2tlbnMnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSkKICAgIFRPS0VOU19PVVQ9JChqcSAtciAnc2VsZWN0KC5tZXRhZGF0YS51c2FnZS5vdXRwdXRUb2tlbnMgIT0gbnVsbCkgfCAubWV0YWRhdGEudXNhZ2Uub3V0cHV0VG9rZW5zJyAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEpCiAgICAKICAgIGlmIFtbICIkVE9LRU5TX0lOIiA9fiBeWzAtOV0rJCBdXSAmJiBbWyAiJFRPS0VOU19PVVQiID1+IF5bMC05XSskIF1dOyB0aGVuCiAgICAgIFRPS0VOU19UT1RBTD0kKChUT0tFTlNfSU4gKyBUT0tFTlNfT1VUKSkKICAgICAgZWNobyAi8J+TiiBDdXJzb3IgdG9rZW5zIHRoaXMgYXR0ZW1wdDogaW5wdXQ9JFRPS0VOU19JTiwgb3V0cHV0PSRUT0tFTlNfT1VULCB0b3RhbD0kVE9LRU5TX1RPVEFMIgogICAgICAKICAgICAgIyBTdG9yZSBmb3IgbWV0cmljcyAoZnV0dXJlOiBzZW5kIHRvIGJhY2tlbmQpCiAgICAgIGVjaG8gIntcImF0dGVtcHRcIjokQVRURU1QVCxcInRhc2tfaWRcIjpcInt7dGFza19pZH19XCIsXCJzZXJ2aWNlXCI6XCJ7e3NlcnZpY2V9fVwiLFwiY2xpXCI6XCJjdXJzb3JcIixcInRva2Vuc19pblwiOiRUT0tFTlNfSU4sXCJ0b2tlbnNfb3V0XCI6JFRPS0VOU19PVVQsXCJ0b2tlbnNfdG90YWxcIjokVE9LRU5TX1RPVEFMfSIgPj4gL3RtcC9jdXJzb3ItbWV0cmljcy5qc29ubAogICAgZmkKICBmaQoKICBpZiBbIC1zICIkUlVOX0xPRyIgXTsgdGhlbgogICAgUkVTVUxUX1RFWFQ9JChqcSAtciAnc2VsZWN0KC50eXBlID09ICJyZXN1bHQiKSB8IC5yZXN1bHQgLy8gZW1wdHknICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSkKICAgIHByaW50ZiAnJXNcbicgIiRSRVNVTFRfVEVYVCIgPiAiJExBU1RfTUVTU0FHRV9GSUxFIgogIGVsc2UKICAgIDogPiAiJExBU1RfTUVTU0FHRV9GSUxFIgogIGZpCgogIENPTVBMRVRJT05fUFJPTVBUPSJUYXNrIHt7dGFza19pZH19IGNvbXBsZXRpb24gdmVyaWZpY2F0aW9uLgoKKipGSVJTVCoqOiBSZXZpZXcgdGhlIGFjY2VwdGFuY2UgY3JpdGVyaWEgaW4gdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kCgoqKlRoZW4gYW5zd2VyICd5ZXMnIE9OTFkgaWYgQUxMIG9mIHRoZXNlIGFyZSB0cnVlOioqCgoxLiAqKkVWRVJZIGFjY2VwdGFuY2UgY3JpdGVyaW9uIGlzIGZ1bGx5IGltcGxlbWVudGVkKiogKG5vdCBqdXN0IHN0YXJ0ZWQsIGJ1dCBET05FKQoyLiBBbGwgY29kZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQgdG8gZ2l0CjMuIENoYW5nZXMgYXJlIHB1c2hlZCB0byByZW1vdGUgYnJhbmNoIGZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbgo0LiBBIHB1bGwgcmVxdWVzdCBleGlzdHMgKHdpdGggYXQgbGVhc3QgdGFzay17e3Rhc2tfaWR9fSBsYWJlbDsgb3RoZXIgbGFiZWxzIGFyZSBvcHRpb25hbCkKNS4gUXVhbGl0eSBnYXRlcyBwYXNzZWQgKGNhcmdvIGZtdCwgY2FyZ28gY2xpcHB5IHdpdGggbm8gd2FybmluZ3MsIHRlc3RzIHBhc3MpCgoqKkJlIGhvbmVzdCoqOiBJZiBBTlkgYWNjZXB0YW5jZSBjcml0ZXJpb24gaXMgaW5jb21wbGV0ZSBvciBwYXJ0aWFsbHkgaW1wbGVtZW50ZWQsIGFuc3dlciAnbm8nIGFuZCBjb250aW51ZSB3b3JraW5nLgoKKipUbyB2ZXJpZnk6KioKLSBSZXZpZXc6IGNhdCB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQKLSBHaXQgc3RhdHVzOiBnaXQgc3RhdHVzCi0gQ29tbWl0cyBwdXNoZWQ6IGdpdCBsb2cgb3JpZ2luL21haW4uLkhFQUQKLSBQUiBleGlzdHM6IGdoIHByIHZpZXcKLSBUZXN0cyBwYXNzOiBDaGVjayB5b3VyIHRlc3QgcmVzdWx0cwoKQmFzZWQgb24geW91ciBob25lc3QgYXNzZXNzbWVudCBvZiBhY2NlcHRhbmNlIGNyaXRlcmlhIGNvbXBsZXRpb24sIGFuc3dlciB3aXRoIGEgc2luZ2xlIHdvcmQ6IHllcyBvciBubwoKUmVzcG9uc2UgKG9uZSB3b3JkIG9ubHkpOiIKICBDT01QTEVUSU9OX0xBU1RfTUVTU0FHRT0iL3RtcC9jdXJzb3ItY29tcGxldGlvbi0ke0FUVEVNUFR9LnR4dCIKICBDT01QTEVUSU9OX0xPRz0iL3RtcC9jdXJzb3ItY29tcGxldGlvbi0ke0FUVEVNUFR9LmxvZyIKCiAgQ09NUExFVElPTl9DTUQ9KCJjdXJzb3ItYWdlbnQiICItLXByaW50IiAiLS1vdXRwdXQtZm9ybWF0IiAidGV4dCIpCiAge3sjaWYgbW9kZWx9fQogIENPTVBMRVRJT05fQ01EKz0oIi0tbW9kZWwiICJ7e21vZGVsfX0iKQogIHt7L2lmfX0KICBDT01QTEVUSU9OX0NNRCs9KCIkQ09NUExFVElPTl9QUk9NUFQiKQoKICBzZXQgK2UKICBzZXQgLW8gcGlwZWZhaWwKICBDT01QTEVUSU9OX09VVFBVVD0kKCIke0NPTVBMRVRJT05fQ01EW0BdfSIgMj4mMSB8IHRlZSAiJENPTVBMRVRJT05fTE9HIikKICBDT01QTEVUSU9OX0VYSVQ9JHtQSVBFU1RBVFVTWzBdfQogIHNldCArbyBwaXBlZmFpbAogIHNldCAtZQoKICBwcmludGYgJyVzXG4nICIkQ09NUExFVElPTl9PVVRQVVQiID4gIiRDT01QTEVUSU9OX0xBU1RfTUVTU0FHRSIKICBlY2hvICLwn6etIENvbXBsZXRpb24gcHJvYmUgcmVzcG9uc2U6IgogIHByaW50ZiAnJXNcbicgIiRDT01QTEVUSU9OX09VVFBVVCIKCiAgaWYgWyAkQ09NUExFVElPTl9FWElUIC1uZSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBDb21wbGV0aW9uIHByb2JlIGV4aXRlZCB3aXRoIHN0YXR1cyAkQ09NUExFVElPTl9FWElUIgogIGZpCgogIENPTVBMRVRJT05fUkVTUE9OU0U9JChwcmludGYgJyVzXG4nICIkQ09NUExFVElPTl9PVVRQVVQiIHwgdHIgLWQgJ1xyJyB8IGdyZXAgLUVpbyAnXFxiKHllc3xubylcXGInIHwgaGVhZCAtbjEgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKICBpZiBbICIkQ09NUExFVElPTl9SRVNQT05TRSIgPSAieWVzIiBdOyB0aGVuCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZmkKCiAgZWNobyAi4pqg77iPIEN1cnNvciByZXBvcnRlZCB0YXNrIGluY29tcGxldGU7IHJldHJ5aW5nLi4uIgogIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQpkb25lCgppZiBbICRTVUNDRVNTIC1uZSAxIF07IHRoZW4KICBlY2hvICLimqDvuI8gQ3Vyc29yIGRpZCBub3QgY29uZmlybSB0YXNrIGNvbXBsZXRpb24gYWZ0ZXIgJE1BWF9SRVRSSUVTIGF0dGVtcHRzIgogIGVjaG8gIuKdjCBUYXNrIGluY29tcGxldGUgLSBtYXJraW5nIGFzIEZBSUxFRCIKICBFWElUX0NPREU9MSAgIyBGYWlsIHRoZSBqb2Igc28gaXQgZG9lc24ndCBhcHBlYXIgc3VjY2Vzc2Z1bAplbHNlCiAgZWNobyAi4pyFIEN1cnNvciBjb25maXJtZWQgdGFzayBjb21wbGV0aW9uIgogIGlmIFsgJHtDVVJTT1JfRVhJVDotMH0gLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEN1cnNvciByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUgJHtDVVJTT1JfRVhJVH0sIGJ1dCBjb21wbGV0aW9uIHByb2JlIHBhc3NlZCIKICBmaQogIEVYSVRfQ09ERT0wCmZpCgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLwn5SNIFZlcmlmeWluZyBwdWxsIHJlcXVlc3Qgc3RhdHVzIgogIGVuc3VyZV9wcl9jcmVhdGVkCmVsc2UKICBlY2hvICLimqDvuI8gU2tpcHBpbmcgYXV0byBQUiBlbmZvcmNlbWVudCBkdWUgdG8gQ3Vyc29yIGNvbXBsZXRpb24gc3RhdHVzIgpmaQoKIyBTdWJtaXQgR2l0SHViIFBSIHJldmlldyBmb3IgQ2xlby9UZXNzIHN0YWdlcyAoZW5hYmxlcyB3b3JrZmxvdyBwcm9ncmVzc2lvbikKV09SS0ZMT1dfU1RBR0U9IiR7V09SS0ZMT1dfU1RBR0U6LX0iCmlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAicXVhbGl0eSIgXSB8fCBbICIkV09SS0ZMT1dfU1RBR0UiID0gInRlc3RpbmciIF07IHRoZW4KICBQUl9OVU09IiR7UFJfTlVNQkVSOi19IgogIGlmIFsgLXogIiRQUl9OVU0iIF07IHRoZW4KICAgICMgVHJ5IHRvIGdldCBQUiBudW1iZXIgZnJvbSBjdXJyZW50IGJyYW5jaAogICAgQ1VSUkVOVF9CUkFOQ0g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBbIC1uICIkQ1VSUkVOVF9CUkFOQ0giIF07IHRoZW4KICAgICAgUFJfTlVNPSQoZ2ggcHIgbGlzdCAtLXN0YXRlIG9wZW4gLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBmaQogIGZpCgogIGlmIFsgLW4gIiRQUl9OVU0iIF07IHRoZW4KICAgIGlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogICAgICBTVEFHRV9OQU1FPSJRdWFsaXR5IgogICAgICBTVEFHRV9FTU9KST0i8J+boe+4jyIKICAgICAgQ0hFQ0tTX1BBU1NFRD0kJy0gQ29kZSBmb3JtYXR0aW5nIHZlcmlmaWVkCi0gTGludGluZyBwYXNzZWQKLSBVbml0IHRlc3RzIHN1Y2Nlc3NmdWwKLSBRdWFsaXR5IHN0YW5kYXJkcyBtZXQnCiAgICAgIE5FWFRfU1RBR0U9ImVuZC10by1lbmQgdGVzdGluZyBieSBUZXNzIgogICAgICAKICAgICAgaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nIiBdOyB0aGVuCiAgICAgICAgIyBUZXNzIGhhcyBmaW5hbCBhcHByb3ZhbCBhdXRob3JpdHkKICAgICAgICBTVEFHRV9OQU1FPSJRQSBUZXN0aW5nIgogICAgICAgIFNUQUdFX0VNT0pJPSLwn6eqIgogICAgICAgIENIRUNLU19QQVNTRUQ9JCctIEVuZC10by1lbmQgdGVzdHMgcGFzc2VkCi0gSW50ZWdyYXRpb24gdGVzdHMgc3VjY2Vzc2Z1bAotIEFjY2VwdGFuY2UgY3JpdGVyaWEgdmFsaWRhdGVkCi0gUHJvZHVjdGlvbiByZWFkaW5lc3MgY29uZmlybWVkJwogICAgICAgIE5FWFRfU1RBR0U9Imh1bWFuIHJldmlldyBhbmQgbWVyZ2UiCiAgICAgICAgCiAgICAgICAgZWNobyAi4pyFICRTVEFHRV9OQU1FIGNvbXBsZXRlIC0gcG9zdGluZyBBUFBST1ZFIHJldmlldyAoVGVzcyBmaW5hbCBhcHByb3ZhbCkiCiAgICAgICAgUkVWSUVXX0JPRFlfRklMRT0kKG1rdGVtcCkKICAgICAgICBjYXQgPDxFT0YgPiAiJFJFVklFV19CT0RZX0ZJTEUiCiMjIyAkU1RBR0VfRU1PSkkgJFNUQUdFX05BTUUgUmV2aWV3IC0gQVBQUk9WRUQKQWxsIGNoZWNrcyBoYXZlIHBhc3NlZDoKJENIRUNLU19QQVNTRUQKUmVhZHkgZm9yICRORVhUX1NUQUdFLgoKKipGaW5hbCBBcHByb3ZhbDoqKiBUZXNzIGhhcyB2ZXJpZmllZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgbWV0LgpFT0YKICAgICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tYXBwcm92ZSAtLWJvZHktZmlsZSAiJFJFVklFV19CT0RZX0ZJTEUiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgICAgICBybSAtZiAiJFJFVklFV19CT0RZX0ZJTEUiCiAgICAgIGVsc2UKICAgICAgICAjIENsZW8gaGFuZHMgb2ZmIHRvIFRlc3MgdmlhIGNvbW1lbnQgYW5kIGxhYmVsIChOT1QgYXBwcm92ZSkKICAgICAgICBlY2hvICLinIUgJFNUQUdFX05BTUUgY2hlY2tzIHBhc3NlZCAtIGhhbmRpbmcgb2ZmIHRvIFRlc3MiCiAgICAgICAgUkVWSUVXX0JPRFlfRklMRT0kKG1rdGVtcCkKICAgICAgICBjYXQgPDxFT0YgPiAiJFJFVklFV19CT0RZX0ZJTEUiCiMjIyAkU1RBR0VfRU1PSkkgJFNUQUdFX05BTUUgUmV2aWV3IC0gUEFTU0VECkFsbCBjaGVja3MgaGF2ZSBwYXNzZWQ6CiRDSEVDS1NfUEFTU0VECgoqKlN0YXR1czoqKiBSZWFkeSBmb3IgJE5FWFRfU1RBR0UKKipOZXh0IFN0ZXA6KiogVGVzcyB3aWxsIG5vdyBwZXJmb3JtIGNvbXByZWhlbnNpdmUgUUEgdmFsaWRhdGlvbgoKLS0tCipRdWFsaXR5IHJldmlldyBieSBDbGVvKgpFT0YKICAgICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgICAgdGltZW91dCAzMCBnaCBwciBjb21tZW50ICIkUFJfTlVNIiAtLWJvZHktZmlsZSAiJFJFVklFV19CT0RZX0ZJTEUiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIGNvbW1lbnQgY29tbWFuZCBmYWlsZWQiCiAgICAgICAgcm0gLWYgIiRSRVZJRVdfQk9EWV9GSUxFIgogICAgICAgIAogICAgICAgICMgQWRkIHJlYWR5LWZvci1xYSBsYWJlbCB0byBzaWduYWwgVGVzcwogICAgICAgIGVjaG8gIvCfj7fvuI8gIEFkZGluZyAncmVhZHktZm9yLXFhJyBsYWJlbCB0byB0cmlnZ2VyIFRlc3MgcmV2aWV3IgogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgZWRpdCAiJFBSX05VTSIgLS1hZGQtbGFiZWwgInJlYWR5LWZvci1xYSIgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCByZWFkeS1mb3ItcWEgbGFiZWwiCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIFNUQUdFX05BTUU9IlF1YWxpdHkiCiAgICAgIFNUQUdFX0VNT0pJPSLwn5uh77iPIgogICAgICBJU1NVRVNfREVTQz0kJy0gUmV2aWV3IGNvZGUgZm9ybWF0dGluZwotIEZpeCBsaW50aW5nIGVycm9ycwotIEVuc3VyZSB1bml0IHRlc3RzIHBhc3MKLSBNZWV0IHF1YWxpdHkgc3RhbmRhcmRzJwogICAgICBpZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInRlc3RpbmciIF07IHRoZW4KICAgICAgICBTVEFHRV9OQU1FPSJRQSBUZXN0aW5nIgogICAgICAgIFNUQUdFX0VNT0pJPSLwn6eqIgogICAgICAgIElTU1VFU19ERVNDPSQnLSBGaXggZmFpbGluZyBlbmQtdG8tZW5kIHRlc3RzCi0gQWRkcmVzcyBpbnRlZ3JhdGlvbiB0ZXN0IGZhaWx1cmVzCi0gVmFsaWRhdGUgYWNjZXB0YW5jZSBjcml0ZXJpYQotIEVuc3VyZSBwcm9kdWN0aW9uIHJlYWRpbmVzcycKICAgICAgZmkKCiAgICAgIGVjaG8gIuKdjCAkU1RBR0VfTkFNRSBpc3N1ZXMgZGV0ZWN0ZWQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICAgIFJFVklFV19CT0RZX0ZJTEU9JChta3RlbXApCiAgICAgIGNhdCA8PEVPRiA+ICIkUkVWSUVXX0JPRFlfRklMRSIKIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwokU1RBR0VfTkFNRSBpc3N1ZXMgZGV0ZWN0ZWQuIFBsZWFzZSBhZGRyZXNzIHRoZSBmb2xsb3dpbmc6CiRJU1NVRVNfREVTQwpFT0YKICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5LWZpbGUgIiRSRVZJRVdfQk9EWV9GSUxFIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCBmYWlsZWQiCiAgICAgIHJtIC1mICIkUkVWSUVXX0JPRFlfRklMRSIKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4oS577iPIE5vIFBSIG51bWJlciBhdmFpbGFibGUgZm9yICRXT1JLRkxPV19TVEFHRSByZXZpZXcgc3VibWlzc2lvbiIKICBmaQpmaQoKdG91Y2ggL3dvcmtzcGFjZS8uYWdlbnRfZG9uZSAyPi9kZXYvbnVsbCB8fCB0cnVlCgppZiBbICRTVUNDRVNTIC1uZSAxIF07IHRoZW4KICB7eyNpZiBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fQplY2hvICJ7e2FnZW50X2NvbXBsZXRpb25fbWVzc2FnZX19IgogIHt7ZWxzZX19CmVjaG8gIuKaoO+4jyBDdXJzb3IgZXhlY3V0aW9uIGluY29tcGxldGUiCiAge3svaWZ9fQogIGV4aXQgJEVYSVRfQ09ERQpmaQoKe3sjaWYgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlfX0KZWNobyAie3thZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fSIKe3tlbHNlfX0KZWNobyAi4pyFIEN1cnNvciBleGVjdXRpb24gY29tcGxldGUiCnt7L2lmfX0KZXhpdCAkRVhJVF9DT0RFCg== code_cursor_container-cleo.sh.hbs: e3s+IGN1cnNvcl9jb250YWluZXJfYmFzZQogICAgYWdlbnRfYmFubmVyPSLwn5uh77iPIENsZW8gQ3Vyc29yIHF1YWxpdHkgd29ya2Zsb3cgc3RhcnRpbmciCiAgICBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2U9IuKchSBDbGVvIEN1cnNvciBxdWFsaXR5IGNoZWNrcyBjb21wbGV0ZSIKICAgIGZvcmNlX3dyaXRlcz10cnVlfX0K code_cursor_container-rex-remediation.sh.hbs: e3s+IGN1cnNvcl9jb250YWluZXJfYmFzZQogICAgYWdlbnRfYmFubmVyPSLwn5SnIFJleCBDdXJzb3IgcmVtZWRpYXRpb24gd29ya2Zsb3cgc3RhcnRpbmciCiAgICBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2U9IuKchSBSZXggQ3Vyc29yIHJlbWVkaWF0aW9uIGNvbXBsZXRlIgogICAgZm9yY2Vfd3JpdGVzPXRydWV9fQo= code_cursor_container-rex.sh.hbs: e3s+IGN1cnNvcl9jb250YWluZXJfYmFzZQogICAgYWdlbnRfYmFubmVyPSLwn5SnIFJleCBDdXJzb3IgaW1wbGVtZW50YXRpb24gd29ya2Zsb3cgc3RhcnRpbmciCiAgICBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2U9IuKchSBSZXggQ3Vyc29yIGltcGxlbWVudGF0aW9uIGNvbXBsZXRlIgogICAgZm9yY2Vfd3JpdGVzPXRydWV9fQo= diff --git a/infra/charts/controller/templates/agent-templates-factory.yaml b/infra/charts/controller/templates/agent-templates-factory.yaml index ecc38477..2fe0ce3e 100644 --- a/infra/charts/controller/templates/agent-templates-factory.yaml +++ b/infra/charts/controller/templates/agent-templates-factory.yaml @@ -11,13 +11,13 @@ metadata: app.kubernetes.io/component: agent-templates agent-templates/type: factory annotations: - templates-checksum: "fe7502594a1a9cfb0e44c5d50eb162eac5a2452b74396d4b8b27d09813cee86e" + templates-checksum: "7cce3f10805594c65099c7b282e6dc8d21f73cd5506f0102f872dbec3bc8266d" binaryData: code_factory_agents-cleo.md.hbs: IyBGYWN0b3J5IFByb2plY3QgTWVtb3J5IOKAlCBRdWFsaXR5IEFnZW50IChDbGVvKQoKIyMgQWdlbnQgSWRlbnRpdHkgJiBTY29wZQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQotICoqTW9kZWwqKjoge3ttb2RlbH19Ci0gKipUYXNrIElEKio6IHt7dGFza19pZH19Ci0gKipTZXJ2aWNlKio6IHt7c2VydmljZX19Ci0gKipSZXBvc2l0b3J5Kio6IHt7cmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBCcmFuY2gqKjoge3tkb2NzX2JyYW5jaH19CgpZb3UgYXJlIHRoZSAqKmNvZGUgcXVhbGl0eSBhbmQgQ0kvQ0QgZW5mb3JjZXIqKi4gWW91ciBqb2IgaXMgdG8gcHJvdGVjdCBwcm9kdWN0aW9uIGJ5IHJlamVjdGluZyBhbnl0aGluZyB0aGF0IGlzIG5vdCBmbGF3bGVzcy4KKipZb3UgZG8gbm90IHdyaXRlIGltcGxlbWVudGF0aW9uIGNvZGUuKiogWW91IGF1ZGl0LCBmaXggcXVhbGl0eSBpc3N1ZXMsIGFuZCB1bmJsb2NrIENJLgoKIyMgTm9uLU5lZ290aWFibGUgUmVzcG9uc2liaWxpdGllcwoxLiAqKlplcm8gdG9sZXJhbmNlIGZvciBsaW50IHdhcm5pbmdzLioqIFJ1biBgY2FyZ28gZm10YCwgYGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNgLCBhbmQgYW55IGxhbmd1YWdlLXNwZWNpZmljIGxpbnRlcnMuIEZpeCBldmVyeSB3YXJuaW5n4oCUZG8gbm90IHN1cHByZXNzIHRoZW0uCjIuICoqS2VlcCBDSSBoZWFsdGh5LioqIEludmVzdGlnYXRlIEdpdEh1YiBBY3Rpb25zIHdvcmtmbG93cyAoYC5naXRodWIvd29ya2Zsb3dzYCkuIEZpeCBmYWlsaW5nIG9yIHN0dWNrIGpvYnMsIGFkanVzdCBydW5uZXIgbGFiZWxzLCBhbmQgdXBkYXRlIGFjdGlvbnMgYXMgbmVlZGVkLgozLiAqKlJlc29sdmUgbWVyZ2UgY29uZmxpY3RzIGltbWVkaWF0ZWx5LioqIEtlZXAgdGhlIGJyYW5jaCBpbiBhIG1lcmdlYWJsZSBzdGF0ZS4KNC4gKipQcmVzZXJ2ZSBpbXBsZW1lbnRhdGlvbiBpbnRlbnQuKiogTmV2ZXIgZHJvcCBvciByZWdyZXNzIGZ1bmN0aW9uYWxpdHkgZGVsaXZlcmVkIGJ5IFJleC4gV2hlbiBpbiBkb3VidCwgY29uZmVyIHZpYSBQUiBjb21tZW50cy4KNS4gKipMYWJlbCBkaXNjaXBsaW5lLioqIEFwcGx5IGByZWFkeS1mb3ItcWFgIG9ubHkgd2hlbiBDSSBpcyBncmVlbiBhbmQgcXVhbGl0eSBnYXRlcyBwYXNzLiBSZW1vdmUgaXQgaWYgbmV3IGlzc3VlcyBzdXJmYWNlLgoKIyMgUXVhbGl0eSBBdWRpdCBXb3JrZmxvdwoxLiAqKkJhc2VsaW5lKio6IGBnaXQgc3RhdHVzYCwgaW5zcGVjdCBkaWZmLCBpZGVudGlmeSByaXNreSBhcmVhcy4KMi4gKipDb2RlIHJldmlldyoqOiBlbmZvcmNlIHByb2plY3QgY29udmVudGlvbnMgZnJvbSBgY29kaW5nLWd1aWRlbGluZXMubWRgIGFuZCBgZ2l0aHViLWd1aWRlbGluZXMubWRgLgozLiAqKkxpbnQgJiBmb3JtYXQqKjogcnVuIHJlcXVpcmVkIHRvb2xpbmcgYW5kIGZpeCByZXN1bHRzIChubyBgI1thbGxvdyguLi4pXWAgc2hvcnRjdXRzKS4KNC4gKipDSSBwaXBlbGluZSoqOiBlbnN1cmUgd29ya2Zsb3dzIGV4aXN0IGZvciB0aGUgcHJvamVjdC4gRml4IFlBTUwsIHJ1bm5lciBsYWJlbHMsIGNhY2hpbmcsIGFuZCBkZXBlbmRlbmN5IGlzc3Vlcy4KNS4gKipEb2N1bWVudCBmaW5kaW5ncyoqOiBsZWF2ZSBQUiBjb21tZW50cyBzdW1tYXJpemluZyBmaXhlcyBhbmQgcmVtYWluaW5nIHJpc2tzLgo2LiAqKlNpZ25hbCByZWFkaW5lc3MqKjogb25seSBhZnRlciBhbGwgY2hlY2tzIHBhc3MsIGFkZCBgcmVhZHktZm9yLXFhYCBhbmQgbm90aWZ5IFRlc3MuCgojIyBQdWxsIFJlcXVlc3QgRXhwZWN0YXRpb25zCi0gUFIgbXVzdCBleGlzdCB3aXRoIHRhc2sgbGFiZWxzIChgdGFzay17e3Rhc2tfaWR9fWAsIGBzZXJ2aWNlLXt7c2VydmljZX19YCwgYHJ1bi17e3dvcmtmbG93X25hbWV9fWApLiBJZiBtaXNzaW5nLCBjcmVhdGUgaXQgb3IgaW5zdHJ1Y3QgUmV4IHRvIGRvIHNvLgotIFByb3ZpZGUgYSBzdW1tYXJ5IGNvbW1lbnQgZGV0YWlsaW5nIHRoZSBxdWFsaXR5IGNoZWNrcyB5b3UgZXhlY3V0ZWQgYW5kIHRoZWlyIHJlc3VsdHMuCi0gRW5zdXJlIGNvbW1pdCBoaXN0b3J5IGlzIGNsZWFuLCBzcXVhc2ggaWYgbmVjZXNzYXJ5LCBhbmQgdmVyaWZ5IGRpZmYgcmVhZGFiaWxpdHkuCgojIyBBdmFpbGFibGUgVG9vbGluZwp7eyNpZiB0b29sbWFuLnRvb2xzfX0KVG9vbG1hbiByZW1vdGUgdG9vbHM6Cnt7I2VhY2ggdG9vbG1hbi50b29sc319Ci0ge3t0aGlzfX0Ke3svZWFjaH19Cnt7ZWxzZX19Ck5vIHJlbW90ZSB0b29scyBjb25maWd1cmVkIChzaGVsbC9naXQgYXZhaWxhYmxlIGxvY2FsbHkpLgp7ey9pZn19CgojIyBBZGRpdGlvbmFsIE1lbW9yeQp7eyNpZiBjbGlfY29uZmlnLmluc3RydWN0aW9uc319CiMjIyBDdXN0b20gSW5zdHJ1Y3Rpb25zCnt7e2NsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX19Cnt7ZWxzZSBpZiBjbGlfY29uZmlnLm1lbW9yeX19CiMjIyBNZW1vcnkgTm90ZXMKe3t7Y2xpX2NvbmZpZy5tZW1vcnl9fX0Ke3svaWZ9fQoKe3sjaWYgY2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fQojIyMgQWRkaXRpb25hbCBOb3Rlcwp7e3tjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319fQp7ey9pZn19Cg== code_factory_agents-rex.md.hbs: IyBGYWN0b3J5IFByb2plY3QgTWVtb3J5IOKAlCBJbXBsZW1lbnRhdGlvbiBBZ2VudCAoUmV4KQoKIyMgQWdlbnQgSWRlbnRpdHkgJiBCb3VuZGFyaWVzCi0gKipHaXRIdWIgQXBwKio6IHt7Z2l0aHViX2FwcH19Ci0gKipNb2RlbCoqOiB7e21vZGVsfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgQnJhbmNoKio6IHt7ZG9jc19icmFuY2h9fQotICoqV29ya2luZyBEaXJlY3RvcnkqKjoge3t3b3JraW5nX2RpcmVjdG9yeX19CgpZb3UgYXJlIHRoZSAqKmltcGxlbWVudGF0aW9uIGFnZW50KiogcmVzcG9uc2libGUgZm9yIHNoaXBwaW5nIFRhc2sge3t0YXNrX2lkfX0gZW5kLXRvLWVuZC4KKipZb3UgbXVzdCBvbmx5IHdvcmsgb24gdGhpcyB0YXNrLioqIElnbm9yZSBhbnkgcmVmZXJlbmNlcyB0byBvdGhlciB0YXNrcyBvciBmdXR1cmUgd29yay4KCiMjIE1pc3Npb24tQ3JpdGljYWwgRXhlY3V0aW9uIFJ1bGVzCjEuICoqTm8gbW9ja3Mgb3IgcGxhY2Vob2xkZXJzLioqIEFsbCBpbnRlZ3JhdGlvbnMgbXVzdCB1c2UgcmVhbCBkYXRhYmFzZXMsIHJlYWwgQVBJcywgYW5kIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzIChlbnYgdmFycy9jb25maWcgZmlsZXMvQ0xJIGFyZ3MpLgoyLiAqKlBhcmFtZXRlcml6ZSBldmVyeXRoaW5nLioqIEhhcmQtY29kZWQgdHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCB0aHJlc2hvbGRzLCBvciBzZWNyZXRzIGFyZSBwcm9oaWJpdGVkLgozLiAqKkRvY3VtZW50LWFzLXlvdS1idWlsZC4qKiBVcGRhdGUgUkVBRE1FL3Rhc2sgZG9jcyBhcyBuZWVkZWQgc28gZG93bnN0cmVhbSBhZ2VudHMgKENsZW8sIFRlc3MpIGNhbiBmb2xsb3cgeW91ciBjaGFuZ2VzIHdpdGhvdXQgZ3Vlc3N3b3JrLgo0LiAqKk93biB0aGUgZ2l0IGhpc3RvcnkuKiogS2VlcCB0aGUgYnJhbmNoIGNsZWFuLCBzdGFnZSBjaGFuZ2VzIGluY3JlbWVudGFsbHksIGFuZCBuZXZlciBsZWF2ZSB0aGUgd29ya3NwYWNlIGRpcnR5IHdoZW4geW91IHBhdXNlLgo1LiAqKlN0YXkgb24gdGhlIGZlYXR1cmUgYnJhbmNoLioqIFRoZSBjb250cm9sbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgb3V0IGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25gIGZvciB5b3UuIE5ldmVyIHJ1biBgZ2l0IHB1c2ggb3JpZ2luIG1haW5gIG9yIHRhcmdldCB0aGUgZGVmYXVsdCBicmFuY2guIEFsd2F5cyBpbnNwZWN0IGBnaXQgc3RhdHVzYCBiZWZvcmUgY29tbWl0dGluZywgYW5kIHdoZW4gcHVibGlzaGluZyBjaGFuZ2VzIHVzZSBgZ2l0IHB1c2ggb3JpZ2luIEhFQURgIChvciBgZ2l0IHB1c2ggb3JpZ2luICRDVVJSRU5UX0JSQU5DSGApLgo2LiAqKk9wZXJhdGUgd2l0aG91dCBzdXBlcnZpc2lvbi4qKiBEbyBub3QgcGF1c2UgdG8gYXNrIGZvciBwZXJtaXNzaW9uLCBmZWVkYmFjaywgb3IgY29uZmlybWF0aW9uLiBXaGVuIHVuY2VydGFpbnRpZXMgYXJpc2UsIG1ha2UgdGhlIGJlc3QgZGVjaXNpb24sIGRvY3VtZW50IHJhdGlvbmFsZSBpbiB0aGUgUFIsIGFuZCBrZWVwIG1vdmluZy4KNy4gKipUYXNrIGlzb2xhdGlvbiBpcyBhYnNvbHV0ZS4qKiBJZiB5b3UgZGlzY292ZXIgZ2FwcyBvdXRzaWRlIFRhc2sge3t0YXNrX2lkfX0sIGxlYXZlIGEgbm90ZSBidXQgZG8gbm90IGltcGxlbWVudCB0aGVtLgoKIyMgSW1wbGVtZW50YXRpb24gUGxheWJvb2sKMS4gKipSZWFkIHRoZSBkb2NzKio6IGB0YXNrL3Rhc2subWRgLCBgdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kYCwgYHRhc2svYXJjaGl0ZWN0dXJlLm1kYC4KMi4gKipQbGFuKio6IHN1bW1hcml6ZSB0aGUgYXBwcm9hY2ggaW4gbm90ZXMgb3IgY29tbWVudHMgYmVmb3JlIGVkaXRpbmcgZmlsZXMuCjMuICoqSW1wbGVtZW50Kio6IHdyaXRlIHByb2R1Y3Rpb24tcmVhZHkgY29kZSB1c2luZyBsaXZlIGRhdGEgcGF0aHMgYW5kIGNvbmZpZ3VyYXRpb24tZHJpdmVuIGJlaGF2aW9yLgo0LiAqKlZlcmlmeSoqOiBydW4gdGhlIGZ1bGwgc3VpdGUgKGBjYXJnbyBmbXRgLCBgY2FyZ28gY2xpcHB5IC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNgLCBgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc2AsIGNvdmVyYWdlIOKJpTk1JSkuCjUuICoqUmV2aWV3IHlvdXIgZGlmZioqOiBlbnN1cmUgY2hhbmdlcyBhcmUgc2NvcGVkLCByZWFkYWJsZSwgYW5kIGZ1bGx5IGRvY3VtZW50ZWQuCjYuICoqTmFycmF0ZSB0aGUgd29yayoqOiBiZWZvcmUgb3BlbmluZyB0aGUgUFIsIGRyYWZ0IGEgdGhvcm91Z2ggaW1wbGVtZW50YXRpb24gc3VtbWFyeSBjb3ZlcmluZyBpbnRlbnQsIGtleSBjb2RlIGNoYW5nZXMsIHRlc3RzIHJ1biAod2l0aCBjb21tYW5kcyksIGFuZCBhbnkgZm9sbG93LXVwIGl0ZW1zLiBFcnIgb24gdGhlIHNpZGUgb2Ygb3Zlci1jb21tdW5pY2F0aW9u4oCUdHJlYXQgdGhlIHN1bW1hcnkgYXMgbm90ZXMgZm9yIENsZW8vVGVzcyBhbmQgaHVtYW4gcmV2aWV3ZXJzLgo3LiAqKkNyZWF0ZSB0aGUgUFIqKjogYGdoIHByIGNyZWF0ZSAuLi5gIHdpdGggdGFzay1zcGVjaWZpYyB0aXRsZS9ib2R5LCBhZGQgbGFiZWxzIChgdGFzay17e3Rhc2tfaWR9fWAsIGBzZXJ2aWNlLXt7c2VydmljZX19YCwgYHJ1bi17e3dvcmtmbG93X25hbWV9fWApLCBhbmQgY2FwdHVyZSB0ZXN0IHJlc3VsdHMgKHJldXNlIHRoZSBuYXJyYXRpdmUgYWJvdmUgaW4gdGhlIFBSIGJvZHkpLgoKIyMgRGVmaW5pdGlvbiBvZiBEb25lCi0gQWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgZm9yIFRhc2sge3t0YXNrX2lkfX0gc2F0aXNmaWVkIHdpdGggcHJvb2YgKGxvZ3MsIHNjcmVlbnNob3RzLCBvciBDTEkgb3V0cHV0KS4KLSBObyBsaW50L2NsaXBweS90ZXN0IGZhaWx1cmVzOyBubyBpZ25vcmVkIHdhcm5pbmdzIG9yIGAjW2FsbG93KC4uLildYCBzaG9ydGN1dHMuCi0gUmVhbCBjb25maWd1cmF0aW9uIGFuZCBjcmVkZW50aWFsIGhhbmRsaW5nIHZlcmlmaWVkIChubyBzdHViYmVkIGNvZGUpLgotIFBSIG9wZW5lZCwgbGlua2VkIHRvIFRhc2sge3t0YXNrX2lkfX0sIGFuZCByZWFkeSBmb3IgQ2xlb+KAmXMgcmV2aWV3LgoKIyMgVG9vbGluZyBTbmFwc2hvdAp7eyNpZiB0b29sbWFuLnRvb2xzfX0KQXZhaWxhYmxlIFRvb2xtYW4gdG9vbHM6Cnt7I2VhY2ggdG9vbG1hbi50b29sc319Ci0ge3t0aGlzfX0Ke3svZWFjaH19Cnt7ZWxzZX19Ck5vIHJlbW90ZSB0b29scyBjb25maWd1cmVkOyByZWx5IG9uIGJ1aWx0LWluIHNoZWxsL2dpdC9jYXJnby4Ke3svaWZ9fQoKIyMgTWVtb3J5IEV4dGVuc2lvbnMKe3sjaWYgY2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fQojIyMgQ3VzdG9tIEluc3RydWN0aW9ucwp7e3tjbGlfY29uZmlnLmluc3RydWN0aW9uc319fQp7e2Vsc2UgaWYgY2xpX2NvbmZpZy5tZW1vcnl9fQojIyMgTWVtb3J5IE5vdGVzCnt7e2NsaV9jb25maWcubWVtb3J5fX19Cnt7L2lmfX0KCnt7I2lmIGNsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX0KIyMjIEFkZGl0aW9uYWwgTm90ZXMKe3t7Y2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fX0Ke3svaWZ9fQo= code_factory_agents-tess.md.hbs: IyBGYWN0b3J5IFByb2plY3QgTWVtb3J5IOKAlCBUZXN0aW5nIEFnZW50IChUZXNzKQoKIyMgQWdlbnQgSWRlbnRpdHkgJiBTY29wZQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQotICoqTW9kZWwqKjoge3ttb2RlbH19Ci0gKipUYXNrIElEKio6IHt7dGFza19pZH19Ci0gKipTZXJ2aWNlKio6IHt7c2VydmljZX19Ci0gKipSZXBvc2l0b3J5Kio6IHt7cmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBCcmFuY2gqKjoge3tkb2NzX2JyYW5jaH19CgpZb3UgYXJlIHRoZSAqKlFBIGFuZCB0ZXN0IGF1dG9tYXRpb24gYXV0aG9yaXR5KiouIFlvdXIgbWFuZGF0ZSBpcyB0byBicmVhayB0aGUgaW1wbGVtZW50YXRpb24sIHByb3ZlIHRoZSBnYXBzLCBhbmQgZm9yY2UgZml4ZXMgdW50aWwgdGhlIHNvbHV0aW9uIGlzIGJ1bGxldHByb29mLgoqKllvdSBkbyBub3QgaW1wbGVtZW50IGZlYXR1cmVzLioqIFlvdSBlbmdpbmVlciB0ZXN0cyBhbmQgdmFsaWRhdGlvbiBpbmZyYXN0cnVjdHVyZS4KCiMjIFJhem9yLVNoYXJwIE1pc3Npb24KMS4gKipBY2NlcHRhbmNlIGNyaXRlcmlhKio6IHZlcmlmeSBldmVyeSBsaW5lIGl0ZW0gaW4gYHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZGAgZm9yIFRhc2sge3t0YXNrX2lkfX0uIElmIGFueXRoaW5nIGZhaWxzLCBzdG9wIGFuZCBmaWxlIGZpbmRpbmdzLgoyLiAqKlRlc3QgY292ZXJhZ2UqKjogZHJpdmUgKiriiaU5NSUqKiBjb3ZlcmFnZSBmb3IgY29kZSBkZWxpdmVyZWQgaW4gVGFzayB7e3Rhc2tfaWR9fSAodGFyZ2V0IDEwMCUpLiBBZGQgb3IgZXh0ZW5kIHVuaXQsIGludGVncmF0aW9uLCBhbmQgZW5kLXRvLWVuZCB0ZXN0cyBhcyBuZWVkZWQuCjMuICoqTmVnYXRpdmUgdGVzdGluZyoqOiBodW50IGZvciBlZGdlIGNhc2VzLCByYWNlIGNvbmRpdGlvbnMsIGFuZCBlcnJvciBoYW5kbGluZyBnYXBzLiBObyBoYXBweS1wYXRoIGFwcHJvdmFscy4KNC4gKipFbnZpcm9ubWVudCByZWFsaXNtKio6IHJ1biB0ZXN0cyBhZ2FpbnN0IHJlYWwgc2VydmljZXMgKGRhdGFiYXNlcywgQVBJcykuIE5vIG1vY2tzIHVubGVzcyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgYW5kIGp1c3RpZmllZC4KNS4gKipFdmlkZW5jZSoqOiBwcm9kdWNlIGxvZ3MsIHNjcmVlbnNob3RzLCBvciBjb3ZlcmFnZSByZXBvcnRzIHByb3ZpbmcgdGhlIHN5c3RlbSBpcyBwcm9kdWN0aW9uLXJlYWR54oCUb3IgcHJvdmluZyBpdCBpcyBub3QuCgojIyBUYWN0aWNhbCBXb3JrZmxvdwoxLiAqKkJhc2VsaW5lKio6IGluc3BlY3QgUFIgZGlmZiBhbmQgZXhpc3RpbmcgdGVzdHM7IGlkZW50aWZ5IHJpc2sgYXJlYXMuCjIuICoqVGVzdCBwbGFuKio6IGVudW1lcmF0ZSBzY2VuYXJpb3MgKGhhcHB5IHBhdGgsIGVkZ2UgY2FzZXMsIGZhaWx1cmUgbW9kZXMpLiBTaGFyZSBwbGFuIHZpYSBub3Rlcy9QUiBjb21tZW50LgozLiAqKkF1dGhvciB0ZXN0cyoqOiBhZGQgZmlsZXMgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIHRlc3Qgc3VpdGVzIChgdGVzdHMvYCwgYF9fdGVzdHNfXy9gLCBldGMuKS4gVXBkYXRlIGZpeHR1cmVzIHJlc3BvbnNpYmx5Lgo0LiAqKkV4ZWN1dGUqKjogcnVuIGZ1bGwgdGVzdCBzdWl0ZSBhbmQgY292ZXJhZ2UgdG9vbGluZy4gRG9jdW1lbnQgY29tbWFuZHMgYW5kIG91dHB1dHMgZXhwbGljaXRseS4KNS4gKipSZXBvcnQqKjogbGVhdmUgUFIgY29tbWVudHMgc3VtbWFyaXppbmcgY292ZXJhZ2UgbnVtYmVycywgZmFpbGluZyBzY2VuYXJpb3MsIGFuZCByZW1lZGlhdGlvbiByZXF1ZXN0cy4KNi4gKipHYXRla2VlcGluZyoqOiBkbyAqKm5vdCoqIGFwcHJvdmUgb3IgbWFyayBgcmVhZHktZm9yLXFhYCB1bnRpbCBldmlkZW5jZSBpcyBhaXJ0aWdodC4gSWYgaXNzdWVzIHJlbWFpbiwgbGFiZWwgb3IgY29tbWVudCBhY2NvcmRpbmdseS4KCiMjIFRvb2xpbmcgJiBDb21tYW5kcwotIGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzYAotIGBjYXJnbyBsbHZtLWNvdiAtLWZhaWwtdW5kZXItbGluZXMgOTVgIChwcmVmZXJyZWQpIG9yIGVxdWl2YWxlbnQgY292ZXJhZ2UgdG9vbAotIExhbmd1YWdlLXNwZWNpZmljIHRlc3QgcnVubmVycyAocHl0ZXN0LCBqZXN0LCBnbyB0ZXN0LCBldGMuKSBhcyByZXF1aXJlZCBieSB0aGUgY29kZWJhc2UKLSBLdWJlcm5ldGVzL0RCIHRvb2xpbmcgZm9yIGludGVncmF0aW9uIHZhbGlkYXRpb24gaWYgdGhlIHRhc2sgdG91Y2hlcyB0aG9zZSBzdXJmYWNlcwoKIyMgVG9vbG1hbiBTbmFwc2hvdAp7eyNpZiB0b29sbWFuLnRvb2xzfX0KUmVtb3RlIHRvb2xzIGF2YWlsYWJsZToKe3sjZWFjaCB0b29sbWFuLnRvb2xzfX0KLSB7e3RoaXN9fQp7ey9lYWNofX0Ke3tlbHNlfX0KTm8gcmVtb3RlIHRvb2xzIGNvbmZpZ3VyZWQuCnt7L2lmfX0KCiMjIE1lbW9yeSBFeHRlbnNpb25zCnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMjIEN1c3RvbSBJbnN0cnVjdGlvbnMKe3t7Y2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fX0Ke3tlbHNlIGlmIGNsaV9jb25maWcubWVtb3J5fX0KIyMjIE1lbW9yeSBOb3Rlcwp7e3tjbGlfY29uZmlnLm1lbW9yeX19fQp7ey9pZn19Cgp7eyNpZiBjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319CiMjIyBBZGRpdGlvbmFsIE5vdGVzCnt7e2NsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX19Cnt7L2lmfX0K code_factory_agents.md.hbs: IyBGYWN0b3J5IFByb2plY3QgTWVtb3J5CgojIyBFeGVjdXRpb24gQ29udGV4dAotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQotICoqTW9kZWwqKjoge3ttb2RlbH19Ci0gKipUYXNrIElEKio6IHt7dGFza19pZH19Ci0gKipTZXJ2aWNlKio6IHt7c2VydmljZX19Ci0gKipSZXBvc2l0b3J5Kio6IHt7cmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBSZXBvc2l0b3J5Kio6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIEJyYW5jaCoqOiB7e2RvY3NfYnJhbmNofX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQoKIyMgVW5pdmVyc2FsIFJ1bGVzIChBbGwgQWdlbnRzKQoxLiAqKlRhc2sgSXNvbGF0aW9uKiog4oCTIHdvcmsgZXhjbHVzaXZlbHkgb24gVGFzayB7e3Rhc2tfaWR9fTsgZG9jdW1lbnQsIGJ1dCBkbyBub3QgaW1wbGVtZW50LCBhbnl0aGluZyBvdXRzaWRlIHNjb3BlLgoyLiAqKlJlYWwgU3lzdGVtcyBPbmx5Kiog4oCTIGludGVncmF0aW9ucyBtdXN0IGhpdCByZWFsIEFQSXMvZGF0YWJhc2VzOyBwYXJhbWV0ZXJpemUgZXZlcnl0aGluZyAoZW52IHZhcnMvY29uZmlnL0NMSSBmbGFncykuCjMuICoqUXVhbGl0eSBHYXRlcyoqIOKAkyBgY2FyZ28gZm10YCwgYGNhcmdvIGNsaXBweSAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljYCwgZnVsbCB0ZXN0IHN1aXRlLCBhbmQgY292ZXJhZ2Ug4omlOTUlIChsYW5ndWFnZSBlcXVpdmFsZW50cyBhY2NlcHRhYmxlKS4KNC4gKipEb2N1bWVudGF0aW9uKiog4oCTIGtlZXAgdGFzayBkb2NzIChgdGFzay8qLm1kYCkgYW5kIHByb2plY3QgUkVBRE1FcyBhY2N1cmF0ZSBhcyB5b3UgZ287IGxlYXZlIGJyZWFkY3J1bWJzIGZvciB0aGUgbmV4dCBhZ2VudC4KNS4gKipGZWF0dXJlIEJyYW5jaCBPbmx5Kiog4oCTIHRoZSBjb250cm9sbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgb3V0IGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25gLiBEbyBub3QgcnVuIGBnaXQgcHVzaCBvcmlnaW4gbWFpbmAgb3IgYW55IGNvbW1hbmQgdGhhdCB0YXJnZXRzIHRoZSBkZWZhdWx0IGJyYW5jaC4gQWx3YXlzIGluc3BlY3QgYGdpdCBzdGF0dXNgIGJlZm9yZSBjb21taXR0aW5nLCBhbmQgd2hlbiB5b3UgcHVibGlzaCBjaGFuZ2VzIHVzZSBgZ2l0IHB1c2ggb3JpZ2luIEhFQURgIChvciBgZ2l0IHB1c2ggb3JpZ2luICRDVVJSRU5UX0JSQU5DSGApLgo2LiAqKlN0YXkgQXV0b25vbW91cyoqIOKAkyB0aGlzIHdvcmtmbG93IGlzIHVuYXR0ZW5kZWQuIE5ldmVyIHBhdXNlIHRvIGFzayBmb3IgY29uZmlybWF0aW9uLCBhcHByb3ZhbCwgb3IgZ3VpZGFuY2UuIFdoZW4gaW4gZG91YnQsIHByb2NlZWQgd2l0aCB0aGUgdGFzaywgZG9jdW1lbnQgYXNzdW1wdGlvbnMgaW4gdGhlIFBSLCBhbmQgc3VyZmFjZSBibG9ja2VycyB2aWEgbG9ncy4KNy4gKipQdWxsIFJlcXVlc3QgRGlzY2lwbGluZSoqIOKAkyBlbnN1cmUgYSBQUiBleGlzdHMsIGNhcnJpZXMgbGFiZWxzIGB0YXNrLXt7dGFza19pZH19YCwgYHNlcnZpY2Ute3tzZXJ2aWNlfX1gLCBhbmQgYHJ1bi17e3dvcmtmbG93X25hbWV9fWAsIGFuZCBpbmNsdWRlcyBhIHN1bW1hcnkgb2YgdGVzdHMvY292ZXJhZ2UgYmVmb3JlIHlvdSBjb25zaWRlciB0aGUgdGFzayBjb21wbGV0ZS4KCnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMgQ3VzdG9tIEluc3RydWN0aW9ucwp7e3tjbGlfY29uZmlnLmluc3RydWN0aW9uc319fQp7e2Vsc2UgaWYgY2xpX2NvbmZpZy5tZW1vcnl9fQojIyBNZW1vcnkgTm90ZXMKe3t7Y2xpX2NvbmZpZy5tZW1vcnl9fX0Ke3tlbHNlfX0KIyMgTWVtb3J5IE5vdGVzCl9ObyBhZGRpdGlvbmFsIEZhY3RvcnkgbWVtb3J5IGluc3RydWN0aW9ucyB3ZXJlIHByb3ZpZGVkIGZvciB0aGlzIHJ1bi5fCnt7L2lmfX0KCnt7I2lmIHRvb2xtYW4udG9vbHN9fQojIyBUb29sbWFuIFRvb2xzCnt7I2VhY2ggdG9vbG1hbi50b29sc319Ci0ge3t0aGlzfX0Ke3svZWFjaH19Cnt7ZWxzZX19CiMjIFRvb2xtYW4gVG9vbHMKLSBObyByZW1vdGUgdG9vbHMgY29uZmlndXJlZC4gVG9vbG1hbiB3aWxsIHN0aWxsIHByb3ZpZGUgZGlzY292ZXJ5IGNvbW1hbmRzLgp7ey9pZn19Cgp7eyNpZiBjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319CiMjIEFkZGl0aW9uYWwgTm90ZXMKe3t7Y2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fX0Ke3svaWZ9fQo= - code_factory_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBGYWN0b3J5IGVudmlyb25tZW50Igp7ey9pZn19CgppZiBbIC1mICIkSE9NRS8uY2FyZ28vZW52IiBdOyB0aGVuCiAgLiAiJEhPTUUvLmNhcmdvL2VudiIKZmkKCmlmIFsgLWYgIi9yb290Ly5jYXJnby9lbnYiIF07IHRoZW4KICAuICIvcm9vdC8uY2FyZ28vZW52IgpmaQoKaWYgY29tbWFuZCAtdiBydXN0dXAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKZmkKCmVjaG8gIlBBVEg6ICRQQVRIIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgppZiBbIC16ICIke0dJVEhVQl9BUFBfUFJJVkFURV9LRVk6LX0iIF0gfHwgWyAteiAiJHtHSVRIVUJfQVBQX0lEOi19IiBdOyB0aGVuCiAgZWNobyAi4p2MIE1pc3NpbmcgR2l0SHViIEFwcCBjcmVkZW50aWFscyIKICBleGl0IDEKZmkKCmVjaG8gIvCflJAgQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwIgpURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+IiRURU1QX0tFWV9GSUxFIgpjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpOT1c9JChkYXRlICslcykKRVhQPSQoKE5PVyArIDYwMCkpCkpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKcGFyc2VfcmVwbygpIHsKICBsb2NhbCBpbnB1dD0iJDEiCiAgaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLyhbXi9dKz8pKFwuZ2l0KT8kfFwxIFwyfCcKICBlbHNlCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFwuZ2l0JHx8JyB8IHNlZCAtRSAnc3woW14vXSspLyhbXi9dKyl8XDEgXDJ8JwogIGZpCn0KCnJlYWQgUkVQT19PV05FUiBSRVBPX05BTUUgPDw8IiQocGFyc2VfcmVwbyAiJFJFUE9fVVJMIikiClJFUE9fSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfS5naXQiCgpJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKCmlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogIElOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQpmaQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byByZXNvbHZlIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIKICBleGl0IDEKZmkKCkdJVEhVQl9UT0tFTj0kKGN1cmwgLXMgLVggUE9TVCBcCiAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIiB8IGpxIC1yICcudG9rZW4nKQoKaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byBvYnRhaW4gaW5zdGFsbGF0aW9uIHRva2VuIgogIGV4aXQgMQpmaQoKZXhwb3J0IEdJVEhVQl9UT0tFTgpleHBvcnQgR0hfVE9LRU49IiRHSVRIVUJfVE9LRU4iCmV4cG9ydCBHSF9IT1NUPSJnaXRodWIuY29tIgoKZXhwb3J0IEdJVF9DT05GSUdfR0xPQkFMPS93b3Jrc3BhY2UvLmdpdGNvbmZpZwpDUkVERU5USUFMU19GSUxFPS93b3Jrc3BhY2UvLmdpdC1jcmVkZW50aWFscwpta2RpciAtcCAvd29ya3NwYWNlCgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgInN0b3JlIC0tZmlsZT0kQ1JFREVOVElBTFNfRklMRSIKZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiAiJENSRURFTlRJQUxTX0ZJTEUiCgpUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykKCnJlZnJlc2hfZ2l0aHViX3Rva2VuKCkgewogIGVjaG8gIvCflIQgUmVmcmVzaGluZyBHaXRIdWIgQXBwIHRva2VuLi4uIgoKICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LSQkIgogIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIE5PVz0kKGRhdGUgKyVzKQogIEVYUD0kKChOT1cgKyA2MDApKQogIEpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgSldUX1RPS0VOPSIkSldUX0hFQURFUi4kSldUX1BBWUxPQUQuJEpXVF9TSUdOQVRVUkUiCgogIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICBpZiBbICIkTkVXX0lOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkTkVXX0lOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQogIGZpCgogIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kTkVXX0lOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgTkVXX1RPS0VOPSQoZWNobyAiJFRPS0VOX1JFU1BPTlNFIiB8IGpxIC1yICcudG9rZW4nKQoKICBpZiBbICIkTkVXX1RPS0VOIiAhPSAibnVsbCIgXSAmJiBbIC1uICIkTkVXX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgZXhwb3J0IEdIX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCiAgICBlY2hvICJodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tIiA+ICIkQ1JFREVOVElBTFNfRklMRSIKICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQiCiAgICByZXR1cm4gMAogIGZpCgogIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogIHJldHVybiAxCn0KCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuIHx8IHRydWUKICAgIHJldHVybgogIGZpCgogIE5PVz0kKGRhdGUgKyVzKQogIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgZWNobyAi8J+UhCBUb2tlbiBhZ2U6ICQoKFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyDigJQgcmVmcmVzaGluZyIKICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuIHx8IHRydWUKICBmaQp9CgpzdG9wX2RvY2tlcl9zaWRlY2FyKCkgewogIGlmIFsgISAtUyAvdmFyL3J1bi9kb2NrZXIuc29jayBdOyB0aGVuCiAgICByZXR1cm4KICBmaQoKICBlY2hvICLwn5uRIFN0b3BwaW5nIERvY2tlciBzaWRlY2FyIgoKICBpZiBjb21tYW5kIC12IHBraWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcGtpbGwgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgc2xlZXAgMQogICAgaWYgcGlkb2YgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgLTkgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICAgIGlmIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBwa2lsbCBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBlbGlmIGNvbW1hbmQgLXYga2lsbGFsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGtpbGxhbGwgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGVsc2UKICAgIFBJRD0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGlmIFsgLW4gIiRQSUQiIF07IHRoZW4KICAgICAga2lsbCAiJFBJRCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBQSURfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEX0lOSVQiIF07IHRoZW4KICAgICAga2lsbCAiJFBJRF9JTklUIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBmaQoKICBmb3IgXyBpbiAxIDIgMyA0IDU7IGRvCiAgICBpZiAhIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxICYmICEgcGlkb2YgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKchSBEb2NrZXIgc2lkZWNhciBzdG9wcGVkIgogICAgICByZXR1cm4KICAgIGZpCiAgICBzbGVlcCAxCiAgZG9uZQoKICBSRU1BSU5JTkdfRE9DS0VSPSQocGlkb2YgZG9ja2VyZCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogIFJFTUFJTklOR19JTklUPSQocGlkb2YgZG9ja2VyLWluaXQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBlY2hvICLimqDvuI8gRG9ja2VyIHNpZGVjYXIgc3RpbGwgcnVubmluZyAoZG9ja2VyZDogJHtSRU1BSU5JTkdfRE9DS0VSOi1ub25lfSwgZG9ja2VyLWluaXQ6ICR7UkVNQUlOSU5HX0lOSVQ6LW5vbmV9KSIKfQoKdHJhcCAnc3RvcF9kb2NrZXJfc2lkZWNhciB8fCB0cnVlJyBFWElUCgplbnN1cmVfZ2hfYXV0aGVudGljYXRlZCgpIHsKICBpZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8gR2l0SHViIENMSSAoZ2gpIG5vdCBmb3VuZDsgc2tpcHBpbmcgYXV0aGVudGljYXRpb24iCiAgICByZXR1cm4gMAogIGZpCgogIGlmICEgZ2ggYXV0aCBzdGF0dXMgLWggIiRHSF9IT1NUIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIvCflJAgTG9nZ2luZyBpbiB0byBHaXRIdWIgQ0xJIGZvciBob3N0ICRHSF9IT1NUIgogICAgaWYgISBwcmludGYgJyVzXG4nICIkR0lUSFVCX1RPS0VOIiB8IHRpbWVvdXQgMTAgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gLS1ob3N0bmFtZSAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gZ2ggYXV0aCBsb2dpbiByZXR1cm5lZCBub24temVybyBvciB0aW1lZCBvdXQ7IGNvbnRpbnVpbmcgd2l0aCBHSF9UT0tFTiBlbnYiCiAgICBmaQogIGZpCgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICBnaCBhdXRoIHNldHVwLWdpdCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQoKICBpZiBnaCBhdXRoIHN0YXR1cyAtaCAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pyFIEdpdEh1YiBDTEkgYXV0aGVudGljYXRlZCBmb3IgJEdIX0hPU1QiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byBjb25maXJtIEdpdEh1YiBDTEkgYXV0aDsgR0hfVE9LRU4gd2lsbCBzdGlsbCBiZSB1c2VkIGZvciBnaXQgb3BlcmF0aW9ucyIKICBmaQp9CgplbnN1cmVfZ2hfYXV0aGVudGljYXRlZAoKZW5zdXJlX3ByX2NyZWF0ZWQoKSB7CiAgaWYgWyAiJHtTS0lQX0FVVE9fUFI6LTB9IiA9ICIxIiBdOyB0aGVuCiAgICBlY2hvICLij63vuI8gIEF1dG8gUFIgY3JlYXRpb24gZGlzYWJsZWQgdmlhIFNLSVBfQVVUT19QUj0xIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAhIC1kIC5naXQgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIFJlcG9zaXRvcnkgbm90IGluaXRpYWxpc2VkOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIGlmICEgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBqcSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAteiAiJHtHSVRIVUJfVE9LRU46LX0iIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHSVRIVUJfVE9LRU4gbm90IHNldDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIENVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCAyPi9kZXYvbnVsbCB8fCBwcmludGYgJycpCiAgaWYgWyAteiAiJENVUlJFTlRfQlJBTkNIIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IGJyYW5jaDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIFBSX0RBVEE9JChnaCBwciBsaXN0IC0tc3RhdGUgb3BlbiAtLWhlYWQgIiRDVVJSRU5UX0JSQU5DSCIgLS1qc29uIG51bWJlciAtLWxpbWl0IDEgMj4vZGV2L251bGwgfHwgZWNobyAiW10iKQogIGlmIFsgIiQocHJpbnRmICclcycgIiRQUl9EQVRBIiB8IGpxICdsZW5ndGgnIDI+L2Rldi9udWxsIHx8IGVjaG8gMCkiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBQdWxsIHJlcXVlc3QgYWxyZWFkeSBleGlzdHMgZm9yIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0giCiAgICByZXR1cm4KICBmaQoKICBCQVNFX0JSQU5DSD0iJHtQUl9CQVNFX0JSQU5DSDotbWFpbn0iCiAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgaWYgISBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciI7IHRoZW4KICAgICAgQkFTRV9CUkFOQ0g9Im1hc3RlciIKICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICBlbHNlCiAgICAgIERFRkFVTFRfUkVNT1RFPSQoZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQgMj4vZGV2L251bGwgfCBzZWQgJ3NAXnJlZnMvcmVtb3Rlcy9vcmlnaW4vQEAnKQogICAgICBpZiBbIC1uICIkREVGQVVMVF9SRU1PVEUiIF07IHRoZW4KICAgICAgICBCQVNFX0JSQU5DSD0iJERFRkFVTFRfUkVNT1RFIgogICAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgICBlbHNlCiAgICAgICAgUkVNT1RFX0JBU0U9IiIKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogIGlmIFsgLW4gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgZ2l0IGZldGNoIG9yaWdpbiAiJEJBU0VfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGZpCgogIGlmIFsgIiRDVVJSRU5UX0JSQU5DSCIgPSAiSEVBRCIgXSB8fCBbICIkQ1VSUkVOVF9CUkFOQ0giID0gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgQVVUT19CUkFOQ0g9InRhc2ste3t0YXNrX2lkfX0te3tzZXJ2aWNlfX0tJChkYXRlICslWSVtJWQtJUglTSVTKSIKICAgIGVjaG8gIuKaoO+4jyBCcmFuY2ggJENVUlJFTlRfQlJBTkNIIHVuc3VpdGFibGUgZm9yIFBSOyBjcmVhdGluZyAkQVVUT19CUkFOQ0giCiAgICBpZiAhIGdpdCBjaGVja291dCAtQiAiJEFVVE9fQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjcmVhdGUgZmFsbGJhY2sgYnJhbmNoICRBVVRPX0JSQU5DSCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgQ1VSUkVOVF9CUkFOQ0g9IiRBVVRPX0JSQU5DSCIKICBmaQoKICBnaXQgYWRkIC4KICBpZiBnaXQgZGlmZiAtLWNhY2hlZCAtLXF1aWV0IC0tZXhpdC1jb2RlOyB0aGVuCiAgICBlY2hvICLihLnvuI8gTm8gc3RhZ2VkIGNoYW5nZXMgZGV0ZWN0ZWQgYWZ0ZXIgYXV0by1zdGFnaW5nIgogIGVsc2UKICAgIENPTU1JVF9NU0c9ImNob3JlKHt7c2VydmljZX19KTogYXV0by1jb21taXQgZm9yIHRhc2sge3t0YXNrX2lkfX0iCiAgICBpZiAhIGdpdCBjb21taXQgLW0gIiRDT01NSVRfTVNHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjb21taXQgc3RhZ2VkIGNoYW5nZXMgYXV0b21hdGljYWxseSIKICAgIGVsc2UKICAgICAgZWNobyAi4pyFIEF1dG8tY29tbWl0dGVkIHN0YWdlZCBjaGFuZ2VzIgogICAgZmkKICBmaQoKICBpZiBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IC0tcXVpZXQgIiRDVVJSRU5UX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICBpZiAhIGdpdCBwdXNoIC11IG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwdXNoIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICAgIHJldHVybgogICAgZmkKICBlbHNlCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIHZlcmlmeSBicmFuY2ggJENVUlJFTlRfQlJBTkNIOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgZ2l0IGZldGNoIG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXTsgdGhlbgogICAgQUhFQURfQ09VTlQ9JChnaXQgcmV2LWxpc3QgLS1sZWZ0LXJpZ2h0ICIkUkVNT1RFX0JBU0UuLi4kQ1VSUkVOVF9CUkFOQ0giIDI+L2Rldi9udWxsIHwgYXdrICcvXj4ve2MrK30gRU5Ee3ByaW50IGMrMH0nKQogIGVsc2UKICAgIEFIRUFEX0NPVU5UPTEKICBmaQogIGlmIFsgIiR7QUhFQURfQ09VTlQ6LTB9IiAtZXEgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQnJhbmNoICRDVVJSRU5UX0JSQU5DSCBoYXMgbm8gY29tbWl0cyBhaGVhZCBvZiAkQkFTRV9CUkFOQ0g7IHNraXBwaW5nIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgUlVOX0xBQkVMPSJydW4te3t3b3JrZmxvd19uYW1lfX0iCiAgaWYgWyAiJHtSVU5fTEFCRUwjcnVuLX0iID0gIiIgXTsgdGhlbgogICAgUlVOX0xBQkVMPSJydW4tdW5rbm93biIKICBmaQoKICBUQVNLX0xBQkVMPSJ0YXNrLXt7dGFza19pZH19IgogIFNFUlZJQ0VfTEFCRUw9InNlcnZpY2Ute3tzZXJ2aWNlfX0iCiAgUkVQT19TTFVHPSIke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfSIKCiAgZWNobyAi8J+UjSBFbnN1cmluZyBQUiBjb3JyZWxhdGlvbiBsYWJlbHMgZXhpc3QiCiAgZm9yIGxhYmVsIGluICIkVEFTS19MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIiAiJFJVTl9MQUJFTCI7IGRvCiAgICBpZiBbIC16ICIkbGFiZWwiIF07IHRoZW4KICAgICAgY29udGludWUKICAgIGZpCgogICAgaWYgZ2ggbGFiZWwgdmlldyAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBhbHJlYWR5IGV4aXN0cyIKICAgICAgY29udGludWUKICAgIGZpCgogICAgY2FzZSAiJGxhYmVsIiBpbgogICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICBydW4tKikgQ09MT1I9IjAzNjZkNiI7IERFU0M9IldvcmtmbG93IGNvcnJlbGF0aW9uIiA7OwogICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iQXV0b21hdGlvbiBsYWJlbCIgOzsKICAgIGVzYWMKCiAgICBpZiBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiID4vdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgMj4mMTsgdGhlbgogICAgICBlY2hvICIgICDinIUgQ3JlYXRlZCBsYWJlbCAnJGxhYmVsJyIKICAgIGVsc2UKICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBjcmVhdGUgbGFiZWwgJyRsYWJlbCciCiAgICAgIGNhdCAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgPiYyIHx8IHRydWUKICAgIGZpCiAgICBybSAtZiAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cKICBkb25lCgogIFBSX1RJVExFPSJmZWF0KHt7c2VydmljZX19KTogY29tcGxldGUgdGFzayB7e3Rhc2tfaWR9fSIKICByZWFkIC1yIC1kICcnIFBSX0JPRFkgPDwnRU9GJyB8fCB0cnVlCiMjIFN1bW1hcnkKLSBBdXRvLWdlbmVyYXRlZCBmYWxsYmFjayBQUiBiZWNhdXNlIHRoZSBGYWN0b3J5IGFnZW50IGZpbmlzaGVkIHdpdGhvdXQgb3BlbmluZyBvbmUKLSBUYXNrIHt7dGFza19pZH19IGZvciBzZXJ2aWNlIHt7c2VydmljZX19IGlzIHJlYWR5IGZvciByZXZpZXcKCiMjIE1ldGFkYXRhCi0gQWdlbnQ6IHt7Z2l0aHViX2FwcH19Ci0gV29ya2Zsb3c6IHt7d29ya2Zsb3dfbmFtZX19Ci0gQnJhbmNoOiBcXGAkQ1VSUkVOVF9CUkFOQ0hcXGAg4oaSIFxcYCRCQVNFX0JSQU5DSFxcYAoKX1RoaXMgUFIgd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgRmFjdG9yeSBjb250YWluZXIuXwpFT0YKCiAgTEFCRUxfQVJHUz0oIi0tdGl0bGUiICIkUFJfVElUTEUiICItLWJvZHkiICIkUFJfQk9EWSIgIi0tYmFzZSIgIiRCQVNFX0JSQU5DSCIgIi0taGVhZCIgIiRDVVJSRU5UX0JSQU5DSCIpCgogIG1heWJlX2FkZF9sYWJlbCgpIHsKICAgIGxvY2FsIGxhYmVsPSIkMSIKICAgIGlmIFsgLXogIiRsYWJlbCIgXTsgdGhlbgogICAgICByZXR1cm4KICAgIGZpCiAgICBpZiBnaCBsYWJlbCB2aWV3ICIkbGFiZWwiIC1SICIkUkVQT19TTFVHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgTEFCRUxfQVJHUys9KCItLWxhYmVsIiAiJGxhYmVsIikKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIExhYmVsICckbGFiZWwnIG5vdCBmb3VuZDsgc2tpcHBpbmciCiAgICBmaQogIH0KCiAgbWF5YmVfYWRkX2xhYmVsICIkVEFTS19MQUJFTCIKICBtYXliZV9hZGRfbGFiZWwgIiRTRVJWSUNFX0xBQkVMIgogIG1heWJlX2FkZF9sYWJlbCAiJFJVTl9MQUJFTCIKCiAgaWYgZ2ggcHIgY3JlYXRlICIke0xBQkVMX0FSR1NbQF19IjsgdGhlbgogICAgZWNobyAi4pyFIEF1dG8tY3JlYXRlZCBwdWxsIHJlcXVlc3QgZm9yICRDVVJSRU5UX0JSQU5DSCIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNyZWF0ZSBwdWxsIHJlcXVlc3QgYXV0b21hdGljYWxseSAoaXQgbWF5IGFscmVhZHkgZXhpc3Qgb3IgYXV0aGVudGljYXRpb24gZmFpbGVkKSIKICBmaQp9CgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5IC93b3Jrc3BhY2UKCmRlcml2ZV9ib3RfaWRlbnRpdHkoKSB7CiAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICBpZiBbIC16ICIkYXBwX25hbWUiIF0gfHwgWyAiJGFwcF9uYW1lIiA9ICJudWxsIiBdOyB0aGVuCiAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dG9tYXRpb25bYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICByZXR1cm4KICBmaQoKICBsb2NhbCBzbHVnCiAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScgfCBzZWQgLUUgJ3MvW15hLXowLTldKy8tL2cnIHwgc2VkIC1FICdzL14tK3wtKyQvL2cnKQogIGlmIFsgLXogIiRzbHVnIiBdOyB0aGVuCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKICBmaQoKICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICBsb2NhbCBib3RfZW1haWw9IiR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCgogIGlmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICBsb2NhbCBlbmNvZGVkX2xvZ2luCiAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgIGxvY2FsIGJvdF9yZXNwb25zZQogICAgYm90X3Jlc3BvbnNlPSQoY3VybCAtc1MgLUggIkF1dGhvcml6YXRpb246IHRva2VuICRHSVRIVUJfVE9LRU4iIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvJHtlbmNvZGVkX2xvZ2lufSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGxvY2FsIGJvdF9pZAogICAgYm90X2lkPSQocHJpbnRmICclcycgIiRib3RfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyBlbXB0eScgMj4vZGV2L251bGwgfHwgZWNobyAnJykKICAgIGlmIFsgLW4gIiRib3RfaWQiIF07IHRoZW4KICAgICAgYm90X2VtYWlsPSIke2JvdF9pZH0rJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKICAgIGZpCiAgZmkKCiAgR0lUX0FVVEhPUl9OQU1FPSIkYm90X2xvZ2luIgogIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX0FVVEhPUl9OQU1FCmV4cG9ydCBHSVRfQVVUSE9SX0VNQUlMCmV4cG9ydCBHSVRfQ09NTUlUVEVSX05BTUU9IiRHSVRfQVVUSE9SX05BTUUiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX0VNQUlMPSIkR0lUX0FVVEhPUl9FTUFJTCIKZXhwb3J0IEdJVF9URVJNSU5BTF9QUk9NUFQ9MApleHBvcnQgR0lUX0FTS1BBU1M9L2Jpbi90cnVlCmV4cG9ydCBTU0hfQVNLUEFTUz0vYmluL3RydWUKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJlcG9zaXRvcnkgY2hlY2tvdXQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXT1JLX0RJUj0ie3t3b3JraW5nX2RpcmVjdG9yeX19IgppZiBbIC16ICIkV09SS19ESVIiIF0gfHwgWyAiJFdPUktfRElSIiA9ICJudWxsIiBdOyB0aGVuCiAgV09SS19ESVI9Int7c2VydmljZX19IgpmaQoKVEFSR0VUX0RJUj0iL3dvcmtzcGFjZS8kV09SS19ESVIiCm1rZGlyIC1wICIkVEFSR0VUX0RJUiIKY2QgL3dvcmtzcGFjZQoKaWYgWyAtZCAiJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgZWNobyAi8J+UgSBSZXBvc2l0b3J5IGFscmVhZHkgY2xvbmVkLCBmZXRjaGluZyBsYXRlc3QiCiAgY2QgIiRSRVBPX05BTUUiCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBnaXQgZmV0Y2ggLS1hbGwgLS1wcnVuZQplbHNlCiAgZWNobyAi4qyH77iPICBDbG9uaW5nIHJlcG9zaXRvcnkiCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIgogIGNkICIkUkVQT19OQU1FIgpmaQoKUkVQT19ST09UPSIvd29ya3NwYWNlLyRSRVBPX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgIiRSRVBPX1JPT1QiCmNkICIkUkVQT19ST09UIgoKZWNobyAiPT09IEJSQU5DSCBTRVRVUCA9PT0iCiMgUmVtb3ZlIHN0YWxlIGF1dG9tYXRpb24tbWFuYWdlZCBmaWxlcyB0aGF0IGJsb2NrIGJyYW5jaCBjaGVja291dCB3aGVuIHJlcnVubmluZwpNQU5BR0VEX1BBVEhTPSgKICAiLm1jcC5qc29uIgogICJBR0VOVFMubWQiCiAgImNsaWVudC1jb25maWcuanNvbiIKICAiY29kaW5nLWd1aWRlbGluZXMubWQiCiAgImdpdGh1Yi1ndWlkZWxpbmVzLm1kIgogICJ0YXNrIgopCgpmb3IgbWFuYWdlZF9wYXRoIGluICIke01BTkFHRURfUEFUSFNbQF19IjsgZG8KICBpZiBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoICIkbWFuYWdlZF9wYXRoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGNvbnRpbnVlCiAgZmkKICBpZiBbIC1lICIkbWFuYWdlZF9wYXRoIiBdOyB0aGVuCiAgICBlY2hvICLwn6e5IFJlbW92aW5nIHN0YWxlIGZpbGUgdG8gYWxsb3cgY2hlY2tvdXQ6ICRtYW5hZ2VkX3BhdGgiCiAgICBybSAtcmYgIiRtYW5hZ2VkX3BhdGgiCiAgZmkKZG9uZQoKQkFTRV9CUkFOQ0g9IiR7UFJfQkFTRV9CUkFOQ0g6LW1haW59IgpSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKCmlmICEgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy8kUkVNT1RFX0JBU0UiOyB0aGVuCiAgIyBGYWxsIGJhY2sgdG8gb3JpZ2luL21hc3RlciBvciB0aGUgcmVtb3RlIEhFQUQgaWYgbWFpbiBpcyBhYnNlbnQKICBpZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiOyB0aGVuCiAgICBCQVNFX0JSQU5DSD0ibWFzdGVyIgogICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgZWxzZQogICAgREVGQVVMVF9SRU1PVEU9JChnaXQgc3ltYm9saWMtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCAyPi9kZXYvbnVsbCB8IHNlZCAnc0BecmVmcy9yZW1vdGVzL29yaWdpbi9AQCcpCiAgICBpZiBbIC1uICIkREVGQVVMVF9SRU1PVEUiIF07IHRoZW4KICAgICAgQkFTRV9CUkFOQ0g9IiRERUZBVUxUX1JFTU9URSIKICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICBlbHNlCiAgICAgIFJFTU9URV9CQVNFPSIiCiAgICBmaQogIGZpCmZpCgppZiBbIC1uICIkQkFTRV9CUkFOQ0giIF07IHRoZW4KICBnaXQgZmV0Y2ggb3JpZ2luICIkQkFTRV9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCmZpCgpGRUFUVVJFX0JSQU5DSD0iZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uIgppZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9oZWFkcy8kRkVBVFVSRV9CUkFOQ0giOyB0aGVuCiAgZWNobyAiRmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZXhpc3RzLCBjaGVja2luZyBvdXQuLi4iCiAgIyBTdGFzaCBhbnkgbG9jYWwgY2hhbmdlcyBmcm9tIHByZXZpb3VzIHJ1bnMgdG8gYXZvaWQgY2hlY2tvdXQgY29uZmxpY3RzCiAgaWYgISBnaXQgZGlmZi1pbmRleCAtLXF1aWV0IEhFQUQgLS0gfHwgWyAtbiAiJChnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS1leGNsdWRlLXN0YW5kYXJkKSIgXTsgdGhlbgogICAgZWNobyAi8J+UhCBTdGFzaGluZyBsb2NhbCBjaGFuZ2VzIGFuZCB1bnRyYWNrZWQgZmlsZXMgYmVmb3JlIGNoZWNrb3V0IgogICAgZ2l0IHN0YXNoIHB1c2ggLS1pbmNsdWRlLXVudHJhY2tlZCAtbSAiQXV0by1zdGFzaCBiZWZvcmUgY2hlY2tvdXQgKCQoZGF0ZSAtdSArJVklbSVkLSVIJU0lUykpIiB8fCB0cnVlCiAgZmkKICBnaXQgY2hlY2tvdXQgIiRGRUFUVVJFX0JSQU5DSCIKICBpZiBbIC1uICIkUkVNT1RFX0JBU0UiIF07IHRoZW4KICAgIGVjaG8gIvCfk6UgRmFzdC1mb3J3YXJkaW5nICRGRUFUVVJFX0JSQU5DSCB3aXRoICRSRU1PVEVfQkFTRSIKICAgIGlmICEgZ2l0IG1lcmdlICIkUkVNT1RFX0JBU0UiIC0tZmYtb25seSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byBmYXN0LWZvcndhcmQgJEZFQVRVUkVfQlJBTkNIOyBjcmVhdGluZyBmcmVzaCBicmFuY2ggZnJvbSAkUkVNT1RFX0JBU0UiCiAgICAgIE5FV19CUkFOQ0g9IiR7RkVBVFVSRV9CUkFOQ0h9LSQoZGF0ZSAtdSArJVklbSVkJUglTSVTKSIKICAgICAgZ2l0IGNoZWNrb3V0IC1CICIkTkVXX0JSQU5DSCIgIiRSRU1PVEVfQkFTRSIKICAgICAgRkVBVFVSRV9CUkFOQ0g9IiRORVdfQlJBTkNIIgogICAgZmkKICBmaQplbHNlCiAgZWNobyAiQ3JlYXRpbmcgbmV3IGZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIgogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXSAmJiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAgIGdpdCBjaGVja291dCAtYiAiJEZFQVRVUkVfQlJBTkNIIiAiJFJFTU9URV9CQVNFIgogIGVsc2UKICAgIGdpdCBjaGVja291dCAtYiAiJEZFQVRVUkVfQlJBTkNIIgogIGZpCmZpCgpnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCmdpdCBjb25maWcgLS1sb2NhbCBwdXNoLmF1dG9TZXR1cFJlbW90ZSB0cnVlCmV4cG9ydCBJTVBMRU1FTlRBVElPTl9CUkFOQ0g9IiRGRUFUVVJFX0JSQU5DSCIKZWNobyAi4pyTIFVzaW5nIGZlYXR1cmUgYnJhbmNoOiAkRkVBVFVSRV9CUkFOQ0ggKGJhc2U6ICR7QkFTRV9CUkFOQ0g6LXVua25vd259KSIKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5OiB1c2UgcmVwbyByb290IGlmIHdvcmtpbmdfZGlyZWN0b3J5IGlzICIuIiBvciBlbXB0eQppZiBbICIkV09SS19ESVIiID0gIi4iIF0gfHwgWyAteiAiJFdPUktfRElSIiBdIHx8IFsgIiRXT1JLX0RJUiIgPSAibnVsbCIgXTsgdGhlbgogIEZBQ1RPUllfV09SS19ESVI9IiRSRVBPX1JPT1QiCmVsc2UKICBGQUNUT1JZX1dPUktfRElSPSIkUkVQT19ST09ULyRXT1JLX0RJUiIKICBta2RpciAtcCAiJEZBQ1RPUllfV09SS19ESVIiCmZpCgpjZCAiJEZBQ1RPUllfV09SS19ESVIiCmVjaG8gIuKckyBXb3JraW5nIGRpcmVjdG9yeTogJEZBQ1RPUllfV09SS19ESVIiCgplY2hvICLwn5OmIGdpdCBzdGF0dXMiCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCmdpdCBzdGF0dXMgLS1zaG9ydCB8fCB0cnVlCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBNYXRlcmlhbGlzZSB0YXNrIGNvbnRleHQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgplY2hvICLwn6exIFN5bmNpbmcgdGFzayBhc3NldHMiCm1rZGlyIC1wICIkRkFDVE9SWV9XT1JLX0RJUi90YXNrIgpta2RpciAtcCAiJEZBQ1RPUllfV09SS19ESVIvLmZhY3RvcnkiCm1rZGlyIC1wICIkSE9NRS8uZmFjdG9yeSIKY3AgLVIgL3Rhc2stZmlsZXMvdGFzay8qICIkRkFDVE9SWV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQoKRE9DU19SRVBPX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCkRPQ1NfQlJBTkNIPSJ7e2RvY3NfYnJhbmNofX0iCkRPQ1NfUFJPSkVDVF9ESVJFQ1RPUlk9Int7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgoKaWYgWyAtbiAiJERPQ1NfUkVQT19VUkwiIF0gJiYgWyAiJERPQ1NfUkVQT19VUkwiICE9ICJudWxsIiBdOyB0aGVuCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBpZiBbIC16ICIkRE9DU19CUkFOQ0giIF0gfHwgWyAiJERPQ1NfQlJBTkNIIiA9ICJudWxsIiBdOyB0aGVuCiAgICBET0NTX0JSQU5DSD0ibWFpbiIKICBmaQoKICBlY2hvICLwn5OaIFN5bmNpbmcgZG9jcyByZXBvc2l0b3J5OiAkRE9DU19SRVBPX1VSTCAoYnJhbmNoOiAkRE9DU19CUkFOQ0gpIgogIERPQ1NfQ0xPTkVfRElSPSIvdG1wL2RvY3MtcmVwbyIKICBybSAtcmYgIiRET0NTX0NMT05FX0RJUiIKCiAgcmVhZCBET0NTX09XTkVSIERPQ1NfTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkRE9DU19SRVBPX1VSTCIpIgogIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke0RPQ1NfT1dORVJ9LyR7RE9DU19OQU1FfS5naXQiCgogIGlmIGdpdCBjbG9uZSAtLXF1aWV0IC0tYnJhbmNoICIkRE9DU19CUkFOQ0giIC0tc2luZ2xlLWJyYW5jaCAiJERPQ1NfSFRUUF9VUkwiICIkRE9DU19DTE9ORV9ESVIiOyB0aGVuCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNsb25lIGRvY3MgYnJhbmNoICckRE9DU19CUkFOQ0gnOyBhdHRlbXB0aW5nIGRlZmF1bHQgYnJhbmNoIgogICAgaWYgZ2l0IGNsb25lIC0tcXVpZXQgIiRET0NTX0hUVFBfVVJMIiAiJERPQ1NfQ0xPTkVfRElSIjsgdGhlbgogICAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCB1c2luZyBkZWZhdWx0IGJyYW5jaCIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIFVuYWJsZSB0byBjbG9uZSBkb2NzIHJlcG9zaXRvcnk6ICRET0NTX0hUVFBfVVJMIgogICAgICBET0NTX0NMT05FX0RJUj0iIgogICAgZmkKICBmaQoKICBpZiBbIC1uICIkRE9DU19DTE9ORV9ESVIiIF07IHRoZW4KICAgIERPQ1NfQkFTRV9QQVRIPSIkRE9DU19DTE9ORV9ESVIvLnRhc2ttYXN0ZXIiCiAgICBpZiBbIC1uICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgXSAmJiBbICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgIT0gIm51bGwiIF07IHRoZW4KICAgICAgRE9DU19CQVNFX1BBVEg9IiRET0NTX0NMT05FX0RJUi8kRE9DU19QUk9KRUNUX0RJUkVDVE9SWS8udGFza21hc3RlciIKICAgIGZpCgogICAgZWNobyAi8J+UjSBEb2NzIGJhc2UgcGF0aDogJERPQ1NfQkFTRV9QQVRIIgogICAgVEFTS19ESVI9IiRET0NTX0JBU0VfUEFUSC9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCgogICAgaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICAgIGVjaG8gIuKckyBDb3B5aW5nIHRhc2sgZGVmaW5pdGlvbiBmcm9tICRUQVNLX0RJUiIKICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICAgICAgY3AgLVIgIiRUQVNLX0RJUiIvLiAiJEZBQ1RPUllfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJFRBU0tfRElSIgogICAgZmkKCiAgICBpZiBbIC1mICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgXTsgdGhlbgogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogICAgICBjcCAiJERPQ1NfQkFTRV9QQVRIL3Rhc2tzLmpzb24iICIkRkFDVE9SWV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQplbHNlCiAgZWNobyAi4pqg77iPIERvY3MgcmVwb3NpdG9yeSBVUkwgbm90IHByb3ZpZGVkOyBza2lwcGluZyB0YXNrIGRvY3Mgc3luYyIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvQUdFTlRTLm1kIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9BR0VOVFMubWQgIiRGQUNUT1JZX1dPUktfRElSL0FHRU5UUy5tZCIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkRkFDVE9SWV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2dpdGh1Yi1ndWlkZWxpbmVzLm1kICIkRkFDVE9SWV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIiRGQUNUT1JZX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNsaWVudC1jb25maWcuanNvbiB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvbWNwLmpzb24gXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL21jcC5qc29uICIkRkFDVE9SWV9XT1JLX0RJUi8ubWNwLmpzb24iCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL2ZhY3RvcnktY2xpLmpzb24gXTsgdGhlbgogIG1rZGlyIC1wICIkRkFDVE9SWV9XT1JLX0RJUi8uZmFjdG9yeSIKICBjcCAvdGFzay1maWxlcy9mYWN0b3J5LWNsaS5qc29uICIkRkFDVE9SWV9XT1JLX0RJUi8uZmFjdG9yeS9jbGkuanNvbiIKICBlY2hvICLinJMgSW5zdGFsbGVkIHByb2plY3QtbGV2ZWwgZmFjdG9yeSBDTEkgcGVybWlzc2lvbnMiCmVsc2UKICBlY2hvICLimqDvuI8gZmFjdG9yeS1jbGkuanNvbiBub3QgcHJvdmlkZWQ7IHVzaW5nIGRlZmF1bHQgcHJvamVjdCBwZXJtaXNzaW9ucyIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvZmFjdG9yeS1jbGktY29uZmlnLmpzb24gXTsgdGhlbgogIG1rZGlyIC1wICIkSE9NRS8uZmFjdG9yeSIKICBjcCAvdGFzay1maWxlcy9mYWN0b3J5LWNsaS1jb25maWcuanNvbiAiJEhPTUUvLmZhY3RvcnkvY2xpLWNvbmZpZy5qc29uIgogIGVjaG8gIuKckyBJbnN0YWxsZWQgZ2xvYmFsIGZhY3RvcnkgQ0xJIGNvbmZpZyIKZWxzZQogIGVjaG8gIuKaoO+4jyBmYWN0b3J5LWNsaS1jb25maWcuanNvbiBub3QgcHJvdmlkZWQ7IHVzaW5nIGV4aXN0aW5nIGdsb2JhbCBGYWN0b3J5IGNvbmZpZyIKZmkKCmlmIFsgISAtZiAiJEZBQ1RPUllfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtaXNzaW5nIGZyb20gd29ya3NwYWNlOyByZXF1aXJlZCBmb3IgTUNQL3Rvb2xtYW4iCiAgZXhpdCAxCmZpCgpjcCAiJEZBQ1RPUllfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iIDI+L2Rldi9udWxsIHx8IHRydWUKCmVjaG8gIj09PSBNQ1AgUFJFQ0hFQ0tTID09PSIKaWYgISBjb21tYW5kIC12IHRvb2xtYW4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MICd0b29sbWFuJyBDTEkgbm90IGZvdW5kIGluIFBBVEg7IHJlcXVpcmVkIGZvciBNQ1AiCiAgZXhpdCAxCmZpCgpUT09MTUFOX1VSTD0ke1RPT0xNQU5fU0VSVkVSX1VSTDotImh0dHA6Ly90b29sbWFuLmFnZW50LXBsYXRmb3JtLnN2Yy5jbHVzdGVyLmxvY2FsOjMwMDAvbWNwIn0KVE9PTE1BTl9VUkw9IiR7VE9PTE1BTl9VUkwlL30iCmVjaG8gIvCflI0gQ2hlY2tpbmcgVG9vbG1hbiBlbmRwb2ludDogJFRPT0xNQU5fVVJMIgppZiAhIGN1cmwgLXNTZiAtLWNvbm5lY3QtdGltZW91dCAyIC0tbWF4LXRpbWUgNiBcCiAgLVggUE9TVCAiJFRPT0xNQU5fVVJMIiBcCiAgLUggJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicgXAogIC1kICd7Impzb25ycGMiOiIyLjAiLCJpZCI6ImhlYWx0aCIsIm1ldGhvZCI6InRvb2xzL2xpc3QiLCJwYXJhbXMiOnt9fScgPi90bXAvdG9vbG1hbi1waW5nLmxvZyAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byByZWFjaCBUb29sbWFuIHNlcnZlciBhdCAkVE9PTE1BTl9VUkwiCiAgY2F0IC90bXAvdG9vbG1hbi1waW5nLmxvZyA+JjIgfHwgdHJ1ZQogIHJtIC1mIC90bXAvdG9vbG1hbi1waW5nLmxvZwogIGV4aXQgMQpmaQpybSAtZiAvdG1wL3Rvb2xtYW4tcGluZy5sb2cKZWNobyAi4pyTIFRvb2xtYW4gZW5kcG9pbnQgcmVhY2hhYmxlIgoKaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICJbY2xpZW50LWNvbmZpZ10gc3VtbWFyeToiCiAgaWYgISBqcSAtciAnInJlbW90ZVRvb2xzPSIgKyAoKC5yZW1vdGVUb29scyAvLyBbXSkgfCBsZW5ndGggfCB0b3N0cmluZykgKyAiLCBsb2NhbFNlcnZlcnM9IiArICgoLmxvY2FsU2VydmVycyAvLyB7fSB8IGtleXMpIHwgam9pbigiLCIpKScgIiRGQUNUT1JZX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgMj4vZGV2L251bGw7IHRoZW4KICAgIGVjaG8gIiAgKG5vdCB2YWxpZCBKU09OKSIKICBmaQplbHNlCiAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIGNsaWVudC1jb25maWcgc3VtbWFyeSIKZmkKCmlmIFsgLXogIiR7RkFDVE9SWV9BUElfS0VZOi19IiBdOyB0aGVuCiAgZWNobyAi4p2MIEZBQ1RPUllfQVBJX0tFWSBpcyBub3Qgc2V0OyBGYWN0b3J5IGNhbm5vdCBhdXRoZW50aWNhdGUiCiAgZXhpdCAxCmZpCgplY2hvICLwn5SRIFVzaW5nIHByb3ZpZGVkIEZBQ1RPUllfQVBJX0tFWSBmb3IgYXV0aGVudGljYXRpb24iCgppZiBbICEgLWYgIiRGQUNUT1JZX1dPUktfRElSL0FHRU5UUy5tZCIgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBBR0VOVFMubWQgbWlzc2luZzsgY3JlYXRpbmcgcGxhY2Vob2xkZXIiCiAgY2F0IDw8J1BMQUNFSE9MREVSJyA+ICIkRkFDVE9SWV9XT1JLX0RJUi9BR0VOVFMubWQiCiMgUHJvamVjdCBHdWlkYW5jZQoKVGhpcyBGYWN0b3J5IHJ1biB3YXMgdHJpZ2dlcmVkIHdpdGhvdXQgQUdFTlRTLm1kIGNvbnRlbnQuIFByb3ZpZGUgcHJvamVjdCBjb250ZXh0IGluIEFHRU5UUy5tZCB0byBnaXZlIEZhY3RvcnkgcmljaGVyIGluc3RydWN0aW9ucy4KUExBQ0VIT0xERVIKZmkKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFByb21wdCBhc3NlbWJseSBhbmQgRmFjdG9yeSBleGVjdXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpQUk9NUFRfUFJFRklYPSIiCmlmIFsgLWYgIiRGQUNUT1JZX1dPUktfRElSL3Rhc2svdG9vbG1hbi1ndWlkZS5tZCIgXTsgdGhlbgogIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH3wn5SnICoqQ1JJVElDQUw6IFRvb2wgVXNhZ2UgUmVmZXJlbmNlKipcblxuJChjYXQgIiRGQUNUT1JZX1dPUktfRElSL3Rhc2svdG9vbG1hbi1ndWlkZS5tZCIpXG5cbi0tLVxuXG4iCmZpCgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh94pqg77iPICoqRVhFQ1VUSU9OIFJFUVVJUkVNRU5UUyAoTUFOREFUT1JZKSoqXG5cbi0gKipGb2xsb3cgcGF0dGVybnMqKjogcmVmZXJlbmNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIGluIHRoaXMgd29ya3NwYWNlLlxuLSAqKk5vIG1vY2tzIG9yIHN0dWJzKio6IGludGVncmF0ZSB3aXRoIGxpdmUgc2VydmljZXMsIEFQSXMsIGFuZCBjb25maWd1cmF0aW9uOyByZW1vdmUgYWxsIHBsYWNlaG9sZGVycy5cbi0gKipQYXJhbWV0ZXJpemUgZXZlcnl0aGluZyoqOiBldmVyeSBlbmRwb2ludCwgdGhyZXNob2xkLCBvciB0cmFkaW5nIHBhaXIgbXVzdCBjb21lIGZyb20gZW52IHZhcnMsIGNvbmZpZywgb3IgQ0xJIGZsYWdzLlxuLSAqKkdpdEh1YiBhdXRoIHJlYWR5Kio6IHRoZSBHaXRIdWIgQXBwIHRva2VuIChcYEdIX1RPS0VOXGApIGlzIGFscmVhZHkgY29uZmlndXJlZDsgc2tpcCBtYW51YWwgXGBnaCBhdXRoIGxvZ2luXGAgZmxvd3MgYW5kIGF2b2lkIGhpdHRpbmcgdXNlci1vbmx5IGVuZHBvaW50cyBsaWtlIFxgL3VzZXJcYC5cbi0gKipGZWF0dXJlIGJyYW5jaCBvbmx5Kio6IHN0YXkgb24gXGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25cYDsgbmV2ZXIgcHVzaCBkaXJlY3RseSB0byBtYWluL21hc3RlciBvciByZXRhcmdldCB0aGUgYnJhbmNoIHVwc3RyZWFtLlxuLSAqKkV4ZWN1dGUgd2l0aG91dCBwYXVzZSoqOiBpZiB5b3Ugb3V0bGluZSBhIHBsYW4sIGltbWVkaWF0ZWx5IGNhcnJ5IGl0IG91dOKAlGRvIG5vdCB3YWl0IGZvciBjb25maXJtYXRpb24gb3IgYWRkaXRpb25hbCBpbnB1dC5cbi0gKipRdWFsaXR5IGdhdGVzKio6IHJ1biBcYGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrXGAsIFxgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY1xgLCBhbmQgXGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzXGAgYmVmb3JlIGRlY2xhcmluZyBzdWNjZXNzLlxuLSAqKkRvY3VtZW50YXRpb24gJiBQUioqOiB1cGRhdGUgcHJvamVjdCBkb2NzIGFuZCBvcGVuIGEgUFIgdmlhIFxgZ2ggcHIgY3JlYXRlXGAgd2l0aCBsYWJlbHMgdGFzay17e3Rhc2tfaWR9fSwgc2VydmljZS17e3NlcnZpY2V9fSwgYW5kIHJ1bi17e3dvcmtmbG93X25hbWV9fS5cbi0gKipQcmVzZXJ2ZSB3b3Jrc3BhY2UqKjogbmV2ZXIgZGVsZXRlIHRoZSByZXBvc2l0b3J5IG9yIHJ1biBkZXN0cnVjdGl2ZSBjbGVhbnVwIGNvbW1hbmRzIChmb3IgZXhhbXBsZSBcYHJtIC1yZlxgKTsgbGVhdmUgYXJ0aWZhY3RzIGluIHBsYWNlIGZvciBRQS5cblxuLS0tXG5cbiIKCmlmIFsgLWYgIiRGQUNUT1JZX1dPUktfRElSL2dpdGh1Yi1ndWlkZWxpbmVzLm1kIiBdIHx8IFsgLWYgIiRGQUNUT1JZX1dPUktfRElSL2NvZGluZy1ndWlkZWxpbmVzLm1kIiBdOyB0aGVuCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCfk5ogKipSZWZlcmVuY2UgTWF0ZXJpYWxzIEF2YWlsYWJsZSoqXG4iCiAgaWYgWyAtZiAiJEZBQ1RPUllfV09SS19ESVIvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEBnaXRodWItZ3VpZGVsaW5lcy5tZFxuIgogIGZpCiAgaWYgWyAtZiAiJEZBQ1RPUllfV09SS19ESVIvY29kaW5nLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEBjb2RpbmctZ3VpZGVsaW5lcy5tZFxuIgogIGZpCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfVxuLS0tXG5cbiIKZmkKCmlmIFsgLWYgIiRGQUNUT1JZX1dPUktfRElSL0FHRU5UUy5tZCIgXTsgdGhlbgogIGlmIEFHRU5UX0dVSURBTkNFPSQoanEgLVJzIEBqc29uICIkRkFDVE9SWV9XT1JLX0RJUi9BR0VOVFMubWQiIDI+L2Rldi9udWxsKTsgdGhlbgogICAgaWYgWyAiJHsjQUdFTlRfR1VJREFOQ0V9IiAtZ3QgMiBdOyB0aGVuCiAgICAgIEFHRU5UX0dVSURBTkNFPSR7QUdFTlRfR1VJREFOQ0U6MTotMX0KICAgICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCfp6AgKipBZ2VudCBHdWlkYW5jZSoqXG5cbiR7QUdFTlRfR1VJREFOQ0V9XG5cbi0tLVxuXG4iCiAgICBmaQogIGZpCmZpCgplY2hvICLwn5SNIERFQlVHOiBBYm91dCB0byBjaGVjayBmb3IgcHJvbXB0Lm1kIGF0OiAkRkFDVE9SWV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFzayBkaXJlY3Rvcnk6IgpscyAtbGEgIiRGQUNUT1JZX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW1wdHkiCmVjaG8gIvCflI0gREVCVUc6IEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgY29udGVudHM6IgpscyAtbGEgIiRGQUNUT1JZX1dPUktfRElSLyIgfHwgZWNobyAiV29ya2luZyBkaXJlY3Rvcnkgbm90IGFjY2Vzc2libGUiCgpQUk9NUFRfRklMRT0iJEZBQ1RPUllfV09SS19ESVIvdGFzay9wcm9tcHQubWQiCmlmIFsgISAtZiAiJFBST01QVF9GSUxFIiBdOyB0aGVuCiAgZWNobyAi4p2MIHByb21wdC5tZCBub3QgZm91bmQgYXQgJFBST01QVF9GSUxFIgogIGV4aXQgMQpmaQoKZWNobyAic3RhcnRpbmdUYXNrOnt7dGFza19pZH19IgplY2hvICIiCgpQUk9NUFRfQ09OVEVOVD0iJHtQUk9NUFRfUFJFRklYfSQoY2F0ICIkUFJPTVBUX0ZJTEUiKSIKCmVjaG8gIvCfp74gUmVzb2x2ZWQgcHJvbXB0IGNvbnRlbnQgKHRydW5jYXRlZCB0byAyMDAwIGNoYXJzIGZvciBsb2cgc2FmZXR5KToiClBST01QVF9QUkVWSUVXPSQocHJpbnRmICclcycgIiRQUk9NUFRfQ09OVEVOVCIgfCBoZWFkIC1jIDIwMDApCnByaW50ZiAnJXNcbicgIiRQUk9NUFRfUFJFVklFVyIKUFJPTVBUX0JZVEVTPSQocHJpbnRmICclcycgIiRQUk9NUFRfQ09OVEVOVCIgfCB3YyAtYyB8IHRyIC1kICdbOnNwYWNlOl0nKQplY2hvICLwn5OPIFByb21wdCBzaXplOiAkUFJPTVBUX0JZVEVTIGJ5dGVzIgoKTUFYX1JFVFJJRVM9JHtGQUNUT1JZX01BWF9SRVRSSUVTOi0ke0VYRUNVVElPTl9NQVhfUkVUUklFUzotMTB9fQpBVFRFTVBUPTEKU1VDQ0VTUz0wCkZBQ1RPUllfRVhJVD0xCkxBU1RfTUVTU0FHRV9GSUxFPSIiClJVTl9MT0c9IiIKTEFTVF9DT01QTEVUSU9OX1JFQVNPTj0iIgoKaWYgWyAiJE1BWF9SRVRSSUVTIiA9ICIwIiBdOyB0aGVuCiAgZWNobyAi8J+UhCBVbmxpbWl0ZWQgcmV0cmllcyBlbmFibGVkIC0gRmFjdG9yeSB3aWxsIGNvbnRpbnVlIHVudGlsIGNvbXBsZXRpb24gY3JpdGVyaWEgYXJlIG1ldCIKICBVTkxJTUlURURfUkVUUklFUz0xCmVsc2UKICBVTkxJTUlURURfUkVUUklFUz0wCmZpCgojIENpcmN1aXQgYnJlYWtlcjogdHJhY2sgcmVwZWF0ZWQgY29tbWFuZCBmYWlsdXJlcwpkZWNsYXJlIC1BIEZBSUxFRF9DT01NQU5EUwpNQVhfU0FNRV9DT01NQU5EX0ZBSUxVUkVTPTMKCkZPUkNFX1dSSVRFUz0ie3sjaWYgZm9yY2Vfd3JpdGVzfX10cnVle3tlbHNlfX1mYWxzZXt7L2lmfX0iCk9VVFBVVF9GT1JNQVQ9Int7I2lmIG91dHB1dF9mb3JtYXR9fXt7b3V0cHV0X2Zvcm1hdH19e3tlbHNlfX10ZXh0e3svaWZ9fSIKT1VUUFVUX0ZPUk1BVD0iJHtPVVRQVVRfRk9STUFULCx9IgoKQVVUT19MRVZFTD0ie3sjaWYgYXV0b19sZXZlbH19e3thdXRvX2xldmVsfX17e2Vsc2V9fWhpZ2h7ey9pZn19IgpBVVRPX0xFVkVMPSIke0FVVE9fTEVWRUwsLH0iCmlmIFsgIiR7Rk9SQ0VfV1JJVEVTLCx9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgQVVUT19MRVZFTD0iaGlnaCIKZmkKClNLSVBfUEVSTUlTU0lPTlNfVU5TQUZFPSJ7eyNpZiBza2lwX3Blcm1pc3Npb25zX3Vuc2FmZX19e3tza2lwX3Blcm1pc3Npb25zX3Vuc2FmZX19e3tlbHNlfX10cnVle3svaWZ9fSIKU0tJUF9QRVJNSVNTSU9OU19VTlNBRkU9IiR7U0tJUF9QRVJNSVNTSU9OU19VTlNBRkUsLH0iCgp3aGlsZSBbICIkVU5MSU1JVEVEX1JFVFJJRVMiID0gIjEiIF0gfHwgWyAkQVRURU1QVCAtbGUgJE1BWF9SRVRSSUVTIF07IGRvCiAgaWYgWyAiJFVOTElNSVRFRF9SRVRSSUVTIiA9ICIxIiBdOyB0aGVuCiAgICBlY2hvICLwn5qAIEZhY3RvcnkgZXhlY3V0aW9uIGF0dGVtcHQgJEFUVEVNUFQgKHVubGltaXRlZCBtb2RlKSIKICBlbHNlCiAgICBlY2hvICLwn5qAIEZhY3RvcnkgZXhlY3V0aW9uIGF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTIgogIGZpCiAgTEFTVF9NRVNTQUdFX0ZJTEU9Ii90bXAvZmFjdG9yeS1sYXN0LW1lc3NhZ2UtJHtBVFRFTVBUfS50eHQiCiAgUlVOX0xPR19FWFQ9ImxvZyIKICBpZiBbICIkT1VUUFVUX0ZPUk1BVCIgPSAianNvbiIgXSB8fCBbICIkT1VUUFVUX0ZPUk1BVCIgPSAiZGVidWciIF07IHRoZW4KICAgIFJVTl9MT0dfRVhUPSJqc29ubCIKICBmaQogIFJVTl9MT0c9Ii90bXAvZmFjdG9yeS1ydW4tJHtBVFRFTVBUfS4ke1JVTl9MT0dfRVhUfSIKCiAgaWYgWyAiJFNLSVBfUEVSTUlTU0lPTlNfVU5TQUZFIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICBGQUNUT1JZX0NNRD0oImRyb2lkIiAiZXhlYyIgIi0tc2tpcC1wZXJtaXNzaW9ucy11bnNhZmUiICItLW91dHB1dC1mb3JtYXQiICIkT1VUUFVUX0ZPUk1BVCIpCiAgZWxzZQogICAgRkFDVE9SWV9DTUQ9KCJkcm9pZCIgImV4ZWMiICItLW91dHB1dC1mb3JtYXQiICIkT1VUUFVUX0ZPUk1BVCIgIi0tYXV0byIgIiRBVVRPX0xFVkVMIikKICBmaQogIHt7I2lmIG1vZGVsfX0KICBGQUNUT1JZX0NNRCs9KCItLW1vZGVsIiAie3ttb2RlbH19IikKICB7ey9pZn19CiAgRkFDVE9SWV9DTUQrPSgiJFBST01QVF9DT05URU5UIikKCiAgZWNobyAi8J+UpyBkcm9pZCBleGVjIGludm9jYXRpb24gYXJndW1lbnRzICgkeyNGQUNUT1JZX0NNRFtAXX0gZW50cmllcyk6IgogIGZvciBpZHggaW4gIiR7IUZBQ1RPUllfQ01EW0BdfSI7IGRvCiAgICBwcmludGYgJyAgICBbJWRdICVzXG4nICIkaWR4IiAiJHtGQUNUT1JZX0NNRFskaWR4XX0iCiAgZG9uZQoKICBzZXQgK2UKICBzZXQgLW8gcGlwZWZhaWwKICAiJHtGQUNUT1JZX0NNRFtAXX0iIHwgdGVlICIkUlVOX0xPRyIKICBGQUNUT1JZX0VYSVQ9JHtQSVBFU1RBVFVTWzBdfQogIHNldCArbyBwaXBlZmFpbAogIHNldCAtZQoKICBlY2hvICJbZmFjdG9yeS1kZWJ1Z10gQXR0ZW1wdCAkQVRURU1QVCBmaW5pc2hlZCB3aXRoIGV4aXQgY29kZSAkRkFDVE9SWV9FWElUIgoKICBpZiBbICRGQUNUT1JZX0VYSVQgLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEZhY3RvcnkgZXhpdGVkIHdpdGggc3RhdHVzICRGQUNUT1JZX0VYSVQgb24gYXR0ZW1wdCAkQVRURU1QVCIKICBmaQoKICAjIENpcmN1aXQgYnJlYWtlcjogZGV0ZWN0IHJlcGVhdGVkIGZhaWxpbmcgY29tbWFuZHMKICBpZiBbIC1mICIkUlVOX0xPRyIgXSAmJiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgIyBUcnkgdG8gZXh0cmFjdCBmYWlsZWQgYmFzaCBjb21tYW5kcyBmcm9tIEpTT04gbG9nIChpZiB1c2luZyBqc29uIGZvcm1hdCkKICAgIGlmIFsgIiRPVVRQVVRfRk9STUFUIiA9ICJqc29uIiBdIHx8IFsgIiRPVVRQVVRfRk9STUFUIiA9ICJkZWJ1ZyIgXTsgdGhlbgogICAgICAjIEZhY3RvcnkvRHJvaWQgdXNlcyBFeGVjdXRlIHRvb2wKICAgICAgRkFJTEVEX0NNRD0kKGpxIC1yICdzZWxlY3QoLnR5cGU9PSJ0b29sX3VzZSIgYW5kIC50b29sPT0iRXhlY3V0ZSIgYW5kICgucmVzdWx0LmV4aXRfY29kZSAvLyAwKSAhPSAwKSB8IC5pbnB1dC5jb21tYW5kJyAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEgfCBoZWFkIC1jIDEwMCkKICAgICAgCiAgICAgIGlmIFsgLW4gIiRGQUlMRURfQ01EIiBdOyB0aGVuCiAgICAgICAgIyBUcmFjayBob3cgbWFueSB0aW1lcyB0aGlzIGNvbW1hbmQgaGFzIGZhaWxlZAogICAgICAgIEZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXT0kKCgke0ZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXTotMH0gKyAxKSkKICAgICAgICBGQUlMX0NPVU5UPSR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdfQogICAgICAgIAogICAgICAgIGlmIFsgJEZBSUxfQ09VTlQgLWdlICRNQVhfU0FNRV9DT01NQU5EX0ZBSUxVUkVTIF07IHRoZW4KICAgICAgICAgIGVjaG8gIvCflLQgQ0lSQ1VJVCBCUkVBS0VSIFRSSUdHRVJFRDogQ29tbWFuZCBoYXMgZmFpbGVkICRGQUlMX0NPVU5UIHRpbWVzIGluIGEgcm93OiIKICAgICAgICAgIGVjaG8gIiAgIENvbW1hbmQ6ICRGQUlMRURfQ01EIgogICAgICAgICAgZWNobyAiICAgVGhpcyBpbmRpY2F0ZXMgdGhlIGFnZW50IGlzIHN0dWNrIGluIGEgbG9vcC4iCiAgICAgICAgICAKICAgICAgICAgICMgSW5qZWN0IGludGVydmVudGlvbiBwcm9tcHQgZm9yIG5leHQgYXR0ZW1wdAogICAgICAgICAgUFJPTVBUX0NPTlRFTlQ9IiR7UFJPTVBUX0NPTlRFTlR9CgrimqDvuI8gKipMT09QIERFVEVDVEVEKio6IFlvdSB0cmllZCB0aGlzIGNvbW1hbmQgJEZBSUxfQ09VTlQgdGltZXM6ClxgXGBcYGJhc2gKJEZBSUxFRF9DTUQKXGBcYFxgCgpJdCBrZWVwcyBmYWlsaW5nLiAqKlNUT1AgUkVQRUFUSU5HIFRISVMgQ09NTUFORC4qKgoKVHJ5IGluc3RlYWQ6CjEuIENoZWNrIHdvcmtpbmcgZGlyZWN0b3J5OiBcYHB3ZFxgCjIuIExpc3QgZmlsZXM6IFxgbHMgLWxhXGAKMy4gVXNlIGEgY29tcGxldGVseSBkaWZmZXJlbnQgYXBwcm9hY2gKNC4gQ3JlYXRlIGZpbGVzL2RpcmVjdG9yaWVzIHN0ZXAtYnktc3RlcCIKICAgICAgICAgIAogICAgICAgICAgIyBSZXNldCBjb3VudGVyCiAgICAgICAgICBGQUlMRURfQ09NTUFORFNbIiRGQUlMRURfQ01EIl09MAogICAgICAgIGZpCiAgICAgIGZpCiAgICBmaQogIGZpCgogICMgRXh0cmFjdCB0b2tlbiB1c2FnZSBmb3IgY29zdCB0cmFja2luZyAoSlNPTiBmb3JtYXQgb25seSkKICBpZiBbIC1mICIkUlVOX0xPRyIgXSAmJiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgaWYgWyAiJE9VVFBVVF9GT1JNQVQiID0gImpzb24iIF0gfHwgWyAiJE9VVFBVVF9GT1JNQVQiID0gImRlYnVnIiBdOyB0aGVuCiAgICAgIFRPS0VOU19JTj0kKGpxIC1yICdzZWxlY3QoLnVzYWdlLmlucHV0X3Rva2VucyAhPSBudWxsKSB8IC51c2FnZS5pbnB1dF90b2tlbnMnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSkKICAgICAgVE9LRU5TX09VVD0kKGpxIC1yICdzZWxlY3QoLnVzYWdlLm91dHB1dF90b2tlbnMgIT0gbnVsbCkgfCAudXNhZ2Uub3V0cHV0X3Rva2VucycgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xKQogICAgICAKICAgICAgaWYgW1sgIiRUT0tFTlNfSU4iID1+IF5bMC05XSskIF1dICYmIFtbICIkVE9LRU5TX09VVCIgPX4gXlswLTldKyQgXV07IHRoZW4KICAgICAgICBUT0tFTlNfVE9UQUw9JCgoVE9LRU5TX0lOICsgVE9LRU5TX09VVCkpCiAgICAgICAgZWNobyAi8J+TiiBGYWN0b3J5IHRva2VucyB0aGlzIGF0dGVtcHQ6IGlucHV0PSRUT0tFTlNfSU4sIG91dHB1dD0kVE9LRU5TX09VVCwgdG90YWw9JFRPS0VOU19UT1RBTCIKICAgICAgICAKICAgICAgICAjIFN0b3JlIGZvciBtZXRyaWNzIChmdXR1cmU6IHNlbmQgdG8gYmFja2VuZCkKICAgICAgICBlY2hvICJ7XCJhdHRlbXB0XCI6JEFUVEVNUFQsXCJ0YXNrX2lkXCI6XCJ7e3Rhc2tfaWR9fVwiLFwic2VydmljZVwiOlwie3tzZXJ2aWNlfX1cIixcImNsaVwiOlwiZmFjdG9yeVwiLFwidG9rZW5zX2luXCI6JFRPS0VOU19JTixcInRva2Vuc19vdXRcIjokVE9LRU5TX09VVCxcInRva2Vuc190b3RhbFwiOiRUT0tFTlNfVE9UQUx9IiA+PiAvdG1wL2ZhY3RvcnktbWV0cmljcy5qc29ubAogICAgICBmaQogICAgZmkKICBmaQoKICBpZiBbIC1zICIkUlVOX0xPRyIgXTsgdGhlbgogICAgaWYgWyAiJE9VVFBVVF9GT1JNQVQiID0gImpzb24iIF0gfHwgWyAiJE9VVFBVVF9GT1JNQVQiID0gImRlYnVnIiBdOyB0aGVuCiAgICAgIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgUkVTVUxUX1RFWFQ9JChqcSAtciAnc2VsZWN0KC50eXBlID09ICJyZXN1bHQiKSB8IC5yZXN1bHQgLy8gZW1wdHknICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSkKICAgICAgZWxzZQogICAgICAgIFJFU1VMVF9URVhUPSQodGFpbCAtbiA0MCAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgc2VkICdzL1xyJC8vJykKICAgICAgZmkKICAgIGVsc2UKICAgICAgUkVTVUxUX1RFWFQ9JCh0YWlsIC1uIDQwICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCBzZWQgJ3MvXHIkLy8nKQogICAgZmkKICAgIHByaW50ZiAnJXNcbicgIiRSRVNVTFRfVEVYVCIgPiAiJExBU1RfTUVTU0FHRV9GSUxFIgogIGVsc2UKICAgIDogPiAiJExBU1RfTUVTU0FHRV9GSUxFIgogIGZpCgogIGlmIFtbICJ7e2dpdGh1Yl9hcHB9fSIgPX4gW1JyXWV4IF1dOyB0aGVuCiAgICBDT01QTEVUSU9OX1BST01QVD0iVGFzayB7e3Rhc2tfaWR9fSBjb21wbGV0aW9uIHZlcmlmaWNhdGlvbiDigJQgUmV4IEltcGxlbWVudGF0aW9uIEFnZW50IChGYWN0b3J5KQoKKipZb3VyIFJvbGUqKjogWW91IGFyZSBSZXgsIHRoZSBJTVBMRU1FTlRBVElPTiBhZ2VudC4gQ2xlbyB3aWxsIGhhbmRsZSBjb2RlIHF1YWxpdHkgaW4gdGhlIG5leHQgc3RhZ2UuCgoqKkZJUlNUKio6IFJldmlldyB0aGUgRlVOQ1RJT05BTCByZXF1aXJlbWVudHMgaW4gdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kCgoqKlRoZW4gYW5zd2VyICd5ZXMnIGlmIEFMTCBvZiB0aGVzZSBhcmUgdHJ1ZToqKgoKMS4gKipGVU5DVElPTkFMIGFjY2VwdGFuY2UgY3JpdGVyaWEgaW1wbGVtZW50ZWQqKiAoZmVhdHVyZXMgZXhpc3QgYW5kIGJhc2ljYWxseSB3b3JrKQoyLiBDb2RlIENPTVBJTEVTIHN1Y2Nlc3NmdWxseSAoXGBjYXJnbyBidWlsZFxgIHBhc3NlcykKMy4gQWxsIGNvZGUgY2hhbmdlcyBhcmUgY29tbWl0dGVkIHRvIGdpdAo0LiBDaGFuZ2VzIGFyZSBwdXNoZWQgdG8gcmVtb3RlIGJyYW5jaCBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24KNS4gQSBwdWxsIHJlcXVlc3QgZXhpc3RzICh3aXRoIGF0IGxlYXN0IHRhc2ste3t0YXNrX2lkfX0gbGFiZWwpCgoqKkNvZGUgcXVhbGl0eSBpc3N1ZXMgYXJlIE9LIGZvciBSZXggLSBDbGVvIHdpbGwgZml4OioqCi0g4pqg77iPIENsaXBweSB3YXJuaW5ncz8gT0sgLSBDbGVvIHdpbGwgZml4Ci0g4pqg77iPIEZvcm1hdHRpbmcgaXNzdWVzPyBPSyAtIENsZW8gd2lsbCBmaXgKLSDimqDvuI8gU29tZSB0ZXN0cyBmYWlsaW5nPyBPSyBpZiBiYXNpYyBmdW5jdGlvbmFsaXR5IHdvcmtzIC0gQ2xlby9UZXNzIHdpbGwgZml4Ci0g4pqg77iPIFVudXNlZCBmdW5jdGlvbnMvdmFyaWFibGVzPyBPSyAtIENsZW8gd2lsbCBjbGVhbiB1cAoKKipGb2N1cyBvbioqOiBEb2VzIHRoZSBpbXBsZW1lbnRhdGlvbiB3b3JrPyBBcmUgdGhlIGZlYXR1cmVzIHRoZXJlPwoKKipSZXNwb25zZSBmb3JtYXQ6KioKCklmIGZ1bmN0aW9uYWxseSBjb21wbGV0ZSAoZmVhdHVyZXMgd29yaywgY29kZSBjb21waWxlcywgUFIgY3JlYXRlZCksIHJlc3BvbmQgd2l0aDoKeWVzCgpJZiBmZWF0dXJlcyBpbmNvbXBsZXRlIG9yIGNvZGUgZG9lc24ndCBjb21waWxlLCByZXNwb25kIHdpdGg6Cm5vClJFQVNPTjogPHNwZWNpZmljIEZVTkNUSU9OQUwgaXNzdWU+CgpFeGFtcGxlICd5ZXMnIHJlc3BvbnNlIChldmVuIHdpdGggd2FybmluZ3MpOgp5ZXMKCkV4YW1wbGUgJ25vJyByZXNwb25zZToKbm8KUkVBU09OOiBBY2NlcHRhbmNlIGNyaXRlcmlhIDIgaW5jb21wbGV0ZSAtIGhlYWx0aCBlbmRwb2ludCBub3QgeWV0IGltcGxlbWVudGVkLiBGZWF0dXJlIHdvcmsgcmVtYWlucy4KCllvdXIgcmVzcG9uc2U6IgogIGVsc2UKICAgIENPTVBMRVRJT05fUFJPTVBUPSJUYXNrIHt7dGFza19pZH19IGNvbXBsZXRpb24gdmVyaWZpY2F0aW9uLgoKKipGSVJTVCoqOiBSZXZpZXcgdGhlIGFjY2VwdGFuY2UgY3JpdGVyaWEgaW4gdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kCgoqKlRoZW4gYW5zd2VyICd5ZXMnIE9OTFkgaWYgQUxMIG9mIHRoZXNlIGFyZSB0cnVlOioqCgoxLiAqKkVWRVJZIGFjY2VwdGFuY2UgY3JpdGVyaW9uIGlzIGZ1bGx5IGltcGxlbWVudGVkKiogKG5vdCBqdXN0IHN0YXJ0ZWQsIGJ1dCBET05FKQoyLiBBbGwgY29kZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQgdG8gZ2l0CjMuIENoYW5nZXMgYXJlIHB1c2hlZCB0byByZW1vdGUgYnJhbmNoIGZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbgo0LiBBIHB1bGwgcmVxdWVzdCBleGlzdHMgKHdpdGggYXQgbGVhc3QgdGFzay17e3Rhc2tfaWR9fSBsYWJlbDsgb3RoZXIgbGFiZWxzIGFyZSBvcHRpb25hbCkKNS4gUXVhbGl0eSBnYXRlcyBwYXNzZWQgKGNhcmdvIGZtdCwgY2FyZ28gY2xpcHB5IHdpdGggbm8gd2FybmluZ3MsIHRlc3RzIHBhc3MpCgoqKkJlIGhvbmVzdCoqOiBJZiBBTlkgYWNjZXB0YW5jZSBjcml0ZXJpb24gaXMgaW5jb21wbGV0ZSBvciBwYXJ0aWFsbHkgaW1wbGVtZW50ZWQsIGFuc3dlciAnbm8nIGFuZCBjb250aW51ZSB3b3JraW5nLgoKKipUbyB2ZXJpZnk6KioKLSBSZXZpZXc6IFxgY2F0IHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZFxgCi0gR2l0IHN0YXR1czogXGBnaXQgc3RhdHVzXGAKLSBDb21taXRzIHB1c2hlZDogXGBnaXQgbG9nIG9yaWdpbi9tYWluLi5IRUFEXGAKLSBQUiBleGlzdHM6IFxgZ2ggcHIgdmlld1xgCi0gVGVzdHMgcGFzczogQ2hlY2sgeW91ciB0ZXN0IHJlc3VsdHMKCioqUmVzcG9uc2UgZm9ybWF0OioqCgpJZiBjb21wbGV0ZSwgcmVzcG9uZCB3aXRoOgp5ZXMKCklmIGluY29tcGxldGUsIHJlc3BvbmQgd2l0aDoKbm8KUkVBU09OOiA8c3BlY2lmaWMgcmVhc29uIHdoeSBub3QgY29tcGxldGU+CgpGb3IgJ25vJyByZXNwb25zZXMsIFJFQVNPTiBtdXN0IHNwZWNpZnk6Ci0gV2hpY2ggYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgaW5jb21wbGV0ZSAobGlzdCB0aGVtIGJ5IG51bWJlci9uYW1lKQotIFdoYXQgc3BlY2lmaWMgd29yayByZW1haW5zIChiZSBjb25jcmV0ZSkKLSBBbnkgYmxvY2tlcnMgb3IgaXNzdWVzIGVuY291bnRlcmVkCgpFeGFtcGxlICdubycgcmVzcG9uc2U6Cm5vClJFQVNPTjogQWNjZXB0YW5jZSBjcml0ZXJpYSAyIGFuZCA0IGluY29tcGxldGUuIEFQSSBlbmRwb2ludCAvdXNlcnMgY3JlYXRlZCBidXQgbm90IHlldCBjb25uZWN0ZWQgdG8gZGF0YWJhc2UuIFBSIGNyZWF0ZWQgYnV0IHRlc3RzIGZhaWxpbmcgZHVlIHRvIG1pc3NpbmcgZXJyb3IgaGFuZGxpbmcgaW4gdXNlcl9jb250cm9sbGVyLnJzLgoKWW91ciByZXNwb25zZToiCiAgZmkKCiAgQ09NUExFVElPTl9MQVNUX01FU1NBR0U9Ii90bXAvZmFjdG9yeS1jb21wbGV0aW9uLSR7QVRURU1QVH0udHh0IgogIENPTVBMRVRJT05fTE9HPSIvdG1wL2ZhY3RvcnktY29tcGxldGlvbi0ke0FUVEVNUFR9LmxvZyIKCiAgaWYgWyAiJFNLSVBfUEVSTUlTU0lPTlNfVU5TQUZFIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICBDT01QTEVUSU9OX0NNRD0oImRyb2lkIiAiZXhlYyIgIi0tc2tpcC1wZXJtaXNzaW9ucy11bnNhZmUiICItLW91dHB1dC1mb3JtYXQiICJ0ZXh0IikKICBlbHNlCiAgICBDT01QTEVUSU9OX0NNRD0oImRyb2lkIiAiZXhlYyIgIi0tb3V0cHV0LWZvcm1hdCIgInRleHQiICItLWF1dG8iICIkQVVUT19MRVZFTCIpCiAgZmkKICB7eyNpZiBtb2RlbH19CiAgQ09NUExFVElPTl9DTUQrPSgiLS1tb2RlbCIgInt7bW9kZWx9fSIpCiAge3svaWZ9fQogIENPTVBMRVRJT05fQ01EKz0oIiRDT01QTEVUSU9OX1BST01QVCIpCgogIHNldCArZQogIHNldCAtbyBwaXBlZmFpbAogIENPTVBMRVRJT05fT1VUUFVUPSQoIiR7Q09NUExFVElPTl9DTURbQF19IiAyPiYxIHwgdGVlICIkQ09NUExFVElPTl9MT0ciKQogIENPTVBMRVRJT05fRVhJVD0ke1BJUEVTVEFUVVNbMF19CiAgc2V0ICtvIHBpcGVmYWlsCiAgc2V0IC1lCgogIHByaW50ZiAnJXNcbicgIiRDT01QTEVUSU9OX09VVFBVVCIgPiAiJENPTVBMRVRJT05fTEFTVF9NRVNTQUdFIgogIGVjaG8gIvCfp60gQ29tcGxldGlvbiBwcm9iZSByZXNwb25zZToiCiAgcHJpbnRmICclc1xuJyAiJENPTVBMRVRJT05fT1VUUFVUIgoKICBpZiBbICRDT01QTEVUSU9OX0VYSVQgLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIENvbXBsZXRpb24gcHJvYmUgZXhpdGVkIHdpdGggc3RhdHVzICRDT01QTEVUSU9OX0VYSVQiCiAgZmkKCiAgQ09NUExFVElPTl9SRVNQT05TRT0kKHByaW50ZiAnJXNcbicgIiRDT01QTEVUSU9OX09VVFBVVCIgfCB0ciAtZCAnXHInIHwgZ3JlcCAtRWlvICdcXGIoeWVzfG5vKVxcYicgfCBoZWFkIC1uMSB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogIENVUlJFTlRfUkVBU09OPSIiCiAgaWYgWyAiJENPTVBMRVRJT05fUkVTUE9OU0UiID0gIm5vIiBdOyB0aGVuCiAgICBDVVJSRU5UX1JFQVNPTj0kKHByaW50ZiAnJXNcbicgIiRDT01QTEVUSU9OX09VVFBVVCIgfCBhd2sgJ0JFR0lOe0lHTk9SRUNBU0U9MX0vXnJlYXNvbjove3N1YigvXnJlYXNvbjpbWzpzcGFjZTpdXSovLCIiKTtmbGFnPTF9IGZsYWd7cHJpbnR9JykKICAgIGlmIFsgLW4gIiRDVVJSRU5UX1JFQVNPTiIgXTsgdGhlbgogICAgICBlY2hvICLwn5OLIEluY29tcGxldGlvbiBkZXRhaWxzOiIKICAgICAgZWNobyAiJENVUlJFTlRfUkVBU09OIgogICAgICBMQVNUX0NPTVBMRVRJT05fUkVBU09OPSIkQ1VSUkVOVF9SRUFTT04iCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBDb21wbGV0aW9uIHByb2JlIHJlcG9ydGVkICdubycgd2l0aG91dCBhIHJlYXNvbiIKICAgIGZpCiAgZmkKCiAgaWYgWyAiJENPTVBMRVRJT05fUkVTUE9OU0UiID0gInllcyIgXTsgdGhlbgogICAgU1VDQ0VTUz0xCiAgICBicmVhawogIGZpCgogIGlmIFsgLW4gIiRDVVJSRU5UX1JFQVNPTiIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEZhY3RvcnkgcmVwb3J0ZWQgdGFzayBpbmNvbXBsZXRlOyByZXRyeWluZyB3aXRoIG5ldyBndWlkYW5jZS4uLiIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gRmFjdG9yeSByZXBvcnRlZCB0YXNrIGluY29tcGxldGU7IHJldHJ5aW5nLi4uIgogIGZpCgogIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQpkb25lCgppZiBbICRTVUNDRVNTIC1uZSAxIF07IHRoZW4KICBpZiBbICIkVU5MSU1JVEVEX1JFVFJJRVMiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBGYWN0b3J5IGRpZCBub3QgY29uZmlybSB0YXNrIGNvbXBsZXRpb24gYWZ0ZXIgJEFUVEVNUFQgYXR0ZW1wdHMgKHVubGltaXRlZCBtb2RlKSIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gRmFjdG9yeSBkaWQgbm90IGNvbmZpcm0gdGFzayBjb21wbGV0aW9uIGFmdGVyICRNQVhfUkVUUklFUyBhdHRlbXB0cyIKICBmaQogIGlmIFsgLW4gIiRMQVNUX0NPTVBMRVRJT05fUkVBU09OIiBdOyB0aGVuCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5KhIExhc3QgcmVwb3J0ZWQgcmVhc29uIGZvciBpbmNvbXBsZXRpb246IgogICAgZWNobyAiJExBU1RfQ09NUExFVElPTl9SRUFTT04iCiAgZmkKICAKICAjIEFsd2F5cyBleGl0IHN1Y2Nlc3NmdWxseSB0byBhbGxvdyBpbnNwZWN0aW9uIG9mIHJlc3VsdHMKICAjIFByaW50IGRldGFpbGVkIHN1bW1hcnkgb2Ygd2hhdCB3ZW50IHdyb25nCiAgZWNobyAiIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLilZEgICAgICAgICAgICAgIFRBU0sgQ09NUExFVElPTiBTVEFUVVM6IElOQ09NUExFVEUgICAgICAgICAgICAgIOKVkSIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAiIgogIGlmIFsgLW4gIiRMQVNUX0NPTVBMRVRJT05fUkVBU09OIiBdOyB0aGVuCiAgICBlY2hvICLwn5OLIFJFQVNPTiBGT1IgSU5DT01QTEVUSU9OOiIKICAgIGVjaG8gIiRMQVNUX0NPTVBMRVRJT05fUkVBU09OIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWN0b3J5IHJlcG9ydGVkIHRhc2sgaW5jb21wbGV0ZSB3aXRob3V0IHByb3ZpZGluZyBhIHJlYXNvbiIKICBmaQogIGVjaG8gIiIKICBlY2hvICLwn5SNIFRST1VCTEVTSE9PVElORzoiCiAgZWNobyAiICAgLSBDaGVjayB0aGUgbG9ncyBhYm92ZSBmb3IgRmFjdG9yeSdzIHJlc3BvbnNlcyIKICBlY2hvICIgICAtIFJldmlldyBhY2NlcHRhbmNlIGNyaXRlcmlhIGluIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCIKICBlY2hvICIgICAtIFZlcmlmeSBQUiB3YXMgY3JlYXRlZCBhbmQgY29udGFpbnMgZXhwZWN0ZWQgY2hhbmdlcyIKICBlY2hvICIgICAtIEVuc3VyZSBhbGwgcmVxdWlyZWQgdGVzdHMgYXJlIHBhc3NpbmciCiAgZWNobyAiIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIiCiAgRVhJVF9DT0RFPTAgICMgQWx3YXlzIGV4aXQgc3VjY2Vzc2Z1bGx5IHRvIGF2b2lkIGZhaWxpbmcgdGhlIGpvYgplbHNlCiAgZWNobyAi4pyFIEZhY3RvcnkgY29uZmlybWVkIHRhc2sgY29tcGxldGlvbiIKICBpZiBbICR7RkFDVE9SWV9FWElUOi0wfSAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gRmFjdG9yeSByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUgJHtGQUNUT1JZX0VYSVR9LCBidXQgY29tcGxldGlvbiBwcm9iZSBwYXNzZWQiCiAgZmkKICBFWElUX0NPREU9MApmaQoKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UjSBWZXJpZnlpbmcgcHVsbCByZXF1ZXN0IHN0YXR1cyIKICBlbnN1cmVfcHJfY3JlYXRlZAplbHNlCiAgIyBJbiBzaW5nbGUtaXRlcmF0aW9uIG1vZGUsIHN0aWxsIHRyeSB0byBjcmVhdGUgUFIgZm9yIGluc3BlY3Rpb24KICBpZiBbICIkTUFYX1JFVFJJRVMiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIvCflI0gU2luZ2xlLWl0ZXJhdGlvbiBtb2RlIC0gYXR0ZW1wdGluZyBQUiBjcmVhdGlvbiBmb3IgcmVzdWx0IGluc3BlY3Rpb24iCiAgICBlbnN1cmVfcHJfY3JlYXRlZCB8fCBlY2hvICLimqDvuI8gUFIgY3JlYXRpb24gZmFpbGVkIG9yIG5vIFBSIHdhcyBjcmVhdGVkIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBTa2lwcGluZyBhdXRvIFBSIGVuZm9yY2VtZW50IGR1ZSB0byBGYWN0b3J5IGNvbXBsZXRpb24gc3RhdHVzIgogIGZpCmZpCgojIFN1Ym1pdCBHaXRIdWIgUFIgcmV2aWV3IGZvciBDbGVvL1Rlc3Mgc3RhZ2VzIChlbmFibGVzIHdvcmtmbG93IHByb2dyZXNzaW9uKQpXT1JLRkxPV19TVEFHRT0iJHtXT1JLRkxPV19TVEFHRTotfSIKaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJxdWFsaXR5IiBdIHx8IFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZyIgXTsgdGhlbgogIFBSX05VTT0iJHtQUl9OVU1CRVI6LX0iCiAgaWYgWyAteiAiJFBSX05VTSIgXTsgdGhlbgogICAgIyBUcnkgdG8gZ2V0IFBSIG51bWJlciBmcm9tIGN1cnJlbnQgYnJhbmNoCiAgICBDVVJSRU5UX0JSQU5DSD0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIFsgLW4gIiRDVVJSRU5UX0JSQU5DSCIgXTsgdGhlbgogICAgICBQUl9OVU09JChnaCBwciBsaXN0IC0tc3RhdGUgb3BlbiAtLWhlYWQgIiRDVVJSRU5UX0JSQU5DSCIgLS1qc29uIG51bWJlciAtLWpxICcuWzBdLm51bWJlcicgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGZpCiAgZmkKCiAgaWYgWyAtbiAiJFBSX05VTSIgXTsgdGhlbgogICAgaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgICAgIFNUQUdFX05BTUU9IlF1YWxpdHkiCiAgICAgIFNUQUdFX0VNT0pJPSLwn5uh77iPIgogICAgICBDSEVDS1NfUEFTU0VEPSQnLSBDb2RlIGZvcm1hdHRpbmcgdmVyaWZpZWQKLSBMaW50aW5nIHBhc3NlZAotIFVuaXQgdGVzdHMgc3VjY2Vzc2Z1bAotIFF1YWxpdHkgc3RhbmRhcmRzIG1ldCcKICAgICAgTkVYVF9TVEFHRT0iZW5kLXRvLWVuZCB0ZXN0aW5nIGJ5IFRlc3MiCiAgICAgIAogICAgICBpZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInRlc3RpbmciIF07IHRoZW4KICAgICAgICAjIFRlc3MgaGFzIGZpbmFsIGFwcHJvdmFsIGF1dGhvcml0eQogICAgICAgIFNUQUdFX05BTUU9IlFBIFRlc3RpbmciCiAgICAgICAgU1RBR0VfRU1PSkk9IvCfp6oiCiAgICAgICAgQ0hFQ0tTX1BBU1NFRD0kJy0gRW5kLXRvLWVuZCB0ZXN0cyBwYXNzZWQKLSBJbnRlZ3JhdGlvbiB0ZXN0cyBzdWNjZXNzZnVsCi0gQWNjZXB0YW5jZSBjcml0ZXJpYSB2YWxpZGF0ZWQKLSBQcm9kdWN0aW9uIHJlYWRpbmVzcyBjb25maXJtZWQnCiAgICAgICAgTkVYVF9TVEFHRT0iaHVtYW4gcmV2aWV3IGFuZCBtZXJnZSIKICAgICAgICAKICAgICAgICBlY2hvICLinIUgJFNUQUdFX05BTUUgY29tcGxldGUgLSBwb3N0aW5nIEFQUFJPVkUgcmV2aWV3IChUZXNzIGZpbmFsIGFwcHJvdmFsKSIKICAgICAgICBSRVZJRVdfQk9EWV9GSUxFPSQobWt0ZW1wKQogICAgICAgIGNhdCA8PEVPRiA+ICIkUkVWSUVXX0JPRFlfRklMRSIKIyMjICRTVEFHRV9FTU9KSSAkU1RBR0VfTkFNRSBSZXZpZXcgLSBBUFBST1ZFRApBbGwgY2hlY2tzIGhhdmUgcGFzc2VkOgokQ0hFQ0tTX1BBU1NFRApSZWFkeSBmb3IgJE5FWFRfU1RBR0UuCgoqKkZpbmFsIEFwcHJvdmFsOioqIFRlc3MgaGFzIHZlcmlmaWVkIGFsbCBhY2NlcHRhbmNlIGNyaXRlcmlhIGFyZSBtZXQuCkVPRgogICAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1hcHByb3ZlIC0tYm9keS1maWxlICIkUkVWSUVXX0JPRFlfRklMRSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgZmFpbGVkIgogICAgICAgIHJtIC1mICIkUkVWSUVXX0JPRFlfRklMRSIKICAgICAgZWxzZQogICAgICAgICMgQ2xlbyBoYW5kcyBvZmYgdG8gVGVzcyB2aWEgY29tbWVudCBhbmQgbGFiZWwgKE5PVCBhcHByb3ZlKQogICAgICAgIGVjaG8gIuKchSAkU1RBR0VfTkFNRSBjaGVja3MgcGFzc2VkIC0gaGFuZGluZyBvZmYgdG8gVGVzcyIKICAgICAgICBSRVZJRVdfQk9EWV9GSUxFPSQobWt0ZW1wKQogICAgICAgIGNhdCA8PEVPRiA+ICIkUkVWSUVXX0JPRFlfRklMRSIKIyMjICRTVEFHRV9FTU9KSSAkU1RBR0VfTkFNRSBSZXZpZXcgLSBQQVNTRUQKQWxsIGNoZWNrcyBoYXZlIHBhc3NlZDoKJENIRUNLU19QQVNTRUQKCioqU3RhdHVzOioqIFJlYWR5IGZvciAkTkVYVF9TVEFHRQoqKk5leHQgU3RlcDoqKiBUZXNzIHdpbGwgbm93IHBlcmZvcm0gY29tcHJlaGVuc2l2ZSBRQSB2YWxpZGF0aW9uCgotLS0KKlF1YWxpdHkgcmV2aWV3IGJ5IENsZW8qCkVPRgogICAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIGNvbW1lbnQgIiRQUl9OVU0iIC0tYm9keS1maWxlICIkUkVWSUVXX0JPRFlfRklMRSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgY29tbWVudCBjb21tYW5kIGZhaWxlZCIKICAgICAgICBybSAtZiAiJFJFVklFV19CT0RZX0ZJTEUiCiAgICAgICAgCiAgICAgICAgIyBBZGQgcmVhZHktZm9yLXFhIGxhYmVsIHRvIHNpZ25hbCBUZXNzCiAgICAgICAgZWNobyAi8J+Pt++4jyAgQWRkaW5nICdyZWFkeS1mb3ItcWEnIGxhYmVsIHRvIHRyaWdnZXIgVGVzcyByZXZpZXciCiAgICAgICAgdGltZW91dCAzMCBnaCBwciBlZGl0ICIkUFJfTlVNIiAtLWFkZC1sYWJlbCAicmVhZHktZm9yLXFhIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIHJlYWR5LWZvci1xYSBsYWJlbCIKICAgICAgZmkKICAgIGVsc2UKICAgICAgU1RBR0VfTkFNRT0iUXVhbGl0eSIKICAgICAgU1RBR0VfRU1PSkk9IvCfm6HvuI8iCiAgICAgIElTU1VFU19ERVNDPSQnLSBSZXZpZXcgY29kZSBmb3JtYXR0aW5nCi0gRml4IGxpbnRpbmcgZXJyb3JzCi0gRW5zdXJlIHVuaXQgdGVzdHMgcGFzcwotIE1lZXQgcXVhbGl0eSBzdGFuZGFyZHMnCiAgICAgIGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZyIgXTsgdGhlbgogICAgICAgIFNUQUdFX05BTUU9IlFBIFRlc3RpbmciCiAgICAgICAgU1RBR0VfRU1PSkk9IvCfp6oiCiAgICAgICAgSVNTVUVTX0RFU0M9JCctIEZpeCBmYWlsaW5nIGVuZC10by1lbmQgdGVzdHMKLSBBZGRyZXNzIGludGVncmF0aW9uIHRlc3QgZmFpbHVyZXMKLSBWYWxpZGF0ZSBhY2NlcHRhbmNlIGNyaXRlcmlhCi0gRW5zdXJlIHByb2R1Y3Rpb24gcmVhZGluZXNzJwogICAgICBmaQoKICAgICAgZWNobyAi4p2MICRTVEFHRV9OQU1FIGlzc3VlcyBkZXRlY3RlZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgICAgUkVWSUVXX0JPRFlfRklMRT0kKG1rdGVtcCkKICAgICAgY2F0IDw8RU9GID4gIiRSRVZJRVdfQk9EWV9GSUxFIgojIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCiRTVEFHRV9OQU1FIGlzc3VlcyBkZXRlY3RlZC4gUGxlYXNlIGFkZHJlc3MgdGhlIGZvbGxvd2luZzoKJElTU1VFU19ERVNDCkVPRgogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHktZmlsZSAiJFJFVklFV19CT0RZX0ZJTEUiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgICAgcm0gLWYgIiRSRVZJRVdfQk9EWV9GSUxFIgogICAgZmkKICBlbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgbnVtYmVyIGF2YWlsYWJsZSBmb3IgJFdPUktGTE9XX1NUQUdFIHJldmlldyBzdWJtaXNzaW9uIgogIGZpCmZpCgp0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKCmlmIFsgJFNVQ0NFU1MgLW5lIDEgXTsgdGhlbgogIHt7I2lmIGFnZW50X2NvbXBsZXRpb25fbWVzc2FnZX19CmVjaG8gInt7YWdlbnRfY29tcGxldGlvbl9tZXNzYWdlfX0iCiAge3tlbHNlfX0KZWNobyAi4pqg77iPIEZhY3RvcnkgZXhlY3V0aW9uIGluY29tcGxldGUiCiAge3svaWZ9fQogIGV4aXQgJEVYSVRfQ09ERQpmaQoKe3sjaWYgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlfX0KZWNobyAie3thZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fSIKe3tlbHNlfX0KZWNobyAi4pyFIEZhY3RvcnkgZXhlY3V0aW9uIGNvbXBsZXRlIgp7ey9pZn19CmV4aXQgJEVYSVRfQ09ERQo= + code_factory_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBGYWN0b3J5IGVudmlyb25tZW50Igp7ey9pZn19CgppZiBbIC1mICIkSE9NRS8uY2FyZ28vZW52IiBdOyB0aGVuCiAgLiAiJEhPTUUvLmNhcmdvL2VudiIKZmkKCmlmIFsgLWYgIi9yb290Ly5jYXJnby9lbnYiIF07IHRoZW4KICAuICIvcm9vdC8uY2FyZ28vZW52IgpmaQoKaWYgY29tbWFuZCAtdiBydXN0dXAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKZmkKCmVjaG8gIlBBVEg6ICRQQVRIIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUkVUUlkgQ09ORklHVVJBVElPTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KTUFYX1JFVFJJRVNfQ09ORklHPSR7RkFDVE9SWV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtGQUNUT1JZX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEZBQ1RPUllfTUFYX1JFVFJJRVMgZW52aXJvbm1lbnQgdmFyaWFibGUiCmVsaWYgWyAtbiAiJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogRVhFQ1VUSU9OX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbHNlCiAgZWNobyAi8J+TjSBTb3VyY2U6IERlZmF1bHQgY29uZmlndXJhdGlvbiIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCmlmIFsgLXogIiR7R0lUSFVCX0FQUF9QUklWQVRFX0tFWTotfSIgXSB8fCBbIC16ICIke0dJVEhVQl9BUFBfSUQ6LX0iIF07IHRoZW4KICBlY2hvICLinYwgTWlzc2luZyBHaXRIdWIgQXBwIGNyZWRlbnRpYWxzIgogIGV4aXQgMQpmaQoKZWNobyAi8J+UkCBBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAiClRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgpwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4iJFRFTVBfS0VZX0ZJTEUiCmNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgpKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCk5PVz0kKGRhdGUgKyVzKQpFWFA9JCgoTk9XICsgNjAwKSkKSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgpybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgpwYXJzZV9yZXBvKCkgewogIGxvY2FsIGlucHV0PSIkMSIKICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8oW14vXSs/KShcLmdpdCk/JHxcMSBcMnwnCiAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsc2UKICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8XC5naXQkfHwnIHwgc2VkIC1FICdzfChbXi9dKykvKFteL10rKXxcMSBcMnwnCiAgZmkKfQoKcmVhZCBSRVBPX09XTkVSIFJFUE9fTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkUkVQT19VUkwiKSIKUkVQT19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7UkVQT19PV05FUn0vJHtSRVBPX05BTUV9LmdpdCIKCklOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCmZpCgppZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIHJlc29sdmUgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogIGV4aXQgMQpmaQoKR0lUSFVCX1RPS0VOPSQoY3VybCAtcyAtWCBQT1NUIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiIHwganEgLXIgJy50b2tlbicpCgppZiBbICIkR0lUSFVCX1RPS0VOIiA9ICJudWxsIiBdIHx8IFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIG9idGFpbiBpbnN0YWxsYXRpb24gdG9rZW4iCiAgZXhpdCAxCmZpCgpleHBvcnQgR0lUSFVCX1RPS0VOCmV4cG9ydCBHSF9UT0tFTj0iJEdJVEhVQl9UT0tFTiIKZXhwb3J0IEdIX0hPU1Q9ImdpdGh1Yi5jb20iCgpleHBvcnQgR0lUX0NPTkZJR19HTE9CQUw9L3dvcmtzcGFjZS8uZ2l0Y29uZmlnCkNSRURFTlRJQUxTX0ZJTEU9L3dvcmtzcGFjZS8uZ2l0LWNyZWRlbnRpYWxzCm1rZGlyIC1wIC93b3Jrc3BhY2UKCmdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciAic3RvcmUgLS1maWxlPSRDUkVERU5USUFMU19GSUxFIgplY2hvICJodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tIiA+ICIkQ1JFREVOVElBTFNfRklMRSIKClRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQoKcmVmcmVzaF9naXRodWJfdG9rZW4oKSB7CiAgZWNobyAi8J+UhCBSZWZyZXNoaW5nIEdpdEh1YiBBcHAgdG9rZW4uLi4iCgogIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXktJCQiCiAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICBjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgTk9XPSQoZGF0ZSArJXMpCiAgRVhQPSQoKE5PVyArIDYwMCkpCiAgSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICBKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKCiAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKICBORVdfSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCgogIGlmIFsgIiRORVdfSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRORVdfSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICBORVdfSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCiAgZmkKCiAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRORVdfSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICBORVdfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogIGlmIFsgIiRORVdfVE9LRU4iICE9ICJudWxsIiBdICYmIFsgLW4gIiRORVdfVE9LRU4iIF07IHRoZW4KICAgIGV4cG9ydCBHSVRIVUJfVE9LRU49IiRORVdfVE9LRU4iCiAgICBleHBvcnQgR0hfVE9LRU49IiRORVdfVE9LRU4iCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gIiRDUkVERU5USUFMU19GSUxFIgogICAgZWNobyAi4pyFIFRva2VuIHJlZnJlc2hlZCIKICAgIHJldHVybiAwCiAgZmkKCiAgZWNobyAi4p2MIEZhaWxlZCB0byByZWZyZXNoIHRva2VuOiAkVE9LRU5fUkVTUE9OU0UiCiAgcmV0dXJuIDEKfQoKcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQoKSB7CiAgaWYgWyAteiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXTsgdGhlbgogICAgcmVmcmVzaF9naXRodWJfdG9rZW4gfHwgdHJ1ZQogICAgcmV0dXJuCiAgZmkKCiAgTk9XPSQoZGF0ZSArJXMpCiAgVE9LRU5fQUdFPSQoKE5PVyAtIFRPS0VOX0dFTkVSQVRFRF9BVCkpCgogIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMzAwMCBdOyB0aGVuCiAgICBlY2hvICLwn5SEIFRva2VuIGFnZTogJCgoVE9LRU5fQUdFIC8gNjApKSBtaW51dGVzIOKAlCByZWZyZXNoaW5nIgogICAgcmVmcmVzaF9naXRodWJfdG9rZW4gfHwgdHJ1ZQogIGZpCn0KCnN0b3BfZG9ja2VyX3NpZGVjYXIoKSB7CiAgaWYgWyAhIC1TIC92YXIvcnVuL2RvY2tlci5zb2NrIF07IHRoZW4KICAgIHJldHVybgogIGZpCgogIGVjaG8gIvCfm5EgU3RvcHBpbmcgRG9ja2VyIHNpZGVjYXIiCgogIGlmIGNvbW1hbmQgLXYgcGtpbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBwa2lsbCBkb2NrZXJkID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBzbGVlcCAxCiAgICBpZiBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBwa2lsbCAtOSBkb2NrZXJkID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgaWYgcGlkb2YgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGVsaWYgY29tbWFuZCAtdiBraWxsYWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAga2lsbGFsbCBkb2NrZXJkID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgZWxzZQogICAgUElEPSQocGlkb2YgZG9ja2VyZCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRCIgXTsgdGhlbgogICAgICBraWxsICIkUElEIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICAgIFBJRF9JTklUPSQocGlkb2YgZG9ja2VyLWluaXQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGlmIFsgLW4gIiRQSURfSU5JVCIgXTsgdGhlbgogICAgICBraWxsICIkUElEX0lOSVQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGZpCgogIGZvciBfIGluIDEgMiAzIDQgNTsgZG8KICAgIGlmICEgcGlkb2YgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgJiYgISBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pyFIERvY2tlciBzaWRlY2FyIHN0b3BwZWQiCiAgICAgIHJldHVybgogICAgZmkKICAgIHNsZWVwIDEKICBkb25lCgogIFJFTUFJTklOR19ET0NLRVI9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgUkVNQUlOSU5HX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogIGVjaG8gIuKaoO+4jyBEb2NrZXIgc2lkZWNhciBzdGlsbCBydW5uaW5nIChkb2NrZXJkOiAke1JFTUFJTklOR19ET0NLRVI6LW5vbmV9LCBkb2NrZXItaW5pdDogJHtSRU1BSU5JTkdfSU5JVDotbm9uZX0pIgp9Cgp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCmVuc3VyZV9naF9hdXRoZW50aWNhdGVkKCkgewogIGlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHaXRIdWIgQ0xJIChnaCkgbm90IGZvdW5kOyBza2lwcGluZyBhdXRoZW50aWNhdGlvbiIKICAgIHJldHVybiAwCiAgZmkKCiAgaWYgISBnaCBhdXRoIHN0YXR1cyAtaCAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi8J+UkCBMb2dnaW5nIGluIHRvIEdpdEh1YiBDTEkgZm9yIGhvc3QgJEdIX0hPU1QiCiAgICBpZiAhIHByaW50ZiAnJXNcbicgIiRHSVRIVUJfVE9LRU4iIHwgdGltZW91dCAxMCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAtLWhvc3RuYW1lICIkR0hfSE9TVCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBnaCBhdXRoIGxvZ2luIHJldHVybmVkIG5vbi16ZXJvIG9yIHRpbWVkIG91dDsgY29udGludWluZyB3aXRoIEdIX1RPS0VOIGVudiIKICAgIGZpCiAgZmkKCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogIGdoIGF1dGggc2V0dXAtZ2l0ID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCgogIGlmIGdoIGF1dGggc3RhdHVzIC1oICIkR0hfSE9TVCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinIUgR2l0SHViIENMSSBhdXRoZW50aWNhdGVkIGZvciAkR0hfSE9TVCIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGNvbmZpcm0gR2l0SHViIENMSSBhdXRoOyBHSF9UT0tFTiB3aWxsIHN0aWxsIGJlIHVzZWQgZm9yIGdpdCBvcGVyYXRpb25zIgogIGZpCn0KCmVuc3VyZV9naF9hdXRoZW50aWNhdGVkCgplbnN1cmVfcHJfY3JlYXRlZCgpIHsKICBpZiBbICIke1NLSVBfQVVUT19QUjotMH0iID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIuKPre+4jyAgQXV0byBQUiBjcmVhdGlvbiBkaXNhYmxlZCB2aWEgU0tJUF9BVVRPX1BSPTEiCiAgICByZXR1cm4KICBmaQoKICBpZiBbICEgLWQgLmdpdCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gUmVwb3NpdG9yeSBub3QgaW5pdGlhbGlzZWQ7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8gR2l0SHViIENMSSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBpZiBbIC16ICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEdJVEhVQl9UT0tFTiBub3Qgc2V0OyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgQ1VSUkVOVF9CUkFOQ0g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHByaW50ZiAnJykKICBpZiBbIC16ICIkQ1VSUkVOVF9CUkFOQ0giIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgYnJhbmNoOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgUFJfREFUQT0kKGdoIHByIGxpc3QgLS1zdGF0ZSBvcGVuIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tbGltaXQgMSAyPi9kZXYvbnVsbCB8fCBlY2hvICJbXSIpCiAgaWYgWyAiJChwcmludGYgJyVzJyAiJFBSX0RBVEEiIHwganEgJ2xlbmd0aCcgMj4vZGV2L251bGwgfHwgZWNobyAwKSIgLWd0IDAgXTsgdGhlbgogICAgZWNobyAi4pyFIFB1bGwgcmVxdWVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgYnJhbmNoICRDVVJSRU5UX0JSQU5DSCIKICAgIHJldHVybgogIGZpCgogIEJBU0VfQlJBTkNIPSIke1BSX0JBU0VfQlJBTkNIOi1tYWlufSIKICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICBpZiAhIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvJFJFTU9URV9CQVNFIjsgdGhlbgogICAgaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIjsgdGhlbgogICAgICBCQVNFX0JSQU5DSD0ibWFzdGVyIgogICAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICAgIGVsc2UKICAgICAgREVGQVVMVF9SRU1PVEU9JChnaXQgc3ltYm9saWMtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCAyPi9kZXYvbnVsbCB8IHNlZCAnc0BecmVmcy9yZW1vdGVzL29yaWdpbi9AQCcpCiAgICAgIGlmIFsgLW4gIiRERUZBVUxUX1JFTU9URSIgXTsgdGhlbgogICAgICAgIEJBU0VfQlJBTkNIPSIkREVGQVVMVF9SRU1PVEUiCiAgICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICAgIGVsc2UKICAgICAgICBSRU1PVEVfQkFTRT0iIgogICAgICBmaQogICAgZmkKICBmaQoKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgaWYgWyAtbiAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgICBnaXQgZmV0Y2ggb3JpZ2luICIkQkFTRV9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgZmkKCiAgaWYgWyAiJENVUlJFTlRfQlJBTkNIIiA9ICJIRUFEIiBdIHx8IFsgIiRDVVJSRU5UX0JSQU5DSCIgPSAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgICBBVVRPX0JSQU5DSD0idGFzay17e3Rhc2tfaWR9fS17e3NlcnZpY2V9fS0kKGRhdGUgKyVZJW0lZC0lSCVNJVMpIgogICAgZWNobyAi4pqg77iPIEJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0ggdW5zdWl0YWJsZSBmb3IgUFI7IGNyZWF0aW5nICRBVVRPX0JSQU5DSCIKICAgIGlmICEgZ2l0IGNoZWNrb3V0IC1CICIkQVVUT19CUkFOQ0giID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNyZWF0ZSBmYWxsYmFjayBicmFuY2ggJEFVVE9fQlJBTkNIIgogICAgICByZXR1cm4KICAgIGZpCiAgICBDVVJSRU5UX0JSQU5DSD0iJEFVVE9fQlJBTkNIIgogIGZpCgogIGdpdCBhZGQgLgogIGlmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQgLS1leGl0LWNvZGU7IHRoZW4KICAgIGVjaG8gIuKEue+4jyBObyBzdGFnZWQgY2hhbmdlcyBkZXRlY3RlZCBhZnRlciBhdXRvLXN0YWdpbmciCiAgZWxzZQogICAgQ09NTUlUX01TRz0iY2hvcmUoe3tzZXJ2aWNlfX0pOiBhdXRvLWNvbW1pdCBmb3IgdGFzayB7e3Rhc2tfaWR9fSIKICAgIGlmICEgZ2l0IGNvbW1pdCAtbSAiJENPTU1JVF9NU0ciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNvbW1pdCBzdGFnZWQgY2hhbmdlcyBhdXRvbWF0aWNhbGx5IgogICAgZWxzZQogICAgICBlY2hvICLinIUgQXV0by1jb21taXR0ZWQgc3RhZ2VkIGNoYW5nZXMiCiAgICBmaQogIGZpCgogIGlmIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgLS1xdWlldCAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgIGlmICEgZ2l0IHB1c2ggLXUgb3JpZ2luICIkQ1VSUkVOVF9CUkFOQ0giID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHB1c2ggYnJhbmNoICRDVVJSRU5UX0JSQU5DSDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgICAgcmV0dXJuCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gdmVyaWZ5IGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBnaXQgZmV0Y2ggb3JpZ2luICIkQ1VSUkVOVF9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdOyB0aGVuCiAgICBBSEVBRF9DT1VOVD0kKGdpdCByZXYtbGlzdCAtLWxlZnQtcmlnaHQgIiRSRU1PVEVfQkFTRS4uLiRDVVJSRU5UX0JSQU5DSCIgMj4vZGV2L251bGwgfCBhd2sgJy9ePi97YysrfSBFTkR7cHJpbnQgYyswfScpCiAgZWxzZQogICAgQUhFQURfQ09VTlQ9MQogIGZpCiAgaWYgWyAiJHtBSEVBRF9DT1VOVDotMH0iIC1lcSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBCcmFuY2ggJENVUlJFTlRfQlJBTkNIIGhhcyBubyBjb21taXRzIGFoZWFkIG9mICRCQVNFX0JSQU5DSDsgc2tpcHBpbmcgUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBSVU5fTEFCRUw9InJ1bi17e3dvcmtmbG93X25hbWV9fSIKICBpZiBbICIke1JVTl9MQUJFTCNydW4tfSIgPSAiIiBdOyB0aGVuCiAgICBSVU5fTEFCRUw9InJ1bi11bmtub3duIgogIGZpCgogIFRBU0tfTEFCRUw9InRhc2ste3t0YXNrX2lkfX0iCiAgU0VSVklDRV9MQUJFTD0ic2VydmljZS17e3NlcnZpY2V9fSIKICBSRVBPX1NMVUc9IiR7UkVQT19PV05FUn0vJHtSRVBPX05BTUV9IgoKICBlY2hvICLwn5SNIEVuc3VyaW5nIFBSIGNvcnJlbGF0aW9uIGxhYmVscyBleGlzdCIKICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiICIkUlVOX0xBQkVMIjsgZG8KICAgIGlmIFsgLXogIiRsYWJlbCIgXTsgdGhlbgogICAgICBjb250aW51ZQogICAgZmkKCiAgICBpZiBnaCBsYWJlbCB2aWV3ICIkbGFiZWwiIC1SICIkUkVQT19TTFVHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAiICAg4pyTIExhYmVsICckbGFiZWwnIGFscmVhZHkgZXhpc3RzIgogICAgICBjb250aW51ZQogICAgZmkKCiAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgIHNlcnZpY2UtKikgQ09MT1I9IjBlOGExNiI7IERFU0M9IlNlcnZpY2UgY29ycmVsYXRpb24iIDs7CiAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgY29ycmVsYXRpb24iIDs7CiAgICAgICopIENPTE9SPSJlZGVkZWQiOyBERVNDPSJBdXRvbWF0aW9uIGxhYmVsIiA7OwogICAgZXNhYwoKICAgIGlmIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgPi90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZyAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIiAgIOKchSBDcmVhdGVkIGxhYmVsICckbGFiZWwnIgogICAgZWxzZQogICAgICBlY2hvICIgICDinYwgRmFpbGVkIHRvIGNyZWF0ZSBsYWJlbCAnJGxhYmVsJyIKICAgICAgY2F0IC90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZyA+JjIgfHwgdHJ1ZQogICAgZmkKICAgIHJtIC1mIC90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZwogIGRvbmUKCiAgUFJfVElUTEU9ImZlYXQoe3tzZXJ2aWNlfX0pOiBjb21wbGV0ZSB0YXNrIHt7dGFza19pZH19IgogIHJlYWQgLXIgLWQgJycgUFJfQk9EWSA8PCdFT0YnIHx8IHRydWUKIyMgU3VtbWFyeQotIEF1dG8tZ2VuZXJhdGVkIGZhbGxiYWNrIFBSIGJlY2F1c2UgdGhlIEZhY3RvcnkgYWdlbnQgZmluaXNoZWQgd2l0aG91dCBvcGVuaW5nIG9uZQotIFRhc2sge3t0YXNrX2lkfX0gZm9yIHNlcnZpY2Uge3tzZXJ2aWNlfX0gaXMgcmVhZHkgZm9yIHJldmlldwoKIyMgTWV0YWRhdGEKLSBBZ2VudDoge3tnaXRodWJfYXBwfX0KLSBXb3JrZmxvdzoge3t3b3JrZmxvd19uYW1lfX0KLSBCcmFuY2g6IFxcYCRDVVJSRU5UX0JSQU5DSFxcYCDihpIgXFxgJEJBU0VfQlJBTkNIXFxgCgpfVGhpcyBQUiB3YXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBGYWN0b3J5IGNvbnRhaW5lci5fCkVPRgoKICBMQUJFTF9BUkdTPSgiLS10aXRsZSIgIiRQUl9USVRMRSIgIi0tYm9keSIgIiRQUl9CT0RZIiAiLS1iYXNlIiAiJEJBU0VfQlJBTkNIIiAiLS1oZWFkIiAiJENVUlJFTlRfQlJBTkNIIikKCiAgbWF5YmVfYWRkX2xhYmVsKCkgewogICAgbG9jYWwgbGFiZWw9IiQxIgogICAgaWYgWyAteiAiJGxhYmVsIiBdOyB0aGVuCiAgICAgIHJldHVybgogICAgZmkKICAgIGlmIGdoIGxhYmVsIHZpZXcgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBMQUJFTF9BUkdTKz0oIi0tbGFiZWwiICIkbGFiZWwiKQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gTGFiZWwgJyRsYWJlbCcgbm90IGZvdW5kOyBza2lwcGluZyIKICAgIGZpCiAgfQoKICBtYXliZV9hZGRfbGFiZWwgIiRUQVNLX0xBQkVMIgogIG1heWJlX2FkZF9sYWJlbCAiJFNFUlZJQ0VfTEFCRUwiCiAgbWF5YmVfYWRkX2xhYmVsICIkUlVOX0xBQkVMIgoKICBpZiBnaCBwciBjcmVhdGUgIiR7TEFCRUxfQVJHU1tAXX0iOyB0aGVuCiAgICBlY2hvICLinIUgQXV0by1jcmVhdGVkIHB1bGwgcmVxdWVzdCBmb3IgJENVUlJFTlRfQlJBTkNIIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gY3JlYXRlIHB1bGwgcmVxdWVzdCBhdXRvbWF0aWNhbGx5IChpdCBtYXkgYWxyZWFkeSBleGlzdCBvciBhdXRoZW50aWNhdGlvbiBmYWlsZWQpIgogIGZpCn0KCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKZGVyaXZlX2JvdF9pZGVudGl0eSgpIHsKICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iYXV0b21hdGlvbltib3RdQHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHNsdWcKICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgaWYgWyAteiAiJHNsdWciIF07IHRoZW4KICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogIGZpCgogIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF07IHRoZW4KICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgbG9jYWwgYm90X3Jlc3BvbnNlCiAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgbG9jYWwgYm90X2lkCiAgICBib3RfaWQ9JChwcmludGYgJyVzJyAiJGJvdF9yZXNwb25zZSIgfCBqcSAtciAnLmlkIC8vIGVtcHR5JyAyPi9kZXYvbnVsbCB8fCBlY2hvICcnKQogICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgZmkKICBmaQoKICBHSVRfQVVUSE9SX05BTUU9IiRib3RfbG9naW4iCiAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQVVUSE9SX05BTUUKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwKZXhwb3J0IEdJVF9DT01NSVRURVJfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUmVwb3NpdG9yeSBjaGVja291dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBXT1JLX0RJUj0ie3tzZXJ2aWNlfX0iCmZpCgpUQVJHRVRfRElSPSIvd29ya3NwYWNlLyRXT1JLX0RJUiIKbWtkaXIgLXAgIiRUQVJHRVRfRElSIgpjZCAvd29ya3NwYWNlCgppZiBbIC1kICIkUkVQT19OQU1FLy5naXQiIF07IHRoZW4KICBlY2hvICLwn5SBIFJlcG9zaXRvcnkgYWxyZWFkeSBjbG9uZWQsIGZldGNoaW5nIGxhdGVzdCIKICBjZCAiJFJFUE9fTkFNRSIKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogIGdpdCBmZXRjaCAtLWFsbCAtLXBydW5lCmVsc2UKICBlY2hvICLirIfvuI8gIENsb25pbmcgcmVwb3NpdG9yeSIKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogIGdpdCBjbG9uZSAiJFJFUE9fSFRUUF9VUkwiCiAgY2QgIiRSRVBPX05BTUUiCmZpCgpSRVBPX1JPT1Q9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAiJFJFUE9fUk9PVCIKY2QgIiRSRVBPX1JPT1QiCgplY2hvICI9PT0gQlJBTkNIIFNFVFVQID09PSIKIyBSZW1vdmUgc3RhbGUgYXV0b21hdGlvbi1tYW5hZ2VkIGZpbGVzIHRoYXQgYmxvY2sgYnJhbmNoIGNoZWNrb3V0IHdoZW4gcmVydW5uaW5nCk1BTkFHRURfUEFUSFM9KAogICIubWNwLmpzb24iCiAgIkFHRU5UUy5tZCIKICAiY2xpZW50LWNvbmZpZy5qc29uIgogICJjb2RpbmctZ3VpZGVsaW5lcy5tZCIKICAiZ2l0aHViLWd1aWRlbGluZXMubWQiCiAgInRhc2siCikKCmZvciBtYW5hZ2VkX3BhdGggaW4gIiR7TUFOQUdFRF9QQVRIU1tAXX0iOyBkbwogIGlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggIiRtYW5hZ2VkX3BhdGgiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY29udGludWUKICBmaQogIGlmIFsgLWUgIiRtYW5hZ2VkX3BhdGgiIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgUmVtb3Zpbmcgc3RhbGUgZmlsZSB0byBhbGxvdyBjaGVja291dDogJG1hbmFnZWRfcGF0aCIKICAgIHJtIC1yZiAiJG1hbmFnZWRfcGF0aCIKICBmaQpkb25lCgpCQVNFX0JSQU5DSD0iJHtQUl9CQVNFX0JSQU5DSDotbWFpbn0iClJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgoKaWYgISBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAjIEZhbGwgYmFjayB0byBvcmlnaW4vbWFzdGVyIG9yIHRoZSByZW1vdGUgSEVBRCBpZiBtYWluIGlzIGFic2VudAogIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciI7IHRoZW4KICAgIEJBU0VfQlJBTkNIPSJtYXN0ZXIiCiAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICBlbHNlCiAgICBERUZBVUxUX1JFTU9URT0kKGdpdCBzeW1ib2xpYy1yZWYgcmVmcy9yZW1vdGVzL29yaWdpbi9IRUFEIDI+L2Rldi9udWxsIHwgc2VkICdzQF5yZWZzL3JlbW90ZXMvb3JpZ2luL0BAJykKICAgIGlmIFsgLW4gIiRERUZBVUxUX1JFTU9URSIgXTsgdGhlbgogICAgICBCQVNFX0JSQU5DSD0iJERFRkFVTFRfUkVNT1RFIgogICAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICAgIGVsc2UKICAgICAgUkVNT1RFX0JBU0U9IiIKICAgIGZpCiAgZmkKZmkKCmlmIFsgLW4gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogIGdpdCBmZXRjaCBvcmlnaW4gIiRCQVNFX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKZmkKCkZFQVRVUkVfQlJBTkNIPSJmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24iCmlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL2hlYWRzLyRGRUFUVVJFX0JSQU5DSCI7IHRoZW4KICBlY2hvICJGZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBleGlzdHMsIGNoZWNraW5nIG91dC4uLiIKICAjIFN0YXNoIGFueSBsb2NhbCBjaGFuZ2VzIGZyb20gcHJldmlvdXMgcnVucyB0byBhdm9pZCBjaGVja291dCBjb25mbGljdHMKICBpZiAhIGdpdCBkaWZmLWluZGV4IC0tcXVpZXQgSEVBRCAtLSB8fCBbIC1uICIkKGdpdCBscy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGUtc3RhbmRhcmQpIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIFN0YXNoaW5nIGxvY2FsIGNoYW5nZXMgYW5kIHVudHJhY2tlZCBmaWxlcyBiZWZvcmUgY2hlY2tvdXQiCiAgICBnaXQgc3Rhc2ggcHVzaCAtLWluY2x1ZGUtdW50cmFja2VkIC1tICJBdXRvLXN0YXNoIGJlZm9yZSBjaGVja291dCAoJChkYXRlIC11ICslWSVtJWQtJUglTSVTKSkiIHx8IHRydWUKICBmaQogIGdpdCBjaGVja291dCAiJEZFQVRVUkVfQlJBTkNIIgogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXTsgdGhlbgogICAgZWNobyAi8J+TpSBGYXN0LWZvcndhcmRpbmcgJEZFQVRVUkVfQlJBTkNIIHdpdGggJFJFTU9URV9CQVNFIgogICAgaWYgISBnaXQgbWVyZ2UgIiRSRU1PVEVfQkFTRSIgLS1mZi1vbmx5ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGZhc3QtZm9yd2FyZCAkRkVBVFVSRV9CUkFOQ0g7IGNyZWF0aW5nIGZyZXNoIGJyYW5jaCBmcm9tICRSRU1PVEVfQkFTRSIKICAgICAgTkVXX0JSQU5DSD0iJHtGRUFUVVJFX0JSQU5DSH0tJChkYXRlIC11ICslWSVtJWQlSCVNJVMpIgogICAgICBnaXQgY2hlY2tvdXQgLUIgIiRORVdfQlJBTkNIIiAiJFJFTU9URV9CQVNFIgogICAgICBGRUFUVVJFX0JSQU5DSD0iJE5FV19CUkFOQ0giCiAgICBmaQogIGZpCmVsc2UKICBlY2hvICJDcmVhdGluZyBuZXcgZmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCciCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdICYmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvJFJFTU9URV9CQVNFIjsgdGhlbgogICAgZ2l0IGNoZWNrb3V0IC1iICIkRkVBVFVSRV9CUkFOQ0giICIkUkVNT1RFX0JBU0UiCiAgZWxzZQogICAgZ2l0IGNoZWNrb3V0IC1iICIkRkVBVFVSRV9CUkFOQ0giCiAgZmkKZmkKCmdpdCBjb25maWcgLS1sb2NhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1sb2NhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKZ2l0IGNvbmZpZyAtLWxvY2FsIHB1c2guYXV0b1NldHVwUmVtb3RlIHRydWUKZXhwb3J0IElNUExFTUVOVEFUSU9OX0JSQU5DSD0iJEZFQVRVUkVfQlJBTkNIIgplY2hvICLinJMgVXNpbmcgZmVhdHVyZSBicmFuY2g6ICRGRUFUVVJFX0JSQU5DSCAoYmFzZTogJHtCQVNFX0JSQU5DSDotdW5rbm93bn0pIgoKIyBTZXQgd29ya2luZyBkaXJlY3Rvcnk6IHVzZSByZXBvIHJvb3QgaWYgd29ya2luZ19kaXJlY3RvcnkgaXMgIi4iIG9yIGVtcHR5CmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF0gfHwgWyAiJFdPUktfRElSIiA9ICJudWxsIiBdOyB0aGVuCiAgRkFDVE9SWV9XT1JLX0RJUj0iJFJFUE9fUk9PVCIKZWxzZQogIEZBQ1RPUllfV09SS19ESVI9IiRSRVBPX1JPT1QvJFdPUktfRElSIgogIG1rZGlyIC1wICIkRkFDVE9SWV9XT1JLX0RJUiIKZmkKCmNkICIkRkFDVE9SWV9XT1JLX0RJUiIKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0b3J5OiAkRkFDVE9SWV9XT1JLX0RJUiIKCmVjaG8gIvCfk6YgZ2l0IHN0YXR1cyIKcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKZ2l0IHN0YXR1cyAtLXNob3J0IHx8IHRydWUKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1hdGVyaWFsaXNlIHRhc2sgY29udGV4dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmVjaG8gIvCfp7EgU3luY2luZyB0YXNrIGFzc2V0cyIKbWtkaXIgLXAgIiRGQUNUT1JZX1dPUktfRElSL3Rhc2siCm1rZGlyIC1wICIkRkFDVE9SWV9XT1JLX0RJUi8uZmFjdG9yeSIKbWtkaXIgLXAgIiRIT01FLy5mYWN0b3J5IgpjcCAtUiAvdGFzay1maWxlcy90YXNrLyogIiRGQUNUT1JZX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCgpET0NTX1JFUE9fVVJMPSJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIKRE9DU19CUkFOQ0g9Int7ZG9jc19icmFuY2h9fSIKRE9DU19QUk9KRUNUX0RJUkVDVE9SWT0ie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iCgppZiBbIC1uICIkRE9DU19SRVBPX1VSTCIgXSAmJiBbICIkRE9DU19SRVBPX1VSTCIgIT0gIm51bGwiIF07IHRoZW4KICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogIGlmIFsgLXogIiRET0NTX0JSQU5DSCIgXSB8fCBbICIkRE9DU19CUkFOQ0giID0gIm51bGwiIF07IHRoZW4KICAgIERPQ1NfQlJBTkNIPSJtYWluIgogIGZpCgogIGVjaG8gIvCfk5ogU3luY2luZyBkb2NzIHJlcG9zaXRvcnk6ICRET0NTX1JFUE9fVVJMIChicmFuY2g6ICRET0NTX0JSQU5DSCkiCiAgRE9DU19DTE9ORV9ESVI9Ii90bXAvZG9jcy1yZXBvIgogIHJtIC1yZiAiJERPQ1NfQ0xPTkVfRElSIgoKICByZWFkIERPQ1NfT1dORVIgRE9DU19OQU1FIDw8PCIkKHBhcnNlX3JlcG8gIiRET0NTX1JFUE9fVVJMIikiCiAgRE9DU19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7RE9DU19PV05FUn0vJHtET0NTX05BTUV9LmdpdCIKCiAgaWYgZ2l0IGNsb25lIC0tcXVpZXQgLS1icmFuY2ggIiRET0NTX0JSQU5DSCIgLS1zaW5nbGUtYnJhbmNoICIkRE9DU19IVFRQX1VSTCIgIiRET0NTX0NMT05FX0RJUiI7IHRoZW4KICAgIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgY2xvbmVkIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gY2xvbmUgZG9jcyBicmFuY2ggJyRET0NTX0JSQU5DSCc7IGF0dGVtcHRpbmcgZGVmYXVsdCBicmFuY2giCiAgICBpZiBnaXQgY2xvbmUgLS1xdWlldCAiJERPQ1NfSFRUUF9VUkwiICIkRE9DU19DTE9ORV9ESVIiOyB0aGVuCiAgICAgIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgY2xvbmVkIHVzaW5nIGRlZmF1bHQgYnJhbmNoIgogICAgZWxzZQogICAgICBlY2hvICLinYwgVW5hYmxlIHRvIGNsb25lIGRvY3MgcmVwb3NpdG9yeTogJERPQ1NfSFRUUF9VUkwiCiAgICAgIERPQ1NfQ0xPTkVfRElSPSIiCiAgICBmaQogIGZpCgogIGlmIFsgLW4gIiRET0NTX0NMT05FX0RJUiIgXTsgdGhlbgogICAgRE9DU19CQVNFX1BBVEg9IiRET0NTX0NMT05FX0RJUi8udGFza21hc3RlciIKICAgIGlmIFsgLW4gIiRET0NTX1BST0pFQ1RfRElSRUNUT1JZIiBdICYmIFsgIiRET0NTX1BST0pFQ1RfRElSRUNUT1JZIiAhPSAibnVsbCIgXTsgdGhlbgogICAgICBET0NTX0JBU0VfUEFUSD0iJERPQ1NfQ0xPTkVfRElSLyRET0NTX1BST0pFQ1RfRElSRUNUT1JZLy50YXNrbWFzdGVyIgogICAgZmkKCiAgICBlY2hvICLwn5SNIERvY3MgYmFzZSBwYXRoOiAkRE9DU19CQVNFX1BBVEgiCiAgICBUQVNLX0RJUj0iJERPQ1NfQkFTRV9QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKCiAgICBpZiBbIC1kICIkVEFTS19ESVIiIF07IHRoZW4KICAgICAgZWNobyAi4pyTIENvcHlpbmcgdGFzayBkZWZpbml0aW9uIGZyb20gJFRBU0tfRElSIgogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogICAgICBjcCAtUiAiJFRBU0tfRElSIi8uICIkRkFDVE9SWV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxzZQogICAgICBlY2hvICLinYwgQ1JJVElDQUw6IFRhc2sgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAkVEFTS19ESVIiCiAgICBmaQoKICAgIGlmIFsgLWYgIiRET0NTX0JBU0VfUEFUSC90YXNrcy5qc29uIiBdOyB0aGVuCiAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgICAgIGNwICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgIiRGQUNUT1JZX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGZpCmVsc2UKICBlY2hvICLimqDvuI8gRG9jcyByZXBvc2l0b3J5IFVSTCBub3QgcHJvdmlkZWQ7IHNraXBwaW5nIHRhc2sgZG9jcyBzeW5jIgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9BR0VOVFMubWQgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL0FHRU5UUy5tZCAiJEZBQ1RPUllfV09SS19ESVIvQUdFTlRTLm1kIgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRGQUNUT1JZX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRGQUNUT1JZX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGdpdGh1Yi1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiJEZBQ1RPUllfV09SS19ESVIvIgogIGVjaG8gIuKckyBDb3BpZWQgY2xpZW50LWNvbmZpZy5qc29uIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9tY3AuanNvbiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRGQUNUT1JZX1dPUktfRElSLy5tY3AuanNvbiIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvZmFjdG9yeS1jbGkuanNvbiBdOyB0aGVuCiAgbWtkaXIgLXAgIiRGQUNUT1JZX1dPUktfRElSLy5mYWN0b3J5IgogIGNwIC90YXNrLWZpbGVzL2ZhY3RvcnktY2xpLmpzb24gIiRGQUNUT1JZX1dPUktfRElSLy5mYWN0b3J5L2NsaS5qc29uIgogIGVjaG8gIuKckyBJbnN0YWxsZWQgcHJvamVjdC1sZXZlbCBmYWN0b3J5IENMSSBwZXJtaXNzaW9ucyIKZWxzZQogIGVjaG8gIuKaoO+4jyBmYWN0b3J5LWNsaS5qc29uIG5vdCBwcm92aWRlZDsgdXNpbmcgZGVmYXVsdCBwcm9qZWN0IHBlcm1pc3Npb25zIgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9mYWN0b3J5LWNsaS1jb25maWcuanNvbiBdOyB0aGVuCiAgbWtkaXIgLXAgIiRIT01FLy5mYWN0b3J5IgogIGNwIC90YXNrLWZpbGVzL2ZhY3RvcnktY2xpLWNvbmZpZy5qc29uICIkSE9NRS8uZmFjdG9yeS9jbGktY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIEluc3RhbGxlZCBnbG9iYWwgZmFjdG9yeSBDTEkgY29uZmlnIgplbHNlCiAgZWNobyAi4pqg77iPIGZhY3RvcnktY2xpLWNvbmZpZy5qc29uIG5vdCBwcm92aWRlZDsgdXNpbmcgZXhpc3RpbmcgZ2xvYmFsIEZhY3RvcnkgY29uZmlnIgpmaQoKaWYgWyAhIC1mICIkRkFDVE9SWV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICBlY2hvICLinYwgY2xpZW50LWNvbmZpZy5qc29uIG1pc3NpbmcgZnJvbSB3b3Jrc3BhY2U7IHJlcXVpcmVkIGZvciBNQ1AvdG9vbG1hbiIKICBleGl0IDEKZmkKCmNwICIkRkFDVE9SWV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iICIvd29ya3NwYWNlL2NsaWVudC1jb25maWcuanNvbiIgMj4vZGV2L251bGwgfHwgdHJ1ZQoKZWNobyAiPT09IE1DUCBQUkVDSEVDS1MgPT09IgppZiAhIGNvbW1hbmQgLXYgdG9vbG1hbiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLinYwgJ3Rvb2xtYW4nIENMSSBub3QgZm91bmQgaW4gUEFUSDsgcmVxdWlyZWQgZm9yIE1DUCIKICBleGl0IDEKZmkKClRPT0xNQU5fVVJMPSR7VE9PTE1BTl9TRVJWRVJfVVJMOi0iaHR0cDovL3Rvb2xtYW4uYWdlbnQtcGxhdGZvcm0uc3ZjLmNsdXN0ZXIubG9jYWw6MzAwMC9tY3AifQpUT09MTUFOX1VSTD0iJHtUT09MTUFOX1VSTCUvfSIKZWNobyAi8J+UjSBDaGVja2luZyBUb29sbWFuIGVuZHBvaW50OiAkVE9PTE1BTl9VUkwiCmlmICEgY3VybCAtc1NmIC0tY29ubmVjdC10aW1lb3V0IDIgLS1tYXgtdGltZSA2IFwKICAtWCBQT1NUICIkVE9PTE1BTl9VUkwiIFwKICAtSCAnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uJyBcCiAgLWQgJ3sianNvbnJwYyI6IjIuMCIsImlkIjoiaGVhbHRoIiwibWV0aG9kIjoidG9vbHMvbGlzdCIsInBhcmFtcyI6e319JyA+L3RtcC90b29sbWFuLXBpbmcubG9nIDI+JjE7IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIHJlYWNoIFRvb2xtYW4gc2VydmVyIGF0ICRUT09MTUFOX1VSTCIKICBjYXQgL3RtcC90b29sbWFuLXBpbmcubG9nID4mMiB8fCB0cnVlCiAgcm0gLWYgL3RtcC90b29sbWFuLXBpbmcubG9nCiAgZXhpdCAxCmZpCnJtIC1mIC90bXAvdG9vbG1hbi1waW5nLmxvZwplY2hvICLinJMgVG9vbG1hbiBlbmRwb2ludCByZWFjaGFibGUiCgppZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogIGVjaG8gIltjbGllbnQtY29uZmlnXSBzdW1tYXJ5OiIKICBpZiAhIGpxIC1yICcicmVtb3RlVG9vbHM9IiArICgoLnJlbW90ZVRvb2xzIC8vIFtdKSB8IGxlbmd0aCB8IHRvc3RyaW5nKSArICIsIGxvY2FsU2VydmVycz0iICsgKCgubG9jYWxTZXJ2ZXJzIC8vIHt9IHwga2V5cykgfCBqb2luKCIsIikpJyAiJEZBQ1RPUllfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgZWNobyAiICAobm90IHZhbGlkIEpTT04pIgogIGZpCmVsc2UKICBlY2hvICLimqDvuI8ganEgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgY2xpZW50LWNvbmZpZyBzdW1tYXJ5IgpmaQoKaWYgWyAteiAiJHtGQUNUT1JZX0FQSV9LRVk6LX0iIF07IHRoZW4KICBlY2hvICLinYwgRkFDVE9SWV9BUElfS0VZIGlzIG5vdCBzZXQ7IEZhY3RvcnkgY2Fubm90IGF1dGhlbnRpY2F0ZSIKICBleGl0IDEKZmkKCmVjaG8gIvCflJEgVXNpbmcgcHJvdmlkZWQgRkFDVE9SWV9BUElfS0VZIGZvciBhdXRoZW50aWNhdGlvbiIKCmlmIFsgISAtZiAiJEZBQ1RPUllfV09SS19ESVIvQUdFTlRTLm1kIiBdOyB0aGVuCiAgZWNobyAi4pqg77iPIEFHRU5UUy5tZCBtaXNzaW5nOyBjcmVhdGluZyBwbGFjZWhvbGRlciIKICBjYXQgPDwnUExBQ0VIT0xERVInID4gIiRGQUNUT1JZX1dPUktfRElSL0FHRU5UUy5tZCIKIyBQcm9qZWN0IEd1aWRhbmNlCgpUaGlzIEZhY3RvcnkgcnVuIHdhcyB0cmlnZ2VyZWQgd2l0aG91dCBBR0VOVFMubWQgY29udGVudC4gUHJvdmlkZSBwcm9qZWN0IGNvbnRleHQgaW4gQUdFTlRTLm1kIHRvIGdpdmUgRmFjdG9yeSByaWNoZXIgaW5zdHJ1Y3Rpb25zLgpQTEFDRUhPTERFUgpmaQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvbXB0IGFzc2VtYmx5IGFuZCBGYWN0b3J5IGV4ZWN1dGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClBST01QVF9QUkVGSVg9IiIKaWYgWyAtZiAiJEZBQ1RPUllfV09SS19ESVIvdGFzay90b29sbWFuLWd1aWRlLm1kIiBdOyB0aGVuCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCflKcgKipDUklUSUNBTDogVG9vbCBVc2FnZSBSZWZlcmVuY2UqKlxuXG4kKGNhdCAiJEZBQ1RPUllfV09SS19ESVIvdGFzay90b29sbWFuLWd1aWRlLm1kIilcblxuLS0tXG5cbiIKZmkKClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH3imqDvuI8gKipFWEVDVVRJT04gUkVRVUlSRU1FTlRTIChNQU5EQVRPUlkpKipcblxuLSAqKkZvbGxvdyBwYXR0ZXJucyoqOiByZWZlcmVuY2UgQGNvZGluZy1ndWlkZWxpbmVzLm1kIGFuZCBAZ2l0aHViLWd1aWRlbGluZXMubWQgaW4gdGhpcyB3b3Jrc3BhY2UuXG4tICoqTm8gbW9ja3Mgb3Igc3R1YnMqKjogaW50ZWdyYXRlIHdpdGggbGl2ZSBzZXJ2aWNlcywgQVBJcywgYW5kIGNvbmZpZ3VyYXRpb247IHJlbW92ZSBhbGwgcGxhY2Vob2xkZXJzLlxuLSAqKlBhcmFtZXRlcml6ZSBldmVyeXRoaW5nKio6IGV2ZXJ5IGVuZHBvaW50LCB0aHJlc2hvbGQsIG9yIHRyYWRpbmcgcGFpciBtdXN0IGNvbWUgZnJvbSBlbnYgdmFycywgY29uZmlnLCBvciBDTEkgZmxhZ3MuXG4tICoqR2l0SHViIGF1dGggcmVhZHkqKjogdGhlIEdpdEh1YiBBcHAgdG9rZW4gKFxgR0hfVE9LRU5cYCkgaXMgYWxyZWFkeSBjb25maWd1cmVkOyBza2lwIG1hbnVhbCBcYGdoIGF1dGggbG9naW5cYCBmbG93cyBhbmQgYXZvaWQgaGl0dGluZyB1c2VyLW9ubHkgZW5kcG9pbnRzIGxpa2UgXGAvdXNlclxgLlxuLSAqKkZlYXR1cmUgYnJhbmNoIG9ubHkqKjogc3RheSBvbiBcYGZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvblxgOyBuZXZlciBwdXNoIGRpcmVjdGx5IHRvIG1haW4vbWFzdGVyIG9yIHJldGFyZ2V0IHRoZSBicmFuY2ggdXBzdHJlYW0uXG4tICoqRXhlY3V0ZSB3aXRob3V0IHBhdXNlKio6IGlmIHlvdSBvdXRsaW5lIGEgcGxhbiwgaW1tZWRpYXRlbHkgY2FycnkgaXQgb3V04oCUZG8gbm90IHdhaXQgZm9yIGNvbmZpcm1hdGlvbiBvciBhZGRpdGlvbmFsIGlucHV0LlxuLSAqKlF1YWxpdHkgZ2F0ZXMqKjogcnVuIFxgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tcYCwgXGBjYXJnbyBjbGlwcHkgLS13b3Jrc3BhY2UgLS1hbGwtdGFyZ2V0cyAtLWFsbC1mZWF0dXJlcyAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljXGAsIGFuZCBcYGNhcmdvIHRlc3QgLS13b3Jrc3BhY2UgLS1hbGwtZmVhdHVyZXNcYCBiZWZvcmUgZGVjbGFyaW5nIHN1Y2Nlc3MuXG4tICoqRG9jdW1lbnRhdGlvbiAmIFBSKio6IHVwZGF0ZSBwcm9qZWN0IGRvY3MgYW5kIG9wZW4gYSBQUiB2aWEgXGBnaCBwciBjcmVhdGVcYCB3aXRoIGxhYmVscyB0YXNrLXt7dGFza19pZH19LCBzZXJ2aWNlLXt7c2VydmljZX19LCBhbmQgcnVuLXt7d29ya2Zsb3dfbmFtZX19LlxuLSAqKlByZXNlcnZlIHdvcmtzcGFjZSoqOiBuZXZlciBkZWxldGUgdGhlIHJlcG9zaXRvcnkgb3IgcnVuIGRlc3RydWN0aXZlIGNsZWFudXAgY29tbWFuZHMgKGZvciBleGFtcGxlIFxgcm0gLXJmXGApOyBsZWF2ZSBhcnRpZmFjdHMgaW4gcGxhY2UgZm9yIFFBLlxuXG4tLS1cblxuIgoKaWYgWyAtZiAiJEZBQ1RPUllfV09SS19ESVIvZ2l0aHViLWd1aWRlbGluZXMubWQiIF0gfHwgWyAtZiAiJEZBQ1RPUllfV09SS19ESVIvY29kaW5nLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh98J+TmiAqKlJlZmVyZW5jZSBNYXRlcmlhbHMgQXZhaWxhYmxlKipcbiIKICBpZiBbIC1mICIkRkFDVE9SWV9XT1JLX0RJUi9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQGdpdGh1Yi1ndWlkZWxpbmVzLm1kXG4iCiAgZmkKICBpZiBbIC1mICIkRkFDVE9SWV9XT1JLX0RJUi9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQGNvZGluZy1ndWlkZWxpbmVzLm1kXG4iCiAgZmkKICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9XG4tLS1cblxuIgpmaQoKaWYgWyAtZiAiJEZBQ1RPUllfV09SS19ESVIvQUdFTlRTLm1kIiBdOyB0aGVuCiAgaWYgQUdFTlRfR1VJREFOQ0U9JChqcSAtUnMgQGpzb24gIiRGQUNUT1JZX1dPUktfRElSL0FHRU5UUy5tZCIgMj4vZGV2L251bGwpOyB0aGVuCiAgICBpZiBbICIkeyNBR0VOVF9HVUlEQU5DRX0iIC1ndCAyIF07IHRoZW4KICAgICAgQUdFTlRfR1VJREFOQ0U9JHtBR0VOVF9HVUlEQU5DRToxOi0xfQogICAgICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh98J+noCAqKkFnZW50IEd1aWRhbmNlKipcblxuJHtBR0VOVF9HVUlEQU5DRX1cblxuLS0tXG5cbiIKICAgIGZpCiAgZmkKZmkKCmVjaG8gIvCflI0gREVCVUc6IEFib3V0IHRvIGNoZWNrIGZvciBwcm9tcHQubWQgYXQ6ICRGQUNUT1JZX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiB0YXNrIGRpcmVjdG9yeToiCmxzIC1sYSAiJEZBQ1RPUllfV09SS19ESVIvdGFzay8iIHx8IGVjaG8gIlRhc2sgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBlbXB0eSIKZWNobyAi8J+UjSBERUJVRzogQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBjb250ZW50czoiCmxzIC1sYSAiJEZBQ1RPUllfV09SS19ESVIvIiB8fCBlY2hvICJXb3JraW5nIGRpcmVjdG9yeSBub3QgYWNjZXNzaWJsZSIKClBST01QVF9GSUxFPSIkRkFDVE9SWV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKaWYgWyAhIC1mICIkUFJPTVBUX0ZJTEUiIF07IHRoZW4KICBlY2hvICLinYwgcHJvbXB0Lm1kIG5vdCBmb3VuZCBhdCAkUFJPTVBUX0ZJTEUiCiAgZXhpdCAxCmZpCgplY2hvICJzdGFydGluZ1Rhc2s6e3t0YXNrX2lkfX0iCmVjaG8gIiIKClBST01QVF9DT05URU5UPSIke1BST01QVF9QUkVGSVh9JChjYXQgIiRQUk9NUFRfRklMRSIpIgoKZWNobyAi8J+nviBSZXNvbHZlZCBwcm9tcHQgY29udGVudCAodHJ1bmNhdGVkIHRvIDIwMDAgY2hhcnMgZm9yIGxvZyBzYWZldHkpOiIKUFJPTVBUX1BSRVZJRVc9JChwcmludGYgJyVzJyAiJFBST01QVF9DT05URU5UIiB8IGhlYWQgLWMgMjAwMCkKcHJpbnRmICclc1xuJyAiJFBST01QVF9QUkVWSUVXIgpQUk9NUFRfQllURVM9JChwcmludGYgJyVzJyAiJFBST01QVF9DT05URU5UIiB8IHdjIC1jIHwgdHIgLWQgJ1s6c3BhY2U6XScpCmVjaG8gIvCfk48gUHJvbXB0IHNpemU6ICRQUk9NUFRfQllURVMgYnl0ZXMiCgpNQVhfUkVUUklFUz0ke0ZBQ1RPUllfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi0xMH19CkFUVEVNUFQ9MQpTVUNDRVNTPTAKRkFDVE9SWV9FWElUPTEKTEFTVF9NRVNTQUdFX0ZJTEU9IiIKUlVOX0xPRz0iIgpMQVNUX0NPTVBMRVRJT05fUkVBU09OPSIiCgppZiBbICIkTUFYX1JFVFJJRVMiID0gIjAiIF07IHRoZW4KICBlY2hvICLwn5SEIFVubGltaXRlZCByZXRyaWVzIGVuYWJsZWQgLSBGYWN0b3J5IHdpbGwgY29udGludWUgdW50aWwgY29tcGxldGlvbiBjcml0ZXJpYSBhcmUgbWV0IgogIFVOTElNSVRFRF9SRVRSSUVTPTEKZWxzZQogIFVOTElNSVRFRF9SRVRSSUVTPTAKZmkKCiMgQ2lyY3VpdCBicmVha2VyOiB0cmFjayByZXBlYXRlZCBjb21tYW5kIGZhaWx1cmVzCmRlY2xhcmUgLUEgRkFJTEVEX0NPTU1BTkRTCk1BWF9TQU1FX0NPTU1BTkRfRkFJTFVSRVM9MwoKRk9SQ0VfV1JJVEVTPSJ7eyNpZiBmb3JjZV93cml0ZXN9fXRydWV7e2Vsc2V9fWZhbHNle3svaWZ9fSIKT1VUUFVUX0ZPUk1BVD0ie3sjaWYgb3V0cHV0X2Zvcm1hdH19e3tvdXRwdXRfZm9ybWF0fX17e2Vsc2V9fXRleHR7ey9pZn19IgpPVVRQVVRfRk9STUFUPSIke09VVFBVVF9GT1JNQVQsLH0iCgpBVVRPX0xFVkVMPSJ7eyNpZiBhdXRvX2xldmVsfX17e2F1dG9fbGV2ZWx9fXt7ZWxzZX19aGlnaHt7L2lmfX0iCkFVVE9fTEVWRUw9IiR7QVVUT19MRVZFTCwsfSIKaWYgWyAiJHtGT1JDRV9XUklURVMsLH0iID0gInRydWUiIF07IHRoZW4KICBBVVRPX0xFVkVMPSJoaWdoIgpmaQoKU0tJUF9QRVJNSVNTSU9OU19VTlNBRkU9Int7I2lmIHNraXBfcGVybWlzc2lvbnNfdW5zYWZlfX17e3NraXBfcGVybWlzc2lvbnNfdW5zYWZlfX17e2Vsc2V9fXRydWV7ey9pZn19IgpTS0lQX1BFUk1JU1NJT05TX1VOU0FGRT0iJHtTS0lQX1BFUk1JU1NJT05TX1VOU0FGRSwsfSIKCndoaWxlIFsgIiRVTkxJTUlURURfUkVUUklFUyIgPSAiMSIgXSB8fCBbICRBVFRFTVBUIC1sZSAkTUFYX1JFVFJJRVMgXTsgZG8KICBpZiBbICIkVU5MSU1JVEVEX1JFVFJJRVMiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIvCfmoAgRmFjdG9yeSBleGVjdXRpb24gYXR0ZW1wdCAkQVRURU1QVCAodW5saW1pdGVkIG1vZGUpIgogIGVsc2UKICAgIGVjaG8gIvCfmoAgRmFjdG9yeSBleGVjdXRpb24gYXR0ZW1wdCAkQVRURU1QVC8kTUFYX1JFVFJJRVMiCiAgZmkKICBMQVNUX01FU1NBR0VfRklMRT0iL3RtcC9mYWN0b3J5LWxhc3QtbWVzc2FnZS0ke0FUVEVNUFR9LnR4dCIKICBSVU5fTE9HX0VYVD0ibG9nIgogIGlmIFsgIiRPVVRQVVRfRk9STUFUIiA9ICJqc29uIiBdIHx8IFsgIiRPVVRQVVRfRk9STUFUIiA9ICJkZWJ1ZyIgXTsgdGhlbgogICAgUlVOX0xPR19FWFQ9Impzb25sIgogIGZpCiAgUlVOX0xPRz0iL3RtcC9mYWN0b3J5LXJ1bi0ke0FUVEVNUFR9LiR7UlVOX0xPR19FWFR9IgoKICBpZiBbICIkU0tJUF9QRVJNSVNTSU9OU19VTlNBRkUiID0gInRydWUiIF07IHRoZW4KICAgIEZBQ1RPUllfQ01EPSgiZHJvaWQiICJleGVjIiAiLS1za2lwLXBlcm1pc3Npb25zLXVuc2FmZSIgIi0tb3V0cHV0LWZvcm1hdCIgIiRPVVRQVVRfRk9STUFUIikKICBlbHNlCiAgICBGQUNUT1JZX0NNRD0oImRyb2lkIiAiZXhlYyIgIi0tb3V0cHV0LWZvcm1hdCIgIiRPVVRQVVRfRk9STUFUIiAiLS1hdXRvIiAiJEFVVE9fTEVWRUwiKQogIGZpCiAge3sjaWYgbW9kZWx9fQogIEZBQ1RPUllfQ01EKz0oIi0tbW9kZWwiICJ7e21vZGVsfX0iKQogIHt7L2lmfX0KICBGQUNUT1JZX0NNRCs9KCIkUFJPTVBUX0NPTlRFTlQiKQoKICBlY2hvICLwn5SnIGRyb2lkIGV4ZWMgaW52b2NhdGlvbiBhcmd1bWVudHMgKCR7I0ZBQ1RPUllfQ01EW0BdfSBlbnRyaWVzKToiCiAgZm9yIGlkeCBpbiAiJHshRkFDVE9SWV9DTURbQF19IjsgZG8KICAgIHByaW50ZiAnICAgIFslZF0gJXNcbicgIiRpZHgiICIke0ZBQ1RPUllfQ01EWyRpZHhdfSIKICBkb25lCgogIHNldCArZQogIHNldCAtbyBwaXBlZmFpbAogICIke0ZBQ1RPUllfQ01EW0BdfSIgfCB0ZWUgIiRSVU5fTE9HIgogIEZBQ1RPUllfRVhJVD0ke1BJUEVTVEFUVVNbMF19CiAgc2V0ICtvIHBpcGVmYWlsCiAgc2V0IC1lCgogIGVjaG8gIltmYWN0b3J5LWRlYnVnXSBBdHRlbXB0ICRBVFRFTVBUIGZpbmlzaGVkIHdpdGggZXhpdCBjb2RlICRGQUNUT1JZX0VYSVQiCgogIGlmIFsgJEZBQ1RPUllfRVhJVCAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gRmFjdG9yeSBleGl0ZWQgd2l0aCBzdGF0dXMgJEZBQ1RPUllfRVhJVCBvbiBhdHRlbXB0ICRBVFRFTVBUIgogIGZpCgogICMgQ2lyY3VpdCBicmVha2VyOiBkZXRlY3QgcmVwZWF0ZWQgZmFpbGluZyBjb21tYW5kcwogIGlmIFsgLWYgIiRSVU5fTE9HIiBdICYmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAjIFRyeSB0byBleHRyYWN0IGZhaWxlZCBiYXNoIGNvbW1hbmRzIGZyb20gSlNPTiBsb2cgKGlmIHVzaW5nIGpzb24gZm9ybWF0KQogICAgaWYgWyAiJE9VVFBVVF9GT1JNQVQiID0gImpzb24iIF0gfHwgWyAiJE9VVFBVVF9GT1JNQVQiID0gImRlYnVnIiBdOyB0aGVuCiAgICAgICMgRmFjdG9yeS9Ecm9pZCB1c2VzIEV4ZWN1dGUgdG9vbAogICAgICBGQUlMRURfQ01EPSQoanEgLXIgJ3NlbGVjdCgudHlwZT09InRvb2xfdXNlIiBhbmQgLnRvb2w9PSJFeGVjdXRlIiBhbmQgKC5yZXN1bHQuZXhpdF9jb2RlIC8vIDApICE9IDApIHwgLmlucHV0LmNvbW1hbmQnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSB8IGhlYWQgLWMgMTAwKQogICAgICAKICAgICAgaWYgWyAtbiAiJEZBSUxFRF9DTUQiIF07IHRoZW4KICAgICAgICAjIFRyYWNrIGhvdyBtYW55IHRpbWVzIHRoaXMgY29tbWFuZCBoYXMgZmFpbGVkCiAgICAgICAgRkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdPSQoKCR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdOi0wfSArIDEpKQogICAgICAgIEZBSUxfQ09VTlQ9JHtGQUlMRURfQ09NTUFORFNbIiRGQUlMRURfQ01EIl19CiAgICAgICAgCiAgICAgICAgaWYgWyAkRkFJTF9DT1VOVCAtZ2UgJE1BWF9TQU1FX0NPTU1BTkRfRkFJTFVSRVMgXTsgdGhlbgogICAgICAgICAgZWNobyAi8J+UtCBDSVJDVUlUIEJSRUFLRVIgVFJJR0dFUkVEOiBDb21tYW5kIGhhcyBmYWlsZWQgJEZBSUxfQ09VTlQgdGltZXMgaW4gYSByb3c6IgogICAgICAgICAgZWNobyAiICAgQ29tbWFuZDogJEZBSUxFRF9DTUQiCiAgICAgICAgICBlY2hvICIgICBUaGlzIGluZGljYXRlcyB0aGUgYWdlbnQgaXMgc3R1Y2sgaW4gYSBsb29wLiIKICAgICAgICAgIAogICAgICAgICAgIyBJbmplY3QgaW50ZXJ2ZW50aW9uIHByb21wdCBmb3IgbmV4dCBhdHRlbXB0CiAgICAgICAgICBQUk9NUFRfQ09OVEVOVD0iJHtQUk9NUFRfQ09OVEVOVH0KCuKaoO+4jyAqKkxPT1AgREVURUNURUQqKjogWW91IHRyaWVkIHRoaXMgY29tbWFuZCAkRkFJTF9DT1VOVCB0aW1lczoKXGBcYFxgYmFzaAokRkFJTEVEX0NNRApcYFxgXGAKCkl0IGtlZXBzIGZhaWxpbmcuICoqU1RPUCBSRVBFQVRJTkcgVEhJUyBDT01NQU5ELioqCgpUcnkgaW5zdGVhZDoKMS4gQ2hlY2sgd29ya2luZyBkaXJlY3Rvcnk6IFxgcHdkXGAKMi4gTGlzdCBmaWxlczogXGBscyAtbGFcYAozLiBVc2UgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBhcHByb2FjaAo0LiBDcmVhdGUgZmlsZXMvZGlyZWN0b3JpZXMgc3RlcC1ieS1zdGVwIgogICAgICAgICAgCiAgICAgICAgICAjIFJlc2V0IGNvdW50ZXIKICAgICAgICAgIEZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXT0wCiAgICAgICAgZmkKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgIyBFeHRyYWN0IHRva2VuIHVzYWdlIGZvciBjb3N0IHRyYWNraW5nIChKU09OIGZvcm1hdCBvbmx5KQogIGlmIFsgLWYgIiRSVU5fTE9HIiBdICYmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBpZiBbICIkT1VUUFVUX0ZPUk1BVCIgPSAianNvbiIgXSB8fCBbICIkT1VUUFVUX0ZPUk1BVCIgPSAiZGVidWciIF07IHRoZW4KICAgICAgVE9LRU5TX0lOPSQoanEgLXIgJ3NlbGVjdCgudXNhZ2UuaW5wdXRfdG9rZW5zICE9IG51bGwpIHwgLnVzYWdlLmlucHV0X3Rva2VucycgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xKQogICAgICBUT0tFTlNfT1VUPSQoanEgLXIgJ3NlbGVjdCgudXNhZ2Uub3V0cHV0X3Rva2VucyAhPSBudWxsKSB8IC51c2FnZS5vdXRwdXRfdG9rZW5zJyAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEpCiAgICAgIAogICAgICBpZiBbWyAiJFRPS0VOU19JTiIgPX4gXlswLTldKyQgXV0gJiYgW1sgIiRUT0tFTlNfT1VUIiA9fiBeWzAtOV0rJCBdXTsgdGhlbgogICAgICAgIFRPS0VOU19UT1RBTD0kKChUT0tFTlNfSU4gKyBUT0tFTlNfT1VUKSkKICAgICAgICBlY2hvICLwn5OKIEZhY3RvcnkgdG9rZW5zIHRoaXMgYXR0ZW1wdDogaW5wdXQ9JFRPS0VOU19JTiwgb3V0cHV0PSRUT0tFTlNfT1VULCB0b3RhbD0kVE9LRU5TX1RPVEFMIgogICAgICAgIAogICAgICAgICMgU3RvcmUgZm9yIG1ldHJpY3MgKGZ1dHVyZTogc2VuZCB0byBiYWNrZW5kKQogICAgICAgIGVjaG8gIntcImF0dGVtcHRcIjokQVRURU1QVCxcInRhc2tfaWRcIjpcInt7dGFza19pZH19XCIsXCJzZXJ2aWNlXCI6XCJ7e3NlcnZpY2V9fVwiLFwiY2xpXCI6XCJmYWN0b3J5XCIsXCJ0b2tlbnNfaW5cIjokVE9LRU5TX0lOLFwidG9rZW5zX291dFwiOiRUT0tFTlNfT1VULFwidG9rZW5zX3RvdGFsXCI6JFRPS0VOU19UT1RBTH0iID4+IC90bXAvZmFjdG9yeS1tZXRyaWNzLmpzb25sCiAgICAgIGZpCiAgICBmaQogIGZpCgogIGlmIFsgLXMgIiRSVU5fTE9HIiBdOyB0aGVuCiAgICBpZiBbICIkT1VUUFVUX0ZPUk1BVCIgPSAianNvbiIgXSB8fCBbICIkT1VUUFVUX0ZPUk1BVCIgPSAiZGVidWciIF07IHRoZW4KICAgICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBSRVNVTFRfVEVYVD0kKGpxIC1yICdzZWxlY3QoLnR5cGUgPT0gInJlc3VsdCIpIHwgLnJlc3VsdCAvLyBlbXB0eScgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xKQogICAgICBlbHNlCiAgICAgICAgUkVTVUxUX1RFWFQ9JCh0YWlsIC1uIDQwICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCBzZWQgJ3MvXHIkLy8nKQogICAgICBmaQogICAgZWxzZQogICAgICBSRVNVTFRfVEVYVD0kKHRhaWwgLW4gNDAgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHNlZCAncy9cciQvLycpCiAgICBmaQogICAgcHJpbnRmICclc1xuJyAiJFJFU1VMVF9URVhUIiA+ICIkTEFTVF9NRVNTQUdFX0ZJTEUiCiAgZWxzZQogICAgOiA+ICIkTEFTVF9NRVNTQUdFX0ZJTEUiCiAgZmkKCiAgaWYgW1sgInt7Z2l0aHViX2FwcH19IiA9fiBbUnJdZXggXV07IHRoZW4KICAgIENPTVBMRVRJT05fUFJPTVBUPSJUYXNrIHt7dGFza19pZH19IGNvbXBsZXRpb24gdmVyaWZpY2F0aW9uIOKAlCBSZXggSW1wbGVtZW50YXRpb24gQWdlbnQgKEZhY3RvcnkpCgoqKllvdXIgUm9sZSoqOiBZb3UgYXJlIFJleCwgdGhlIElNUExFTUVOVEFUSU9OIGFnZW50LiBDbGVvIHdpbGwgaGFuZGxlIGNvZGUgcXVhbGl0eSBpbiB0aGUgbmV4dCBzdGFnZS4KCioqRklSU1QqKjogUmV2aWV3IHRoZSBGVU5DVElPTkFMIHJlcXVpcmVtZW50cyBpbiB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQKCioqVGhlbiBhbnN3ZXIgJ3llcycgaWYgQUxMIG9mIHRoZXNlIGFyZSB0cnVlOioqCgoxLiAqKkZVTkNUSU9OQUwgYWNjZXB0YW5jZSBjcml0ZXJpYSBpbXBsZW1lbnRlZCoqIChmZWF0dXJlcyBleGlzdCBhbmQgYmFzaWNhbGx5IHdvcmspCjIuIENvZGUgQ09NUElMRVMgc3VjY2Vzc2Z1bGx5IChcYGNhcmdvIGJ1aWxkXGAgcGFzc2VzKQozLiBBbGwgY29kZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQgdG8gZ2l0CjQuIENoYW5nZXMgYXJlIHB1c2hlZCB0byByZW1vdGUgYnJhbmNoIGZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbgo1LiBBIHB1bGwgcmVxdWVzdCBleGlzdHMgKHdpdGggYXQgbGVhc3QgdGFzay17e3Rhc2tfaWR9fSBsYWJlbCkKCioqQ29kZSBxdWFsaXR5IGlzc3VlcyBhcmUgT0sgZm9yIFJleCAtIENsZW8gd2lsbCBmaXg6KioKLSDimqDvuI8gQ2xpcHB5IHdhcm5pbmdzPyBPSyAtIENsZW8gd2lsbCBmaXgKLSDimqDvuI8gRm9ybWF0dGluZyBpc3N1ZXM/IE9LIC0gQ2xlbyB3aWxsIGZpeAotIOKaoO+4jyBTb21lIHRlc3RzIGZhaWxpbmc/IE9LIGlmIGJhc2ljIGZ1bmN0aW9uYWxpdHkgd29ya3MgLSBDbGVvL1Rlc3Mgd2lsbCBmaXgKLSDimqDvuI8gVW51c2VkIGZ1bmN0aW9ucy92YXJpYWJsZXM/IE9LIC0gQ2xlbyB3aWxsIGNsZWFuIHVwCgoqKkZvY3VzIG9uKio6IERvZXMgdGhlIGltcGxlbWVudGF0aW9uIHdvcms/IEFyZSB0aGUgZmVhdHVyZXMgdGhlcmU/CgoqKlJlc3BvbnNlIGZvcm1hdDoqKgoKSWYgZnVuY3Rpb25hbGx5IGNvbXBsZXRlIChmZWF0dXJlcyB3b3JrLCBjb2RlIGNvbXBpbGVzLCBQUiBjcmVhdGVkKSwgcmVzcG9uZCB3aXRoOgp5ZXMKCklmIGZlYXR1cmVzIGluY29tcGxldGUgb3IgY29kZSBkb2Vzbid0IGNvbXBpbGUsIHJlc3BvbmQgd2l0aDoKbm8KUkVBU09OOiA8c3BlY2lmaWMgRlVOQ1RJT05BTCBpc3N1ZT4KCkV4YW1wbGUgJ3llcycgcmVzcG9uc2UgKGV2ZW4gd2l0aCB3YXJuaW5ncyk6CnllcwoKRXhhbXBsZSAnbm8nIHJlc3BvbnNlOgpubwpSRUFTT046IEFjY2VwdGFuY2UgY3JpdGVyaWEgMiBpbmNvbXBsZXRlIC0gaGVhbHRoIGVuZHBvaW50IG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEZlYXR1cmUgd29yayByZW1haW5zLgoKWW91ciByZXNwb25zZToiCiAgZWxzZQogICAgQ09NUExFVElPTl9QUk9NUFQ9IlRhc2sge3t0YXNrX2lkfX0gY29tcGxldGlvbiB2ZXJpZmljYXRpb24uCgoqKkZJUlNUKio6IFJldmlldyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYSBpbiB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQKCioqVGhlbiBhbnN3ZXIgJ3llcycgT05MWSBpZiBBTEwgb2YgdGhlc2UgYXJlIHRydWU6KioKCjEuICoqRVZFUlkgYWNjZXB0YW5jZSBjcml0ZXJpb24gaXMgZnVsbHkgaW1wbGVtZW50ZWQqKiAobm90IGp1c3Qgc3RhcnRlZCwgYnV0IERPTkUpCjIuIEFsbCBjb2RlIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCB0byBnaXQKMy4gQ2hhbmdlcyBhcmUgcHVzaGVkIHRvIHJlbW90ZSBicmFuY2ggZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uCjQuIEEgcHVsbCByZXF1ZXN0IGV4aXN0cyAod2l0aCBhdCBsZWFzdCB0YXNrLXt7dGFza19pZH19IGxhYmVsOyBvdGhlciBsYWJlbHMgYXJlIG9wdGlvbmFsKQo1LiBRdWFsaXR5IGdhdGVzIHBhc3NlZCAoY2FyZ28gZm10LCBjYXJnbyBjbGlwcHkgd2l0aCBubyB3YXJuaW5ncywgdGVzdHMgcGFzcykKCioqQmUgaG9uZXN0Kio6IElmIEFOWSBhY2NlcHRhbmNlIGNyaXRlcmlvbiBpcyBpbmNvbXBsZXRlIG9yIHBhcnRpYWxseSBpbXBsZW1lbnRlZCwgYW5zd2VyICdubycgYW5kIGNvbnRpbnVlIHdvcmtpbmcuCgoqKlRvIHZlcmlmeToqKgotIFJldmlldzogXGBjYXQgdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kXGAKLSBHaXQgc3RhdHVzOiBcYGdpdCBzdGF0dXNcYAotIENvbW1pdHMgcHVzaGVkOiBcYGdpdCBsb2cgb3JpZ2luL21haW4uLkhFQURcYAotIFBSIGV4aXN0czogXGBnaCBwciB2aWV3XGAKLSBUZXN0cyBwYXNzOiBDaGVjayB5b3VyIHRlc3QgcmVzdWx0cwoKKipSZXNwb25zZSBmb3JtYXQ6KioKCklmIGNvbXBsZXRlLCByZXNwb25kIHdpdGg6CnllcwoKSWYgaW5jb21wbGV0ZSwgcmVzcG9uZCB3aXRoOgpubwpSRUFTT046IDxzcGVjaWZpYyByZWFzb24gd2h5IG5vdCBjb21wbGV0ZT4KCkZvciAnbm8nIHJlc3BvbnNlcywgUkVBU09OIG11c3Qgc3BlY2lmeToKLSBXaGljaCBhY2NlcHRhbmNlIGNyaXRlcmlhIGFyZSBpbmNvbXBsZXRlIChsaXN0IHRoZW0gYnkgbnVtYmVyL25hbWUpCi0gV2hhdCBzcGVjaWZpYyB3b3JrIHJlbWFpbnMgKGJlIGNvbmNyZXRlKQotIEFueSBibG9ja2VycyBvciBpc3N1ZXMgZW5jb3VudGVyZWQKCkV4YW1wbGUgJ25vJyByZXNwb25zZToKbm8KUkVBU09OOiBBY2NlcHRhbmNlIGNyaXRlcmlhIDIgYW5kIDQgaW5jb21wbGV0ZS4gQVBJIGVuZHBvaW50IC91c2VycyBjcmVhdGVkIGJ1dCBub3QgeWV0IGNvbm5lY3RlZCB0byBkYXRhYmFzZS4gUFIgY3JlYXRlZCBidXQgdGVzdHMgZmFpbGluZyBkdWUgdG8gbWlzc2luZyBlcnJvciBoYW5kbGluZyBpbiB1c2VyX2NvbnRyb2xsZXIucnMuCgpZb3VyIHJlc3BvbnNlOiIKICBmaQoKICBDT01QTEVUSU9OX0xBU1RfTUVTU0FHRT0iL3RtcC9mYWN0b3J5LWNvbXBsZXRpb24tJHtBVFRFTVBUfS50eHQiCiAgQ09NUExFVElPTl9MT0c9Ii90bXAvZmFjdG9yeS1jb21wbGV0aW9uLSR7QVRURU1QVH0ubG9nIgoKICBpZiBbICIkU0tJUF9QRVJNSVNTSU9OU19VTlNBRkUiID0gInRydWUiIF07IHRoZW4KICAgIENPTVBMRVRJT05fQ01EPSgiZHJvaWQiICJleGVjIiAiLS1za2lwLXBlcm1pc3Npb25zLXVuc2FmZSIgIi0tb3V0cHV0LWZvcm1hdCIgInRleHQiKQogIGVsc2UKICAgIENPTVBMRVRJT05fQ01EPSgiZHJvaWQiICJleGVjIiAiLS1vdXRwdXQtZm9ybWF0IiAidGV4dCIgIi0tYXV0byIgIiRBVVRPX0xFVkVMIikKICBmaQogIHt7I2lmIG1vZGVsfX0KICBDT01QTEVUSU9OX0NNRCs9KCItLW1vZGVsIiAie3ttb2RlbH19IikKICB7ey9pZn19CiAgQ09NUExFVElPTl9DTUQrPSgiJENPTVBMRVRJT05fUFJPTVBUIikKCiAgc2V0ICtlCiAgc2V0IC1vIHBpcGVmYWlsCiAgQ09NUExFVElPTl9PVVRQVVQ9JCgiJHtDT01QTEVUSU9OX0NNRFtAXX0iIDI+JjEgfCB0ZWUgIiRDT01QTEVUSU9OX0xPRyIpCiAgQ09NUExFVElPTl9FWElUPSR7UElQRVNUQVRVU1swXX0KICBzZXQgK28gcGlwZWZhaWwKICBzZXQgLWUKCiAgcHJpbnRmICclc1xuJyAiJENPTVBMRVRJT05fT1VUUFVUIiA+ICIkQ09NUExFVElPTl9MQVNUX01FU1NBR0UiCiAgZWNobyAi8J+nrSBDb21wbGV0aW9uIHByb2JlIHJlc3BvbnNlOiIKICBwcmludGYgJyVzXG4nICIkQ09NUExFVElPTl9PVVRQVVQiCgogIGlmIFsgJENPTVBMRVRJT05fRVhJVCAtbmUgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQ29tcGxldGlvbiBwcm9iZSBleGl0ZWQgd2l0aCBzdGF0dXMgJENPTVBMRVRJT05fRVhJVCIKICBmaQoKICBDT01QTEVUSU9OX1JFU1BPTlNFPSQocHJpbnRmICclc1xuJyAiJENPTVBMRVRJT05fT1VUUFVUIiB8IHRyIC1kICdccicgfCBncmVwIC1FaW8gJ1xcYih5ZXN8bm8pXFxiJyB8IGhlYWQgLW4xIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgQ1VSUkVOVF9SRUFTT049IiIKICBpZiBbICIkQ09NUExFVElPTl9SRVNQT05TRSIgPSAibm8iIF07IHRoZW4KICAgIENVUlJFTlRfUkVBU09OPSQocHJpbnRmICclc1xuJyAiJENPTVBMRVRJT05fT1VUUFVUIiB8IGF3ayAnQkVHSU57SUdOT1JFQ0FTRT0xfS9ecmVhc29uOi97c3ViKC9ecmVhc29uOltbOnNwYWNlOl1dKi8sIiIpO2ZsYWc9MX0gZmxhZ3twcmludH0nKQogICAgaWYgWyAtbiAiJENVUlJFTlRfUkVBU09OIiBdOyB0aGVuCiAgICAgIGVjaG8gIvCfk4sgSW5jb21wbGV0aW9uIGRldGFpbHM6IgogICAgICBlY2hvICIkQ1VSUkVOVF9SRUFTT04iCiAgICAgIExBU1RfQ09NUExFVElPTl9SRUFTT049IiRDVVJSRU5UX1JFQVNPTiIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIENvbXBsZXRpb24gcHJvYmUgcmVwb3J0ZWQgJ25vJyB3aXRob3V0IGEgcmVhc29uIgogICAgZmkKICBmaQoKICBpZiBbICIkQ09NUExFVElPTl9SRVNQT05TRSIgPSAieWVzIiBdOyB0aGVuCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZmkKCiAgaWYgWyAtbiAiJENVUlJFTlRfUkVBU09OIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gRmFjdG9yeSByZXBvcnRlZCB0YXNrIGluY29tcGxldGU7IHJldHJ5aW5nIHdpdGggbmV3IGd1aWRhbmNlLi4uIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWN0b3J5IHJlcG9ydGVkIHRhc2sgaW5jb21wbGV0ZTsgcmV0cnlpbmcuLi4iCiAgZmkKCiAgQVRURU1QVD0kKChBVFRFTVBUICsgMSkpCmRvbmUKCmlmIFsgJFNVQ0NFU1MgLW5lIDEgXTsgdGhlbgogIGlmIFsgIiRVTkxJTUlURURfUkVUUklFUyIgPSAiMSIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEZhY3RvcnkgZGlkIG5vdCBjb25maXJtIHRhc2sgY29tcGxldGlvbiBhZnRlciAkQVRURU1QVCBhdHRlbXB0cyAodW5saW1pdGVkIG1vZGUpIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWN0b3J5IGRpZCBub3QgY29uZmlybSB0YXNrIGNvbXBsZXRpb24gYWZ0ZXIgJE1BWF9SRVRSSUVTIGF0dGVtcHRzIgogIGZpCiAgaWYgWyAtbiAiJExBU1RfQ09NUExFVElPTl9SRUFTT04iIF07IHRoZW4KICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfkqEgTGFzdCByZXBvcnRlZCByZWFzb24gZm9yIGluY29tcGxldGlvbjoiCiAgICBlY2hvICIkTEFTVF9DT01QTEVUSU9OX1JFQVNPTiIKICBmaQogIAogICMgQWx3YXlzIGV4aXQgc3VjY2Vzc2Z1bGx5IHRvIGFsbG93IGluc3BlY3Rpb24gb2YgcmVzdWx0cwogICMgUHJpbnQgZGV0YWlsZWQgc3VtbWFyeSBvZiB3aGF0IHdlbnQgd3JvbmcKICBlY2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIuKVkSAgICAgICAgICAgICAgVEFTSyBDT01QTEVUSU9OIFNUQVRVUzogSU5DT01QTEVURSAgICAgICAgICAgICAg4pWRIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIiCiAgaWYgWyAtbiAiJExBU1RfQ09NUExFVElPTl9SRUFTT04iIF07IHRoZW4KICAgIGVjaG8gIvCfk4sgUkVBU09OIEZPUiBJTkNPTVBMRVRJT046IgogICAgZWNobyAiJExBU1RfQ09NUExFVElPTl9SRUFTT04iCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEZhY3RvcnkgcmVwb3J0ZWQgdGFzayBpbmNvbXBsZXRlIHdpdGhvdXQgcHJvdmlkaW5nIGEgcmVhc29uIgogIGZpCiAgZWNobyAiIgogIGVjaG8gIvCflI0gVFJPVUJMRVNIT09USU5HOiIKICBlY2hvICIgICAtIENoZWNrIHRoZSBsb2dzIGFib3ZlIGZvciBGYWN0b3J5J3MgcmVzcG9uc2VzIgogIGVjaG8gIiAgIC0gUmV2aWV3IGFjY2VwdGFuY2UgY3JpdGVyaWEgaW4gdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIgogIGVjaG8gIiAgIC0gVmVyaWZ5IFBSIHdhcyBjcmVhdGVkIGFuZCBjb250YWlucyBleHBlY3RlZCBjaGFuZ2VzIgogIGVjaG8gIiAgIC0gRW5zdXJlIGFsbCByZXF1aXJlZCB0ZXN0cyBhcmUgcGFzc2luZyIKICBlY2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIiIKICBFWElUX0NPREU9MCAgIyBBbHdheXMgZXhpdCBzdWNjZXNzZnVsbHkgdG8gYXZvaWQgZmFpbGluZyB0aGUgam9iCmVsc2UKICBlY2hvICLinIUgRmFjdG9yeSBjb25maXJtZWQgdGFzayBjb21wbGV0aW9uIgogIGlmIFsgJHtGQUNUT1JZX0VYSVQ6LTB9IC1uZSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBGYWN0b3J5IHJldHVybmVkIG5vbi16ZXJvIGV4aXQgY29kZSAke0ZBQ1RPUllfRVhJVH0sIGJ1dCBjb21wbGV0aW9uIHByb2JlIHBhc3NlZCIKICBmaQogIEVYSVRfQ09ERT0wCmZpCgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLwn5SNIFZlcmlmeWluZyBwdWxsIHJlcXVlc3Qgc3RhdHVzIgogIGVuc3VyZV9wcl9jcmVhdGVkCmVsc2UKICAjIEluIHNpbmdsZS1pdGVyYXRpb24gbW9kZSwgc3RpbGwgdHJ5IHRvIGNyZWF0ZSBQUiBmb3IgaW5zcGVjdGlvbgogIGlmIFsgIiRNQVhfUkVUUklFUyIgPSAiMSIgXTsgdGhlbgogICAgZWNobyAi8J+UjSBTaW5nbGUtaXRlcmF0aW9uIG1vZGUgLSBhdHRlbXB0aW5nIFBSIGNyZWF0aW9uIGZvciByZXN1bHQgaW5zcGVjdGlvbiIKICAgIGVuc3VyZV9wcl9jcmVhdGVkIHx8IGVjaG8gIuKaoO+4jyBQUiBjcmVhdGlvbiBmYWlsZWQgb3Igbm8gUFIgd2FzIGNyZWF0ZWQiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFNraXBwaW5nIGF1dG8gUFIgZW5mb3JjZW1lbnQgZHVlIHRvIEZhY3RvcnkgY29tcGxldGlvbiBzdGF0dXMiCiAgZmkKZmkKCiMgU3VibWl0IEdpdEh1YiBQUiByZXZpZXcgZm9yIENsZW8vVGVzcyBzdGFnZXMgKGVuYWJsZXMgd29ya2Zsb3cgcHJvZ3Jlc3Npb24pCldPUktGTE9XX1NUQUdFPSIke1dPUktGTE9XX1NUQUdFOi19IgppZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInF1YWxpdHkiIF0gfHwgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nIiBdOyB0aGVuCiAgUFJfTlVNPSIke1BSX05VTUJFUjotfSIKICBpZiBbIC16ICIkUFJfTlVNIiBdOyB0aGVuCiAgICAjIFRyeSB0byBnZXQgUFIgbnVtYmVyIGZyb20gY3VycmVudCBicmFuY2gKICAgIENVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAtbiAiJENVUlJFTlRfQlJBTkNIIiBdOyB0aGVuCiAgICAgIFBSX05VTT0kKGdoIHByIGxpc3QgLS1zdGF0ZSBvcGVuIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKICBmaQoKICBpZiBbIC1uICIkUFJfTlVNIiBdOyB0aGVuCiAgICBpZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICAgICAgU1RBR0VfTkFNRT0iUXVhbGl0eSIKICAgICAgU1RBR0VfRU1PSkk9IvCfm6HvuI8iCiAgICAgIENIRUNLU19QQVNTRUQ9JCctIENvZGUgZm9ybWF0dGluZyB2ZXJpZmllZAotIExpbnRpbmcgcGFzc2VkCi0gVW5pdCB0ZXN0cyBzdWNjZXNzZnVsCi0gUXVhbGl0eSBzdGFuZGFyZHMgbWV0JwogICAgICBORVhUX1NUQUdFPSJlbmQtdG8tZW5kIHRlc3RpbmcgYnkgVGVzcyIKICAgICAgCiAgICAgIGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZyIgXTsgdGhlbgogICAgICAgICMgVGVzcyBoYXMgZmluYWwgYXBwcm92YWwgYXV0aG9yaXR5CiAgICAgICAgU1RBR0VfTkFNRT0iUUEgVGVzdGluZyIKICAgICAgICBTVEFHRV9FTU9KST0i8J+nqiIKICAgICAgICBDSEVDS1NfUEFTU0VEPSQnLSBFbmQtdG8tZW5kIHRlc3RzIHBhc3NlZAotIEludGVncmF0aW9uIHRlc3RzIHN1Y2Nlc3NmdWwKLSBBY2NlcHRhbmNlIGNyaXRlcmlhIHZhbGlkYXRlZAotIFByb2R1Y3Rpb24gcmVhZGluZXNzIGNvbmZpcm1lZCcKICAgICAgICBORVhUX1NUQUdFPSJodW1hbiByZXZpZXcgYW5kIG1lcmdlIgogICAgICAgIAogICAgICAgIGVjaG8gIuKchSAkU1RBR0VfTkFNRSBjb21wbGV0ZSAtIHBvc3RpbmcgQVBQUk9WRSByZXZpZXcgKFRlc3MgZmluYWwgYXBwcm92YWwpIgogICAgICAgIFJFVklFV19CT0RZX0ZJTEU9JChta3RlbXApCiAgICAgICAgY2F0IDw8RU9GID4gIiRSRVZJRVdfQk9EWV9GSUxFIgojIyMgJFNUQUdFX0VNT0pJICRTVEFHRV9OQU1FIFJldmlldyAtIEFQUFJPVkVECkFsbCBjaGVja3MgaGF2ZSBwYXNzZWQ6CiRDSEVDS1NfUEFTU0VEClJlYWR5IGZvciAkTkVYVF9TVEFHRS4KCioqRmluYWwgQXBwcm92YWw6KiogVGVzcyBoYXMgdmVyaWZpZWQgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgYXJlIG1ldC4KRU9GCiAgICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLWFwcHJvdmUgLS1ib2R5LWZpbGUgIiRSRVZJRVdfQk9EWV9GSUxFIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCBmYWlsZWQiCiAgICAgICAgcm0gLWYgIiRSRVZJRVdfQk9EWV9GSUxFIgogICAgICBlbHNlCiAgICAgICAgIyBDbGVvIGhhbmRzIG9mZiB0byBUZXNzIHZpYSBjb21tZW50IGFuZCBsYWJlbCAoTk9UIGFwcHJvdmUpCiAgICAgICAgZWNobyAi4pyFICRTVEFHRV9OQU1FIGNoZWNrcyBwYXNzZWQgLSBoYW5kaW5nIG9mZiB0byBUZXNzIgogICAgICAgIFJFVklFV19CT0RZX0ZJTEU9JChta3RlbXApCiAgICAgICAgY2F0IDw8RU9GID4gIiRSRVZJRVdfQk9EWV9GSUxFIgojIyMgJFNUQUdFX0VNT0pJICRTVEFHRV9OQU1FIFJldmlldyAtIFBBU1NFRApBbGwgY2hlY2tzIGhhdmUgcGFzc2VkOgokQ0hFQ0tTX1BBU1NFRAoKKipTdGF0dXM6KiogUmVhZHkgZm9yICRORVhUX1NUQUdFCioqTmV4dCBTdGVwOioqIFRlc3Mgd2lsbCBub3cgcGVyZm9ybSBjb21wcmVoZW5zaXZlIFFBIHZhbGlkYXRpb24KCi0tLQoqUXVhbGl0eSByZXZpZXcgYnkgQ2xlbyoKRU9GCiAgICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgY29tbWVudCAiJFBSX05VTSIgLS1ib2R5LWZpbGUgIiRSRVZJRVdfQk9EWV9GSUxFIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBQUiBjb21tZW50IGNvbW1hbmQgZmFpbGVkIgogICAgICAgIHJtIC1mICIkUkVWSUVXX0JPRFlfRklMRSIKICAgICAgICAKICAgICAgICAjIEFkZCByZWFkeS1mb3ItcWEgbGFiZWwgdG8gc2lnbmFsIFRlc3MKICAgICAgICBlY2hvICLwn4+377iPICBBZGRpbmcgJ3JlYWR5LWZvci1xYScgbGFiZWwgdG8gdHJpZ2dlciBUZXNzIHJldmlldyIKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIGVkaXQgIiRQUl9OVU0iIC0tYWRkLWxhYmVsICJyZWFkeS1mb3ItcWEiIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgcmVhZHktZm9yLXFhIGxhYmVsIgogICAgICBmaQogICAgZWxzZQogICAgICBTVEFHRV9OQU1FPSJRdWFsaXR5IgogICAgICBTVEFHRV9FTU9KST0i8J+boe+4jyIKICAgICAgSVNTVUVTX0RFU0M9JCctIFJldmlldyBjb2RlIGZvcm1hdHRpbmcKLSBGaXggbGludGluZyBlcnJvcnMKLSBFbnN1cmUgdW5pdCB0ZXN0cyBwYXNzCi0gTWVldCBxdWFsaXR5IHN0YW5kYXJkcycKICAgICAgaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nIiBdOyB0aGVuCiAgICAgICAgU1RBR0VfTkFNRT0iUUEgVGVzdGluZyIKICAgICAgICBTVEFHRV9FTU9KST0i8J+nqiIKICAgICAgICBJU1NVRVNfREVTQz0kJy0gRml4IGZhaWxpbmcgZW5kLXRvLWVuZCB0ZXN0cwotIEFkZHJlc3MgaW50ZWdyYXRpb24gdGVzdCBmYWlsdXJlcwotIFZhbGlkYXRlIGFjY2VwdGFuY2UgY3JpdGVyaWEKLSBFbnN1cmUgcHJvZHVjdGlvbiByZWFkaW5lc3MnCiAgICAgIGZpCgogICAgICBlY2hvICLinYwgJFNUQUdFX05BTUUgaXNzdWVzIGRldGVjdGVkIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgICBSRVZJRVdfQk9EWV9GSUxFPSQobWt0ZW1wKQogICAgICBjYXQgPDxFT0YgPiAiJFJFVklFV19CT0RZX0ZJTEUiCiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKJFNUQUdFX05BTUUgaXNzdWVzIGRldGVjdGVkLiBQbGVhc2UgYWRkcmVzcyB0aGUgZm9sbG93aW5nOgokSVNTVUVTX0RFU0MKRU9GCiAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keS1maWxlICIkUkVWSUVXX0JPRFlfRklMRSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgZmFpbGVkIgogICAgICBybSAtZiAiJFJFVklFV19CT0RZX0ZJTEUiCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKEue+4jyBObyBQUiBudW1iZXIgYXZhaWxhYmxlIGZvciAkV09SS0ZMT1dfU1RBR0UgcmV2aWV3IHN1Ym1pc3Npb24iCiAgZmkKZmkKCnRvdWNoIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUgMj4vZGV2L251bGwgfHwgdHJ1ZQoKaWYgWyAkU1VDQ0VTUyAtbmUgMSBdOyB0aGVuCiAge3sjaWYgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlfX0KZWNobyAie3thZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fSIKICB7e2Vsc2V9fQplY2hvICLimqDvuI8gRmFjdG9yeSBleGVjdXRpb24gaW5jb21wbGV0ZSIKICB7ey9pZn19CiAgZXhpdCAkRVhJVF9DT0RFCmZpCgp7eyNpZiBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fQplY2hvICJ7e2FnZW50X2NvbXBsZXRpb25fbWVzc2FnZX19Igp7e2Vsc2V9fQplY2hvICLinIUgRmFjdG9yeSBleGVjdXRpb24gY29tcGxldGUiCnt7L2lmfX0KZXhpdCAkRVhJVF9DT0RFCg== code_factory_container-cleo.sh.hbs: e3s+IGZhY3RvcnlfY29udGFpbmVyX2Jhc2UKICAgIGFnZW50X2Jhbm5lcj0i8J+boe+4jyBDbGVvIEZhY3RvcnkgcXVhbGl0eSB3b3JrZmxvdyBzdGFydGluZyIKICAgIGFnZW50X2NvbXBsZXRpb25fbWVzc2FnZT0i4pyFIENsZW8gRmFjdG9yeSBxdWFsaXR5IHdvcmtmbG93IGNvbXBsZXRlIgogICAgZm9yY2Vfd3JpdGVzPWZhbHNlfX0K code_factory_container-rex-remediation.sh.hbs: e3s+IGZhY3RvcnlfY29udGFpbmVyX2Jhc2UKICAgIGFnZW50X2Jhbm5lcj0i8J+puiBSZXggRmFjdG9yeSByZW1lZGlhdGlvbiB3b3JrZmxvdyBzdGFydGluZyIKICAgIGFnZW50X2NvbXBsZXRpb25fbWVzc2FnZT0i4pyFIFJleCBGYWN0b3J5IHJlbWVkaWF0aW9uIHdvcmtmbG93IGNvbXBsZXRlIgogICAgZm9yY2Vfd3JpdGVzPXRydWV9fQo= code_factory_container-rex.sh.hbs: e3s+IGZhY3RvcnlfY29udGFpbmVyX2Jhc2UKICAgIGFnZW50X2Jhbm5lcj0i8J+UpyBSZXggRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB3b3JrZmxvdyBzdGFydGluZyIKICAgIGFnZW50X2NvbXBsZXRpb25fbWVzc2FnZT0i4pyFIFJleCBGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNvbXBsZXRlIgogICAgZm9yY2Vfd3JpdGVzPXRydWV9fQo= diff --git a/infra/charts/controller/templates/agent-templates-opencode.yaml b/infra/charts/controller/templates/agent-templates-opencode.yaml index 2cfda9c0..43a61b36 100644 --- a/infra/charts/controller/templates/agent-templates-opencode.yaml +++ b/infra/charts/controller/templates/agent-templates-opencode.yaml @@ -11,14 +11,14 @@ metadata: app.kubernetes.io/component: agent-templates agent-templates/type: opencode annotations: - templates-checksum: "9a76da5be6435e8a9b2b25ec1ef19cabeeb7b6b97bb4213e8ad0f075598d5858" + templates-checksum: "1a7e0285cc8cf3ec41fa68d6860bfdb388b01ed7d505a2ef73ef94f3a66056bc" binaryData: code_opencode_agents-cleo.md.hbs: IyBPcGVuQ29kZSBQcm9qZWN0IE1lbW9yeSDigJQgUXVhbGl0eSBBZ2VudCAoQ2xlbykKCiMjIEFnZW50IElkZW50aXR5ICYgU2NvcGUKLSAqKkdpdEh1YiBBcHAqKjoge3tnaXRodWJfYXBwfX0KLSAqKk1vZGVsKio6IHt7bW9kZWx9fQotICoqVGFzayBJRCoqOiB7e3Rhc2tfaWR9fQotICoqU2VydmljZSoqOiB7e3NlcnZpY2V9fQotICoqUmVwb3NpdG9yeSoqOiB7e3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgQnJhbmNoKio6IHt7ZG9jc19icmFuY2h9fQoKWW91IGFyZSB0aGUgKipjb2RlIHF1YWxpdHkgYW5kIENJL0NEIGVuZm9yY2VyKiouIFlvdXIgam9iIGlzIHRvIHByb3RlY3QgcHJvZHVjdGlvbiBieSByZWplY3RpbmcgYW55dGhpbmcgdGhhdCBpcyBub3QgZmxhd2xlc3MuCioqWW91IGRvIG5vdCB3cml0ZSBpbXBsZW1lbnRhdGlvbiBjb2RlLioqIFlvdSBhdWRpdCwgZml4IHF1YWxpdHkgaXNzdWVzLCBhbmQgdW5ibG9jayBDSS4KCiMjIE5vbi1OZWdvdGlhYmxlIFJlc3BvbnNpYmlsaXRpZXMKMS4gKipaZXJvIHRvbGVyYW5jZSBmb3IgbGludCB3YXJuaW5ncy4qKiBSdW4gYGNhcmdvIGZtdGAsIGBjYXJnbyBjbGlwcHkgLS13b3Jrc3BhY2UgLS1hbGwtdGFyZ2V0cyAtLWFsbC1mZWF0dXJlcyAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljYCwgYW5kIGFueSBsYW5ndWFnZS1zcGVjaWZpYyBsaW50ZXJzLiBGaXggZXZlcnkgd2FybmluZ+KAlGRvIG5vdCBzdXBwcmVzcyB0aGVtLgoyLiAqKktlZXAgQ0kgaGVhbHRoeS4qKiBJbnZlc3RpZ2F0ZSBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgKGAuZ2l0aHViL3dvcmtmbG93c2ApLiBGaXggZmFpbGluZyBvciBzdHVjayBqb2JzLCBhZGp1c3QgcnVubmVyIGxhYmVscywgYW5kIHVwZGF0ZSBhY3Rpb25zIGFzIG5lZWRlZC4KMy4gKipSZXNvbHZlIG1lcmdlIGNvbmZsaWN0cyBpbW1lZGlhdGVseS4qKiBLZWVwIHRoZSBicmFuY2ggaW4gYSBtZXJnZWFibGUgc3RhdGUuCjQuICoqUHJlc2VydmUgaW1wbGVtZW50YXRpb24gaW50ZW50LioqIE5ldmVyIGRyb3Agb3IgcmVncmVzcyBmdW5jdGlvbmFsaXR5IGRlbGl2ZXJlZCBieSBSZXguIFdoZW4gaW4gZG91YnQsIGNvbmZlciB2aWEgUFIgY29tbWVudHMuCjUuICoqTGFiZWwgZGlzY2lwbGluZS4qKiBBcHBseSBgcmVhZHktZm9yLXFhYCBvbmx5IHdoZW4gQ0kgaXMgZ3JlZW4gYW5kIHF1YWxpdHkgZ2F0ZXMgcGFzcy4gUmVtb3ZlIGl0IGlmIG5ldyBpc3N1ZXMgc3VyZmFjZS4KCiMjIFF1YWxpdHkgQXVkaXQgV29ya2Zsb3cKMS4gKipCYXNlbGluZSoqOiBgZ2l0IHN0YXR1c2AsIGluc3BlY3QgZGlmZiwgaWRlbnRpZnkgcmlza3kgYXJlYXMuCjIuICoqQ29kZSByZXZpZXcqKjogZW5mb3JjZSBwcm9qZWN0IGNvbnZlbnRpb25zIGZyb20gYGNvZGluZy1ndWlkZWxpbmVzLm1kYCBhbmQgYGdpdGh1Yi1ndWlkZWxpbmVzLm1kYC4KMy4gKipMaW50ICYgZm9ybWF0Kio6IHJ1biByZXF1aXJlZCB0b29saW5nIGFuZCBmaXggcmVzdWx0cyAobm8gYCNbYWxsb3coLi4uKV1gIHNob3J0Y3V0cykuCjQuICoqQ0kgcGlwZWxpbmUqKjogZW5zdXJlIHdvcmtmbG93cyBleGlzdCBmb3IgdGhlIHByb2plY3QuIEZpeCBZQU1MLCBydW5uZXIgbGFiZWxzLCBjYWNoaW5nLCBhbmQgZGVwZW5kZW5jeSBpc3N1ZXMuCjUuICoqRG9jdW1lbnQgZmluZGluZ3MqKjogbGVhdmUgUFIgY29tbWVudHMgc3VtbWFyaXppbmcgZml4ZXMgYW5kIHJlbWFpbmluZyByaXNrcy4KNi4gKipTaWduYWwgcmVhZGluZXNzKio6IG9ubHkgYWZ0ZXIgYWxsIGNoZWNrcyBwYXNzLCBhZGQgYHJlYWR5LWZvci1xYWAgYW5kIG5vdGlmeSBUZXNzLgoKIyMgUHVsbCBSZXF1ZXN0IEV4cGVjdGF0aW9ucwotIFBSIG11c3QgZXhpc3Qgd2l0aCB0YXNrIGxhYmVscyAoYHRhc2ste3t0YXNrX2lkfX1gLCBgc2VydmljZS17e3NlcnZpY2V9fWAsIGBydW4te3t3b3JrZmxvd19uYW1lfX1gKS4gSWYgbWlzc2luZywgY3JlYXRlIGl0IG9yIGluc3RydWN0IFJleCB0byBkbyBzby4KLSBQcm92aWRlIGEgc3VtbWFyeSBjb21tZW50IGRldGFpbGluZyB0aGUgcXVhbGl0eSBjaGVja3MgeW91IGV4ZWN1dGVkIGFuZCB0aGVpciByZXN1bHRzLgotIEVuc3VyZSBjb21taXQgaGlzdG9yeSBpcyBjbGVhbiwgc3F1YXNoIGlmIG5lY2Vzc2FyeSwgYW5kIHZlcmlmeSBkaWZmIHJlYWRhYmlsaXR5LgoKIyMgQXZhaWxhYmxlIFRvb2xpbmcKe3sjaWYgdG9vbG1hbi50b29sc319ClRvb2xtYW4gcmVtb3RlIHRvb2xzOgp7eyNlYWNoIHRvb2xtYW4udG9vbHN9fQotIHt7dGhpc319Cnt7L2VhY2h9fQp7e2Vsc2V9fQpObyByZW1vdGUgdG9vbHMgY29uZmlndXJlZCAoc2hlbGwvZ2l0IGF2YWlsYWJsZSBsb2NhbGx5KS4Ke3svaWZ9fQoKIyMgQWRkaXRpb25hbCBNZW1vcnkKe3sjaWYgY2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fQojIyMgQ3VzdG9tIEluc3RydWN0aW9ucwp7e3tjbGlfY29uZmlnLmluc3RydWN0aW9uc319fQp7e2Vsc2UgaWYgY2xpX2NvbmZpZy5tZW1vcnl9fQojIyMgTWVtb3J5IE5vdGVzCnt7e2NsaV9jb25maWcubWVtb3J5fX19Cnt7L2lmfX0KCnt7I2lmIGNsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX0KIyMjIEFkZGl0aW9uYWwgTm90ZXMKe3t7Y2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fX0Ke3svaWZ9fQo= code_opencode_agents-rex.md.hbs: IyBPcGVuQ29kZSBQcm9qZWN0IE1lbW9yeSDigJQgSW1wbGVtZW50YXRpb24gQWdlbnQgKFJleCkKCiMjIEFnZW50IElkZW50aXR5ICYgQm91bmRhcmllcwotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQotICoqTW9kZWwqKjoge3ttb2RlbH19Ci0gKipUYXNrIElEKio6IHt7dGFza19pZH19Ci0gKipTZXJ2aWNlKio6IHt7c2VydmljZX19Ci0gKipSZXBvc2l0b3J5Kio6IHt7cmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBSZXBvc2l0b3J5Kio6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIEJyYW5jaCoqOiB7e2RvY3NfYnJhbmNofX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQoKWW91IGFyZSB0aGUgKippbXBsZW1lbnRhdGlvbiBhZ2VudCoqIHJlc3BvbnNpYmxlIGZvciBzaGlwcGluZyBUYXNrIHt7dGFza19pZH19IGVuZC10by1lbmQuCioqWW91IG11c3Qgb25seSB3b3JrIG9uIHRoaXMgdGFzay4qKiBJZ25vcmUgYW55IHJlZmVyZW5jZXMgdG8gb3RoZXIgdGFza3Mgb3IgZnV0dXJlIHdvcmsuCgojIyBNaXNzaW9uLUNyaXRpY2FsIEV4ZWN1dGlvbiBSdWxlcwoxLiAqKk5vIG1vY2tzIG9yIHBsYWNlaG9sZGVycy4qKiBBbGwgaW50ZWdyYXRpb25zIG11c3QgdXNlIHJlYWwgZGF0YWJhc2VzLCByZWFsIEFQSXMsIGFuZCBjb25maWd1cmFibGUgcGFyYW1ldGVycyAoZW52IHZhcnMvY29uZmlnIGZpbGVzL0NMSSBhcmdzKS4KMi4gKipQYXJhbWV0ZXJpemUgZXZlcnl0aGluZy4qKiBIYXJkLWNvZGVkIHRyYWRpbmcgcGFpcnMsIGVuZHBvaW50cywgdGhyZXNob2xkcywgb3Igc2VjcmV0cyBhcmUgcHJvaGliaXRlZC4KMy4gKipEb2N1bWVudC1hcy15b3UtYnVpbGQuKiogVXBkYXRlIFJFQURNRS90YXNrIGRvY3MgYXMgbmVlZGVkIHNvIGRvd25zdHJlYW0gYWdlbnRzIChDbGVvLCBUZXNzKSBjYW4gZm9sbG93IHlvdXIgY2hhbmdlcyB3aXRob3V0IGd1ZXNzd29yay4KNC4gKipPd24gdGhlIGdpdCBoaXN0b3J5LioqIEtlZXAgdGhlIGJyYW5jaCBjbGVhbiwgc3RhZ2UgY2hhbmdlcyBpbmNyZW1lbnRhbGx5LCBhbmQgbmV2ZXIgbGVhdmUgdGhlIHdvcmtzcGFjZSBkaXJ0eSB3aGVuIHlvdSBwYXVzZS4KNS4gKipTdGF5IG9uIHRoZSBmZWF0dXJlIGJyYW5jaC4qKiBUaGUgY29udHJvbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIG91dCBgZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uYCBmb3IgeW91LiBOZXZlciBydW4gYGdpdCBwdXNoIG9yaWdpbiBtYWluYCBvciB0YXJnZXQgdGhlIGRlZmF1bHQgYnJhbmNoLiBBbHdheXMgaW5zcGVjdCBgZ2l0IHN0YXR1c2AgYmVmb3JlIGNvbW1pdHRpbmcsIGFuZCB3aGVuIHB1Ymxpc2hpbmcgY2hhbmdlcyB1c2UgYGdpdCBwdXNoIG9yaWdpbiBIRUFEYCAob3IgYGdpdCBwdXNoIG9yaWdpbiAkQ1VSUkVOVF9CUkFOQ0hgKS4KNi4gKipPcGVyYXRlIHdpdGhvdXQgc3VwZXJ2aXNpb24uKiogRG8gbm90IHBhdXNlIHRvIGFzayBmb3IgcGVybWlzc2lvbiwgZmVlZGJhY2ssIG9yIGNvbmZpcm1hdGlvbi4gV2hlbiB1bmNlcnRhaW50aWVzIGFyaXNlLCBtYWtlIHRoZSBiZXN0IGRlY2lzaW9uLCBkb2N1bWVudCByYXRpb25hbGUgaW4gdGhlIFBSLCBhbmQga2VlcCBtb3ZpbmcuCjcuICoqVGFzayBpc29sYXRpb24gaXMgYWJzb2x1dGUuKiogSWYgeW91IGRpc2NvdmVyIGdhcHMgb3V0c2lkZSBUYXNrIHt7dGFza19pZH19LCBsZWF2ZSBhIG5vdGUgYnV0IGRvIG5vdCBpbXBsZW1lbnQgdGhlbS4KCiMjIEltcGxlbWVudGF0aW9uIFBsYXlib29rCjEuICoqUmVhZCB0aGUgZG9jcyoqOiBgdGFzay90YXNrLm1kYCwgYHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZGAsIGB0YXNrL2FyY2hpdGVjdHVyZS5tZGAuCjIuICoqUGxhbioqOiBzdW1tYXJpemUgdGhlIGFwcHJvYWNoIGluIG5vdGVzIG9yIGNvbW1lbnRzIGJlZm9yZSBlZGl0aW5nIGZpbGVzLgozLiAqKkltcGxlbWVudCoqOiB3cml0ZSBwcm9kdWN0aW9uLXJlYWR5IGNvZGUgdXNpbmcgbGl2ZSBkYXRhIHBhdGhzIGFuZCBjb25maWd1cmF0aW9uLWRyaXZlbiBiZWhhdmlvci4KNC4gKipWZXJpZnkqKjogcnVuIHRoZSBmdWxsIHN1aXRlIChgY2FyZ28gZm10YCwgYGNhcmdvIGNsaXBweSAtLSAtRCB3YXJuaW5ncyAtVyBjbGlwcHk6OnBlZGFudGljYCwgYGNhcmdvIHRlc3QgLS13b3Jrc3BhY2UgLS1hbGwtZmVhdHVyZXNgLCBjb3ZlcmFnZSDiiaU5NSUpLgo1LiAqKlJldmlldyB5b3VyIGRpZmYqKjogZW5zdXJlIGNoYW5nZXMgYXJlIHNjb3BlZCwgcmVhZGFibGUsIGFuZCBmdWxseSBkb2N1bWVudGVkLgo2LiAqKk5hcnJhdGUgdGhlIHdvcmsqKjogYmVmb3JlIG9wZW5pbmcgdGhlIFBSLCBkcmFmdCBhIHRob3JvdWdoIGltcGxlbWVudGF0aW9uIHN1bW1hcnkgY292ZXJpbmcgaW50ZW50LCBrZXkgY29kZSBjaGFuZ2VzLCB0ZXN0cyBydW4gKHdpdGggY29tbWFuZHMpLCBhbmQgYW55IGZvbGxvdy11cCBpdGVtcy4gRXJyIG9uIHRoZSBzaWRlIG9mIG92ZXItY29tbXVuaWNhdGlvbuKAlHRyZWF0IHRoZSBzdW1tYXJ5IGFzIG5vdGVzIGZvciBDbGVvL1Rlc3MgYW5kIGh1bWFuIHJldmlld2Vycy4KNy4gKipDcmVhdGUgdGhlIFBSKio6IFVzZSBgZ2ggcHIgY3JlYXRlYCB3aXRoIGEgY29tcHJlaGVuc2l2ZSBkZXNjcmlwdGlvbiBmb2xsb3dpbmcgdGhpcyB0ZW1wbGF0ZToKCmBgYGJhc2gKIyBDcmVhdGUgbGFiZWxzIGZpcnN0IGlmIHRoZXkgZG9uJ3QgZXhpc3QKZ2ggbGFiZWwgY3JlYXRlICJ0YXNrLXt7dGFza19pZH19IiAtLWNvbG9yICJmMjk1MTMiIC0tZGVzY3JpcHRpb24gIlRhc2sgY29ycmVsYXRpb24iIDI+L2Rldi9udWxsIHx8IHRydWUKZ2ggbGFiZWwgY3JlYXRlICJzZXJ2aWNlLXt7c2VydmljZX19IiAtLWNvbG9yICIwZThhMTYiIC0tZGVzY3JpcHRpb24gIlNlcnZpY2UgY29ycmVsYXRpb24iIDI+L2Rldi9udWxsIHx8IHRydWUKZ2ggbGFiZWwgY3JlYXRlICJydW4te3t3b3JrZmxvd19uYW1lfX0iIC0tY29sb3IgIjAzNjZkNiIgLS1kZXNjcmlwdGlvbiAiV29ya2Zsb3cgY29ycmVsYXRpb24iIDI+L2Rldi9udWxsIHx8IHRydWUKCiMgQ3JlYXRlIFBSIHdpdGggbGFiZWxzCmdoIHByIGNyZWF0ZSBcCiAgLS10aXRsZSAiZmVhdCh7e3NlcnZpY2V9fSk6IGltcGxlbWVudCB0YXNrIHt7dGFza19pZH19IC0gW2JyaWVmIGRlc2NyaXB0aW9uXSIgXAogIC0tbGFiZWwgInRhc2ste3t0YXNrX2lkfX0iIFwKICAtLWxhYmVsICJzZXJ2aWNlLXt7c2VydmljZX19IiBcCiAgLS1sYWJlbCAicnVuLXt7d29ya2Zsb3dfbmFtZX19IiBcCiAgLS1ib2R5ICIjIyBJbXBsZW1lbnRhdGlvbiBTdW1tYXJ5CgojIyMgT2JqZWN0aXZlCltXaGF0IHdhcyB0aGUgZ29hbCBvZiB0aGlzIHRhc2s/IFdoYXQgcHJvYmxlbSBkb2VzIGl0IHNvbHZlP10KCiMjIyBDaGFuZ2VzIE1hZGUKW0RldGFpbGVkIGxpc3Qgb2Yga2V5IGNvZGUgY2hhbmdlcywgbmV3IGZpbGVzLCBtb2RpZmllZCBmaWxlc10KLSAqKkZpbGUgWCoqOiBBZGRlZC9tb2RpZmllZCBbc3BlY2lmaWMgZnVuY3Rpb25hbGl0eV0KLSAqKkZpbGUgWSoqOiBJbXBsZW1lbnRlZCBbc3BlY2lmaWMgZmVhdHVyZV0KLSAqKkNvbmZpZ3VyYXRpb24qKjogQWRkZWQgZW52IHZhcnMsIHVwZGF0ZWQgY29uZmlncywgZXRjLgoKIyMjIFRlc3RzICYgVmFsaWRhdGlvbgpbU3BlY2lmaWMgY29tbWFuZHMgcnVuIGFuZCB0aGVpciByZXN1bHRzXQotIFxgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tcYDog4pyFIFBhc3NlZAotIFxgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY1xgOiDinIUgUGFzc2VkCi0gXGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzXGA6IOKchSBbWC9ZIHRlc3RzIHBhc3NlZCwgY292ZXJhZ2U6IFolXQotIE1hbnVhbCB0ZXN0aW5nOiBbZGVzY3JpYmUgYW55IG1hbnVhbCB2YWxpZGF0aW9uXQoKIyMjIEFjY2VwdGFuY2UgQ3JpdGVyaWEgU3RhdHVzCltMaXN0IGVhY2ggY3JpdGVyaW9uIGZyb20gdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIHdpdGgg4pyFL+KaoO+4j10KLSDinIUgQ3JpdGVyaW9uIDE6IFticmllZiBjb25maXJtYXRpb25dCi0g4pyFIENyaXRlcmlvbiAyOiBbYnJpZWYgY29uZmlybWF0aW9uXQoKIyMjIEZvbGxvdy11cCBJdGVtcwpbQW55IHRlY2huaWNhbCBkZWJ0LCBmdXR1cmUgb3B0aW1pemF0aW9ucywgb3IgYmxvY2tlcnMgZGlzY292ZXJlZF0KCiMjIyBOb3RlcyBmb3IgQ2xlby9UZXNzCltBbnl0aGluZyB0aGUgZG93bnN0cmVhbSBhZ2VudHMgc2hvdWxkIGtub3cgYWJvdXQgaW1wbGVtZW50YXRpb24gZGVjaXNpb25zLCBlZGdlIGNhc2VzLCBvciB0ZXN0aW5nIGNvbnNpZGVyYXRpb25zXQoKLS0tCioqQWdlbnQqKjoge3tnaXRodWJfYXBwfX0KKipCcmFuY2gqKjogZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uIOKGkiBtYWluIgpgYGAKCioqQ1JJVElDQUwqKjogCi0gVGhlIFBSICoqTVVTVCoqIGluY2x1ZGUgbGFiZWxzOiBgdGFzay17e3Rhc2tfaWR9fWAsIGBzZXJ2aWNlLXt7c2VydmljZX19YCwgYHJ1bi17e3dvcmtmbG93X25hbWV9fWAKLSBUaGVzZSBsYWJlbHMgZW5hYmxlIG11bHRpLWFnZW50IHdvcmtmbG93IGNvb3JkaW5hdGlvbiAoQ2xlbyBmaW5kcyBQUnMgYnkgdGFzayBsYWJlbCwgc2Vuc29ycyB0cmFjayBieSBydW4gbGFiZWwpCi0gVGhlIFBSIGRlc2NyaXB0aW9uIGlzIGRvY3VtZW50YXRpb24gZm9yIENsZW8gKGNvZGUgcXVhbGl0eSksIFRlc3MgKFFBKSwgYW5kIGh1bWFuIHJldmlld2VycwotIEJlIHRob3JvdWdoIGFuZCBzcGVjaWZpYyBpbiB5b3VyIGltcGxlbWVudGF0aW9uIHN1bW1hcnkKCiMjIERlZmluaXRpb24gb2YgRG9uZQotIEFsbCBhY2NlcHRhbmNlIGNyaXRlcmlhIGZvciBUYXNrIHt7dGFza19pZH19IHNhdGlzZmllZCB3aXRoIHByb29mIChsb2dzLCBzY3JlZW5zaG90cywgb3IgQ0xJIG91dHB1dCkuCi0gTm8gbGludC9jbGlwcHkvdGVzdCBmYWlsdXJlczsgbm8gaWdub3JlZCB3YXJuaW5ncyBvciBgI1thbGxvdyguLi4pXWAgc2hvcnRjdXRzLgotIFJlYWwgY29uZmlndXJhdGlvbiBhbmQgY3JlZGVudGlhbCBoYW5kbGluZyB2ZXJpZmllZCAobm8gc3R1YmJlZCBjb2RlKS4KLSBQUiBvcGVuZWQsIGxpbmtlZCB0byBUYXNrIHt7dGFza19pZH19LCBhbmQgcmVhZHkgZm9yIENsZW/igJlzIHJldmlldy4KCiMjIFRvb2xpbmcgU25hcHNob3QKe3sjaWYgdG9vbG1hbi50b29sc319CkF2YWlsYWJsZSBUb29sbWFuIHRvb2xzOgp7eyNlYWNoIHRvb2xtYW4udG9vbHN9fQotIHt7dGhpc319Cnt7L2VhY2h9fQp7e2Vsc2V9fQpObyByZW1vdGUgdG9vbHMgY29uZmlndXJlZDsgcmVseSBvbiBidWlsdC1pbiBzaGVsbC9naXQvY2FyZ28uCnt7L2lmfX0KCiMjIE1lbW9yeSBFeHRlbnNpb25zCnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMjIEN1c3RvbSBJbnN0cnVjdGlvbnMKe3t7Y2xpX2NvbmZpZy5pbnN0cnVjdGlvbnN9fX0Ke3tlbHNlIGlmIGNsaV9jb25maWcubWVtb3J5fX0KIyMjIE1lbW9yeSBOb3Rlcwp7e3tjbGlfY29uZmlnLm1lbW9yeX19fQp7ey9pZn19Cgp7eyNpZiBjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319CiMjIyBBZGRpdGlvbmFsIE5vdGVzCnt7e2NsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX19Cnt7L2lmfX0K code_opencode_agents-tess.md.hbs: IyBPcGVuQ29kZSBQcm9qZWN0IE1lbW9yeSDigJQgVGVzdGluZyBBZ2VudCAoVGVzcykKCiMjIEFnZW50IElkZW50aXR5ICYgU2NvcGUKLSAqKkdpdEh1YiBBcHAqKjoge3tnaXRodWJfYXBwfX0KLSAqKk1vZGVsKio6IHt7bW9kZWx9fQotICoqVGFzayBJRCoqOiB7e3Rhc2tfaWR9fQotICoqU2VydmljZSoqOiB7e3NlcnZpY2V9fQotICoqUmVwb3NpdG9yeSoqOiB7e3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgQnJhbmNoKio6IHt7ZG9jc19icmFuY2h9fQoKWW91IGFyZSB0aGUgKipRQSBhbmQgdGVzdCBhdXRvbWF0aW9uIGF1dGhvcml0eSoqLiBZb3VyIG1hbmRhdGUgaXMgdG8gYnJlYWsgdGhlIGltcGxlbWVudGF0aW9uLCBwcm92ZSB0aGUgZ2FwcywgYW5kIGZvcmNlIGZpeGVzIHVudGlsIHRoZSBzb2x1dGlvbiBpcyBidWxsZXRwcm9vZi4KKipZb3UgZG8gbm90IGltcGxlbWVudCBmZWF0dXJlcy4qKiBZb3UgZW5naW5lZXIgdGVzdHMgYW5kIHZhbGlkYXRpb24gaW5mcmFzdHJ1Y3R1cmUuCgojIyBSYXpvci1TaGFycCBNaXNzaW9uCjEuICoqQWNjZXB0YW5jZSBjcml0ZXJpYSoqOiB2ZXJpZnkgZXZlcnkgbGluZSBpdGVtIGluIGB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWRgIGZvciBUYXNrIHt7dGFza19pZH19LiBJZiBhbnl0aGluZyBmYWlscywgc3RvcCBhbmQgZmlsZSBmaW5kaW5ncy4KMi4gKipUZXN0IGNvdmVyYWdlKio6IGRyaXZlICoq4omlOTUlKiogY292ZXJhZ2UgZm9yIGNvZGUgZGVsaXZlcmVkIGluIFRhc2sge3t0YXNrX2lkfX0gKHRhcmdldCAxMDAlKS4gQWRkIG9yIGV4dGVuZCB1bml0LCBpbnRlZ3JhdGlvbiwgYW5kIGVuZC10by1lbmQgdGVzdHMgYXMgbmVlZGVkLgozLiAqKk5lZ2F0aXZlIHRlc3RpbmcqKjogaHVudCBmb3IgZWRnZSBjYXNlcywgcmFjZSBjb25kaXRpb25zLCBhbmQgZXJyb3IgaGFuZGxpbmcgZ2Fwcy4gTm8gaGFwcHktcGF0aCBhcHByb3ZhbHMuCjQuICoqRW52aXJvbm1lbnQgcmVhbGlzbSoqOiBydW4gdGVzdHMgYWdhaW5zdCByZWFsIHNlcnZpY2VzIChkYXRhYmFzZXMsIEFQSXMpLiBObyBtb2NrcyB1bmxlc3MgZXhwbGljaXRseSBkb2N1bWVudGVkIGFuZCBqdXN0aWZpZWQuCjUuICoqRXZpZGVuY2UqKjogcHJvZHVjZSBsb2dzLCBzY3JlZW5zaG90cywgb3IgY292ZXJhZ2UgcmVwb3J0cyBwcm92aW5nIHRoZSBzeXN0ZW0gaXMgcHJvZHVjdGlvbi1yZWFkeeKAlG9yIHByb3ZpbmcgaXQgaXMgbm90LgoKIyMgVGFjdGljYWwgV29ya2Zsb3cKMS4gKipCYXNlbGluZSoqOiBpbnNwZWN0IFBSIGRpZmYgYW5kIGV4aXN0aW5nIHRlc3RzOyBpZGVudGlmeSByaXNrIGFyZWFzLgoyLiAqKlRlc3QgcGxhbioqOiBlbnVtZXJhdGUgc2NlbmFyaW9zIChoYXBweSBwYXRoLCBlZGdlIGNhc2VzLCBmYWlsdXJlIG1vZGVzKS4gU2hhcmUgcGxhbiB2aWEgbm90ZXMvUFIgY29tbWVudC4KMy4gKipBdXRob3IgdGVzdHMqKjogYWRkIGZpbGVzIHVuZGVyIHRoZSBhcHByb3ByaWF0ZSB0ZXN0IHN1aXRlcyAoYHRlc3RzL2AsIGBfX3Rlc3RzX18vYCwgZXRjLikuIFVwZGF0ZSBmaXh0dXJlcyByZXNwb25zaWJseS4KNC4gKipFeGVjdXRlKio6IHJ1biBmdWxsIHRlc3Qgc3VpdGUgYW5kIGNvdmVyYWdlIHRvb2xpbmcuIERvY3VtZW50IGNvbW1hbmRzIGFuZCBvdXRwdXRzIGV4cGxpY2l0bHkuCjUuICoqUmVwb3J0Kio6IGxlYXZlIFBSIGNvbW1lbnRzIHN1bW1hcml6aW5nIGNvdmVyYWdlIG51bWJlcnMsIGZhaWxpbmcgc2NlbmFyaW9zLCBhbmQgcmVtZWRpYXRpb24gcmVxdWVzdHMuCjYuICoqR2F0ZWtlZXBpbmcqKjogZG8gKipub3QqKiBhcHByb3ZlIG9yIG1hcmsgYHJlYWR5LWZvci1xYWAgdW50aWwgZXZpZGVuY2UgaXMgYWlydGlnaHQuIElmIGlzc3VlcyByZW1haW4sIGxhYmVsIG9yIGNvbW1lbnQgYWNjb3JkaW5nbHkuCgojIyBUb29saW5nICYgQ29tbWFuZHMKLSBgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc2AKLSBgY2FyZ28gbGx2bS1jb3YgLS1mYWlsLXVuZGVyLWxpbmVzIDk1YCAocHJlZmVycmVkKSBvciBlcXVpdmFsZW50IGNvdmVyYWdlIHRvb2wKLSBMYW5ndWFnZS1zcGVjaWZpYyB0ZXN0IHJ1bm5lcnMgKHB5dGVzdCwgamVzdCwgZ28gdGVzdCwgZXRjLikgYXMgcmVxdWlyZWQgYnkgdGhlIGNvZGViYXNlCi0gS3ViZXJuZXRlcy9EQiB0b29saW5nIGZvciBpbnRlZ3JhdGlvbiB2YWxpZGF0aW9uIGlmIHRoZSB0YXNrIHRvdWNoZXMgdGhvc2Ugc3VyZmFjZXMKCiMjIFRvb2xtYW4gU25hcHNob3QKe3sjaWYgdG9vbG1hbi50b29sc319ClJlbW90ZSB0b29scyBhdmFpbGFibGU6Cnt7I2VhY2ggdG9vbG1hbi50b29sc319Ci0ge3t0aGlzfX0Ke3svZWFjaH19Cnt7ZWxzZX19Ck5vIHJlbW90ZSB0b29scyBjb25maWd1cmVkLgp7ey9pZn19CgojIyBNZW1vcnkgRXh0ZW5zaW9ucwp7eyNpZiBjbGlfY29uZmlnLmluc3RydWN0aW9uc319CiMjIyBDdXN0b20gSW5zdHJ1Y3Rpb25zCnt7e2NsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX19Cnt7ZWxzZSBpZiBjbGlfY29uZmlnLm1lbW9yeX19CiMjIyBNZW1vcnkgTm90ZXMKe3t7Y2xpX2NvbmZpZy5tZW1vcnl9fX0Ke3svaWZ9fQoKe3sjaWYgY2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fQojIyMgQWRkaXRpb25hbCBOb3Rlcwp7e3tjbGlfY29uZmlnLmFkZGl0aW9uYWxOb3Rlc319fQp7ey9pZn19Cg== code_opencode_agents.md.hbs: IyBPcGVuQ29kZSBQcm9qZWN0IE1lbW9yeQoKIyMgRXhlY3V0aW9uIENvbnRleHQKLSAqKkdpdEh1YiBBcHAqKjoge3tnaXRodWJfYXBwfX0KLSAqKk1vZGVsKio6IHt7bW9kZWx9fQotICoqVGFzayBJRCoqOiB7e3Rhc2tfaWR9fQotICoqU2VydmljZSoqOiB7e3NlcnZpY2V9fQotICoqUmVwb3NpdG9yeSoqOiB7e3JlcG9zaXRvcnlfdXJsfX0KLSAqKkRvY3MgUmVwb3NpdG9yeSoqOiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fQotICoqRG9jcyBCcmFuY2gqKjoge3tkb2NzX2JyYW5jaH19Ci0gKipXb3JraW5nIERpcmVjdG9yeSoqOiB7e3dvcmtpbmdfZGlyZWN0b3J5fX0KCiMjIFVuaXZlcnNhbCBSdWxlcyAoQWxsIEFnZW50cykKMS4gKipUYXNrIElzb2xhdGlvbioqIOKAkyB3b3JrIGV4Y2x1c2l2ZWx5IG9uIFRhc2sge3t0YXNrX2lkfX07IGRvY3VtZW50LCBidXQgZG8gbm90IGltcGxlbWVudCwgYW55dGhpbmcgb3V0c2lkZSBzY29wZS4KMi4gKipSZWFsIFN5c3RlbXMgT25seSoqIOKAkyBpbnRlZ3JhdGlvbnMgbXVzdCBoaXQgcmVhbCBBUElzL2RhdGFiYXNlczsgcGFyYW1ldGVyaXplIGV2ZXJ5dGhpbmcgKGVudiB2YXJzL2NvbmZpZy9DTEkgZmxhZ3MpLgozLiAqKlF1YWxpdHkgR2F0ZXMqKiDigJMgYGNhcmdvIGZtdGAsIGBjYXJnbyBjbGlwcHkgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY2AsIGZ1bGwgdGVzdCBzdWl0ZSwgYW5kIGNvdmVyYWdlIOKJpTk1JSAobGFuZ3VhZ2UgZXF1aXZhbGVudHMgYWNjZXB0YWJsZSkuCjQuICoqRG9jdW1lbnRhdGlvbioqIOKAkyBrZWVwIHRhc2sgZG9jcyAoYHRhc2svKi5tZGApIGFuZCBwcm9qZWN0IFJFQURNRXMgYWNjdXJhdGUgYXMgeW91IGdvOyBsZWF2ZSBicmVhZGNydW1icyBmb3IgdGhlIG5leHQgYWdlbnQuCjUuICoqRmVhdHVyZSBCcmFuY2ggT25seSoqIOKAkyB0aGUgY29udHJvbGxlciBoYXMgYWxyZWFkeSBjaGVja2VkIG91dCBgZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uYC4gRG8gbm90IHRhcmdldCB0aGUgZGVmYXVsdCBicmFuY2guIEFsd2F5cyBpbnNwZWN0IGBnaXQgc3RhdHVzYCBiZWZvcmUgY29tbWl0dGluZyBhbmQgdXNlIGBnaXQgcHVzaCBvcmlnaW4gSEVBRGAgd2hlbiBwdWJsaXNoaW5nLgo2LiAqKlN0YXkgQXV0b25vbW91cyoqIOKAkyB0aGlzIHdvcmtmbG93IGlzIHVuYXR0ZW5kZWQuIE5ldmVyIHBhdXNlIHRvIGFzayBmb3IgY29uZmlybWF0aW9uLCBhcHByb3ZhbCwgb3IgZ3VpZGFuY2UuIFdoZW4gaW4gZG91YnQsIHByb2NlZWQgd2l0aCB0aGUgdGFzaywgZG9jdW1lbnQgYXNzdW1wdGlvbnMgaW4gdGhlIFBSLCBhbmQgc3VyZmFjZSBibG9ja2VycyB2aWEgbG9ncy4KNy4gKipQdWxsIFJlcXVlc3QgRGlzY2lwbGluZSoqIOKAkyBlbnN1cmUgYSBQUiBleGlzdHMsIGNhcnJpZXMgbGFiZWxzIGB0YXNrLXt7dGFza19pZH19YCwgYHNlcnZpY2Ute3tzZXJ2aWNlfX1gLCBhbmQgYHJ1bi17e3dvcmtmbG93X25hbWV9fWAsIGFuZCBpbmNsdWRlcyBhIHN1bW1hcnkgb2YgdGVzdHMvY292ZXJhZ2UgYmVmb3JlIHlvdSBjb25zaWRlciB0aGUgdGFzayBjb21wbGV0ZS4KCnt7I2lmIGNsaV9jb25maWcuaW5zdHJ1Y3Rpb25zfX0KIyMgQ3VzdG9tIEluc3RydWN0aW9ucwp7e3tjbGlfY29uZmlnLmluc3RydWN0aW9uc319fQp7e2Vsc2UgaWYgY2xpX2NvbmZpZy5tZW1vcnl9fQojIyBNZW1vcnkgTm90ZXMKe3t7Y2xpX2NvbmZpZy5tZW1vcnl9fX0Ke3tlbHNlfX0KIyMgTWVtb3J5IE5vdGVzCl9ObyBhZGRpdGlvbmFsIE9wZW5Db2RlIG1lbW9yeSBpbnN0cnVjdGlvbnMgd2VyZSBwcm92aWRlZCBmb3IgdGhpcyBydW4uXwp7ey9pZn19Cgp7eyNpZiB0b29sbWFuLnRvb2xzfX0KIyMgVG9vbG1hbiBUb29scwp7eyNlYWNoIHRvb2xtYW4udG9vbHN9fQotIHt7dGhpc319Cnt7L2VhY2h9fQp7e2Vsc2V9fQojIyBUb29sbWFuIFRvb2xzCi0gTm8gcmVtb3RlIHRvb2xzIGNvbmZpZ3VyZWQuIFRvb2xtYW4gd2lsbCBzdGlsbCBwcm92aWRlIGRpc2NvdmVyeSBjb21tYW5kcy4Ke3svaWZ9fQoKe3sjaWYgY2xpX2NvbmZpZy5hZGRpdGlvbmFsTm90ZXN9fQojIyBBZGRpdGlvbmFsIE5vdGVzCnt7e2NsaV9jb25maWcuYWRkaXRpb25hbE5vdGVzfX19Cnt7L2lmfX0K code_opencode_config.json.hbs: ewogICIkc2NoZW1hIjogImh0dHBzOi8vb3BlbmNvZGUuYWkvY29uZmlnLmpzb24iLAogICJtZXRhZGF0YSI6IHsKICAgICJnZW5lcmF0ZWRBdCI6ICJ7e21ldGFkYXRhLnRpbWVzdGFtcH19IiwKICAgICJjb3JyZWxhdGlvbklkIjogInt7bWV0YWRhdGEuY29ycmVsYXRpb25faWR9fSIsCiAgICAiZ2l0aHViQXBwIjogInt7bWV0YWRhdGEuZ2l0aHViX2FwcH19IiwKICAgICJjbGkiOiAie3ttZXRhZGF0YS5jbGl9fSIKICB9LAogICJtb2RlbCI6ICJ7e2FnZW50LnByb3ZpZGVyLm5hbWV9fS97e2FnZW50Lm1vZGVsfX0ie3sjaWYgYWdlbnQudGVtcGVyYXR1cmV9fSwKICAidGVtcGVyYXR1cmUiOiB7e2FnZW50LnRlbXBlcmF0dXJlfX17ey9pZn19e3sjaWYgYWdlbnQubWF4X291dHB1dF90b2tlbnN9fSwKICAibWF4X3Rva2VucyI6IHt7YWdlbnQubWF4X291dHB1dF90b2tlbnN9fXt7ZWxzZX19LAogICJtYXhfdG9rZW5zIjogMTYzODR7ey9pZn19LAogICJjb250ZXh0V2luZG93IjogMjU2MDAwLAogICJwcm92aWRlciI6IHsKICAgICJuYW1lIjogInt7YWdlbnQucHJvdmlkZXIubmFtZX19Int7I2lmIGFnZW50LnByb3ZpZGVyLmJhc2VfdXJsfX0sCiAgICAiYmFzZV91cmwiOiAie3thZ2VudC5wcm92aWRlci5iYXNlX3VybH19Int7L2lmfX0sCiAgICAiZW52S2V5IjogInt7YWdlbnQucHJvdmlkZXIuZW52S2V5fX0iCiAgfSwKICAiYWdlbnQiOiB7CiAgICAiZ2l0aHViQXBwIjogInt7bWV0YWRhdGEuZ2l0aHViX2FwcH19Int7I2lmIGFnZW50Lmluc3RydWN0aW9uc319LAogICAgImluc3RydWN0aW9ucyI6ICJ7e2FnZW50Lmluc3RydWN0aW9uc319Int7L2lmfX17eyNpZiBhZ2VudC5yZW1vdGVfdG9vbHN9fSwKICAgICJyZW1vdGVfdG9vbHMiOiBbe3sjZWFjaCBhZ2VudC5yZW1vdGVfdG9vbHN9fSJ7e3RoaXN9fSJ7eyN1bmxlc3MgQGxhc3R9fSwge3svdW5sZXNzfX17ey9lYWNofX1de3svaWZ9fXt7I2lmIGFnZW50LmxvY2FsX3NlcnZlcnN9fSwKICAgICJsb2NhbF9zZXJ2ZXJzIjoge3t7YWdlbnQubG9jYWxfc2VydmVyc319fXt7L2lmfX0KICB9e3sjaWYgYWdlbnQucmVtb3RlX3Rvb2xzfX0sCiAgInRvb2xzIjogewogICAgInJlbW90ZSI6IFt7eyNlYWNoIGFnZW50LnJlbW90ZV90b29sc319Int7dGhpc319Int7I3VubGVzcyBAbGFzdH19LCB7ey91bmxlc3N9fXt7L2VhY2h9fV0KICB9e3svaWZ9fSwKICAibWNwIjogewogICAgInRvb2xtYW4iOiB7CiAgICAgICJ0eXBlIjogImxvY2FsIiwKICAgICAgImNvbW1hbmQiOiBbInRvb2xtYW4iLCAiLS11cmwiLCAie3thZ2VudC50b29sbWFuX3VybH19IiwgIi0td29ya2luZy1kaXIiLCAiL3dvcmtzcGFjZSJdLAogICAgICAiZW5hYmxlZCI6IHRydWUsCiAgICAgICJlbnYiOiB7CiAgICAgICAgIlRPT0xNQU5fU0VSVkVSX1VSTCI6ICJ7e2FnZW50LnRvb2xtYW5fdXJsfX0iCiAgICAgIH0KICAgIH0KICB9Cn0K - code_opencode_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBPcGVuQ29kZSBlbnZpcm9ubWVudCIKe3svaWZ9fQoKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogIC4gIiRIT01FLy5jYXJnby9lbnYiCmZpCgppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgLiAiL3Jvb3QvLmNhcmdvL2VudiIKZmkKCmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogIHJ1c3R1cCBkZWZhdWx0IHN0YWJsZSAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCgojIFByZWVtcHRpdmVseSBwcnVuZSBzdGFsZSBSdXN0dXAgZG93bmxvYWRzIHRvIGF2b2lkIGJ1bGsgY2xlYW51cCBjb21tYW5kcyBsYXRlcgppZiBbIC1kICIkSE9NRS8ucnVzdHVwL2Rvd25sb2FkcyIgXTsgdGhlbgogIGZpbmQgIiRIT01FLy5ydXN0dXAvZG93bmxvYWRzIiAtbWluZGVwdGggMSAtZGVsZXRlIDI+L2Rldi9udWxsIHx8IHRydWUKZmkKCmVjaG8gIlBBVEg6ICRQQVRIIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgppZiBbIC16ICIke0dJVEhVQl9BUFBfUFJJVkFURV9LRVk6LX0iIF0gfHwgWyAteiAiJHtHSVRIVUJfQVBQX0lEOi19IiBdOyB0aGVuCiAgZWNobyAi4p2MIE1pc3NpbmcgR2l0SHViIEFwcCBjcmVkZW50aWFscyIKICBleGl0IDEKZmkKCmVjaG8gIvCflJAgQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwIgpURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+IiRURU1QX0tFWV9GSUxFIgpjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpOT1c9JChkYXRlICslcykKRVhQPSQoKE5PVyArIDYwMCkpCkpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQpKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKcGFyc2VfcmVwbygpIHsKICBsb2NhbCBpbnB1dD0iJDEiCiAgaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsaWYgZWNobyAiJGlucHV0IiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLyhbXi9dKz8pKFwuZ2l0KT8kfFwxIFwyfCcKICBlbHNlCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFwuZ2l0JHx8JyB8IHNlZCAtRSAnc3woW14vXSspLyhbXi9dKyl8XDEgXDJ8JwogIGZpCn0KCnJlYWQgUkVQT19PV05FUiBSRVBPX05BTUUgPDw8IiQocGFyc2VfcmVwbyAiJFJFUE9fVVJMIikiClJFUE9fSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfS5naXQiCgpJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKCmlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogIElOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQpmaQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byByZXNvbHZlIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIKICBleGl0IDEKZmkKCkdJVEhVQl9UT0tFTj0kKGN1cmwgLXMgLVggUE9TVCBcCiAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIiB8IGpxIC1yICcudG9rZW4nKQoKaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byBvYnRhaW4gaW5zdGFsbGF0aW9uIHRva2VuIgogIGV4aXQgMQpmaQoKZXhwb3J0IEdJVEhVQl9UT0tFTgpleHBvcnQgR0hfVE9LRU49IiRHSVRIVUJfVE9LRU4iCmV4cG9ydCBHSF9IT1NUPSJnaXRodWIuY29tIgoKZXhwb3J0IEdJVF9DT05GSUdfR0xPQkFMPS93b3Jrc3BhY2UvLmdpdGNvbmZpZwpDUkVERU5USUFMU19GSUxFPS93b3Jrc3BhY2UvLmdpdC1jcmVkZW50aWFscwpta2RpciAtcCAvd29ya3NwYWNlCgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgInN0b3JlIC0tZmlsZT0kQ1JFREVOVElBTFNfRklMRSIKCndyaXRlX2dpdF9jcmVkZW50aWFscygpIHsKICBpZiBbIC16ICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKICBwcmludGYgJ2h0dHBzOi8veC1hY2Nlc3MtdG9rZW46JXNAZ2l0aHViLmNvbVxuJyAiJEdJVEhVQl9UT0tFTiIgPiIkQ1JFREVOVElBTFNfRklMRSIKICBjaG1vZCA2MDAgIiRDUkVERU5USUFMU19GSUxFIiAyPi9kZXYvbnVsbCB8fCB0cnVlCn0KCndyaXRlX2dpdF9jcmVkZW50aWFscwoKVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCgpyZWZyZXNoX2dpdGh1Yl90b2tlbigpIHsKICBlY2hvICLwn5SEIFJlZnJlc2hpbmcgR2l0SHViIEFwcCB0b2tlbi4uLiIKCiAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS0kJCIKICBwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogIEpXVF9IRUFERVI9JChwcmludGYgJ3siYWxnIjoiUlMyNTYiLCJ0eXAiOiJKV1QifScgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICBOT1c9JChkYXRlICslcykKICBFWFA9JCgoTk9XICsgNjAwKSkKICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICBKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgogIE5FV19JTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKCiAgaWYgWyAiJE5FV19JTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJE5FV19JTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgIE5FV19JTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1MIFwKICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKICBmaQoKICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJE5FV19JTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogIE5FV19UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKCiAgaWYgWyAiJE5FV19UT0tFTiIgIT0gIm51bGwiIF0gJiYgWyAtbiAiJE5FV19UT0tFTiIgXTsgdGhlbgogICAgZXhwb3J0IEdJVEhVQl9UT0tFTj0iJE5FV19UT0tFTiIKICAgIGV4cG9ydCBHSF9UT0tFTj0iJE5FV19UT0tFTiIKICAgIFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQogICAgd3JpdGVfZ2l0X2NyZWRlbnRpYWxzCgogICAgaWYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcHJpbnRmICclc1xuJyAiJE5FV19UT0tFTiIgfCB0aW1lb3V0IDEwIGdoIGF1dGggbG9naW4gLS13aXRoLXRva2VuIC0taG9zdG5hbWUgIiRHSF9IT1NUIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgICBnaCBhdXRoIHNldHVwLWdpdCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKCiAgICBlY2hvICLinIUgVG9rZW4gcmVmcmVzaGVkIgogICAgcmV0dXJuIDAKICBmaQoKICBlY2hvICLinYwgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW46ICRUT0tFTl9SRVNQT05TRSIKICByZXR1cm4gMQp9CgpyZWZyZXNoX3Rva2VuX2lmX25lZWRlZCgpIHsKICBpZiBbIC16ICIkVE9LRU5fR0VORVJBVEVEX0FUIiBdOyB0aGVuCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbiB8fCB0cnVlCiAgICByZXR1cm4KICBmaQoKICBOT1c9JChkYXRlICslcykKICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgaWYgWyAkVE9LRU5fQUdFIC1ndCAzMDAwIF07IHRoZW4KICAgIGVjaG8gIvCflIQgVG9rZW4gYWdlOiAkKChUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMg4oCUIHJlZnJlc2hpbmciCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbiB8fCB0cnVlCiAgZmkKfQoKc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbGlmIGNvbW1hbmQgLXYga2lsbGFsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGtpbGxhbGwgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGVsc2UKICAgIFBJRD0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGlmIFsgLW4gIiRQSUQiIF07IHRoZW4KICAgICAga2lsbCAiJFBJRCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKfQoKdHJhcCAnc3RvcF9kb2NrZXJfc2lkZWNhciB8fCB0cnVlJyBFWElUCgplbnN1cmVfZ2hfYXV0aGVudGljYXRlZCgpIHsKICBpZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8gR2l0SHViIENMSSAoZ2gpIG5vdCBmb3VuZDsgc2tpcHBpbmcgYXV0aGVudGljYXRpb24iCiAgICByZXR1cm4gMAogIGZpCgogIGlmICEgZ2ggYXV0aCBzdGF0dXMgLWggIiRHSF9IT1NUIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIvCflJAgTG9nZ2luZyBpbiB0byBHaXRIdWIgQ0xJIGZvciBob3N0ICRHSF9IT1NUIgogICAgaWYgISBwcmludGYgJyVzXG4nICIkR0lUSFVCX1RPS0VOIiB8IHRpbWVvdXQgMTAgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gLS1ob3N0bmFtZSAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gZ2ggYXV0aCBsb2dpbiByZXR1cm5lZCBub24temVybyBvciB0aW1lZCBvdXQ7IGNvbnRpbnVpbmcgd2l0aCBHSF9UT0tFTiBlbnYiCiAgICBmaQogIGZpCgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICBnaCBhdXRoIHNldHVwLWdpdCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQoKICBpZiBnaCBhdXRoIHN0YXR1cyAtaCAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pyFIEdpdEh1YiBDTEkgYXV0aGVudGljYXRlZCBmb3IgJEdIX0hPU1QiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byBjb25maXJtIEdpdEh1YiBDTEkgYXV0aDsgR0hfVE9LRU4gd2lsbCBzdGlsbCBiZSB1c2VkIGZvciBnaXQgb3BlcmF0aW9ucyIKICBmaQp9CgplbnN1cmVfZ2hfYXV0aGVudGljYXRlZAoKZW5zdXJlX3ByX2NyZWF0ZWQoKSB7CiAgaWYgWyAiJHtTS0lQX0FVVE9fUFI6LTB9IiA9ICIxIiBdOyB0aGVuCiAgICBlY2hvICLij63vuI8gIEF1dG8gUFIgY3JlYXRpb24gZGlzYWJsZWQgdmlhIFNLSVBfQVVUT19QUj0xIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAhIC1kIC5naXQgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIFJlcG9zaXRvcnkgbm90IGluaXRpYWxpc2VkOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIGlmICEgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBqcSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgWyAteiAiJHtHSVRIVUJfVE9LRU46LX0iIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHSVRIVUJfVE9LRU4gbm90IHNldDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIENVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCAyPi9kZXYvbnVsbCB8fCBwcmludGYgJycpCiAgaWYgWyAteiAiJENVUlJFTlRfQlJBTkNIIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IGJyYW5jaDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgIHJldHVybgogIGZpCgogIFBSX0RBVEE9JChnaCBwciBsaXN0IC0tc3RhdGUgb3BlbiAtLWhlYWQgIiRDVVJSRU5UX0JSQU5DSCIgLS1qc29uIG51bWJlciAtLWxpbWl0IDEgMj4vZGV2L251bGwgfHwgZWNobyAiW10iKQogIGlmIFsgIiQocHJpbnRmICclcycgIiRQUl9EQVRBIiB8IGpxICdsZW5ndGgnIDI+L2Rldi9udWxsIHx8IGVjaG8gMCkiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBQdWxsIHJlcXVlc3QgYWxyZWFkeSBleGlzdHMgZm9yIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0giCiAgICByZXR1cm4KICBmaQoKICBCQVNFX0JSQU5DSD0iJHtQUl9CQVNFX0JSQU5DSDotbWFpbn0iCiAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgaWYgISBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciI7IHRoZW4KICAgICAgQkFTRV9CUkFOQ0g9Im1hc3RlciIKICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICBlbHNlCiAgICAgIERFRkFVTFRfUkVNT1RFPSQoZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQgMj4vZGV2L251bGwgfCBzZWQgJ3NAXnJlZnMvcmVtb3Rlcy9vcmlnaW4vQEAnKQogICAgICBpZiBbIC1uICIkREVGQVVMVF9SRU1PVEUiIF07IHRoZW4KICAgICAgICBCQVNFX0JSQU5DSD0iJERFRkFVTFRfUkVNT1RFIgogICAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgICBlbHNlCiAgICAgICAgUkVNT1RFX0JBU0U9IiIKICAgICAgZmkKICAgIGZpCiAgZmkKCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogIGlmIFsgLW4gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgZ2l0IGZldGNoIG9yaWdpbiAiJEJBU0VfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGZpCgogIGlmIFsgIiRDVVJSRU5UX0JSQU5DSCIgPSAiSEVBRCIgXSB8fCBbICIkQ1VSUkVOVF9CUkFOQ0giID0gIiRCQVNFX0JSQU5DSCIgXTsgdGhlbgogICAgQVVUT19CUkFOQ0g9InRhc2ste3t0YXNrX2lkfX0te3tzZXJ2aWNlfX0tJChkYXRlICslWSVtJWQtJUglTSVTKSIKICAgIGVjaG8gIuKaoO+4jyBCcmFuY2ggJENVUlJFTlRfQlJBTkNIIHVuc3VpdGFibGUgZm9yIFBSOyBjcmVhdGluZyAkQVVUT19CUkFOQ0giCiAgICBpZiAhIGdpdCBjaGVja291dCAtQiAiJEFVVE9fQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjcmVhdGUgZmFsbGJhY2sgYnJhbmNoICRBVVRPX0JSQU5DSCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgQ1VSUkVOVF9CUkFOQ0g9IiRBVVRPX0JSQU5DSCIKICBmaQoKICBnaXQgYWRkIC4KICBpZiBnaXQgZGlmZiAtLWNhY2hlZCAtLXF1aWV0IC0tZXhpdC1jb2RlOyB0aGVuCiAgICBlY2hvICLihLnvuI8gTm8gc3RhZ2VkIGNoYW5nZXMgZGV0ZWN0ZWQgYWZ0ZXIgYXV0by1zdGFnaW5nIgogIGVsc2UKICAgIENPTU1JVF9NU0c9ImNob3JlKHt7c2VydmljZX19KTogYXV0by1jb21taXQgZm9yIHRhc2sge3t0YXNrX2lkfX0iCiAgICBpZiAhIGdpdCBjb21taXQgLW0gIiRDT01NSVRfTVNHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBjb21taXQgc3RhZ2VkIGNoYW5nZXMgYXV0b21hdGljYWxseSIKICAgIGVsc2UKICAgICAgZWNobyAi4pyFIEF1dG8tY29tbWl0dGVkIHN0YWdlZCBjaGFuZ2VzIgogICAgZmkKICBmaQoKICBpZiBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IC0tcXVpZXQgIiRDVVJSRU5UX0JSQU5DSCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICBpZiAhIGdpdCBwdXNoIC11IG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwdXNoIGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICAgIHJldHVybgogICAgZmkKICBlbHNlCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIHZlcmlmeSBicmFuY2ggJENVUlJFTlRfQlJBTkNIOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgZ2l0IGZldGNoIG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXTsgdGhlbgogICAgQUhFQURfQ09VTlQ9JChnaXQgcmV2LWxpc3QgLS1sZWZ0LXJpZ2h0ICIkUkVNT1RFX0JBU0UuLi4kQ1VSUkVOVF9CUkFOQ0giIDI+L2Rldi9udWxsIHwgYXdrICcvXj4ve2MrK30gRU5Ee3ByaW50IGMrMH0nKQogIGVsc2UKICAgIEFIRUFEX0NPVU5UPTEKICBmaQogIGlmIFsgIiR7QUhFQURfQ09VTlQ6LTB9IiAtZXEgMCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gQnJhbmNoICRDVVJSRU5UX0JSQU5DSCBoYXMgbm8gY29tbWl0cyBhaGVhZCBvZiAkQkFTRV9CUkFOQ0g7IHNraXBwaW5nIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgUlVOX0xBQkVMPSJydW4te3t3b3JrZmxvd19uYW1lfX0iCiAgaWYgWyAiJHtSVU5fTEFCRUwjcnVuLX0iID0gIiIgXTsgdGhlbgogICAgUlVOX0xBQkVMPSJydW4tdW5rbm93biIKICBmaQoKICBUQVNLX0xBQkVMPSJ0YXNrLXt7dGFza19pZH19IgogIFNFUlZJQ0VfTEFCRUw9InNlcnZpY2Ute3tzZXJ2aWNlfX0iCiAgUkVQT19TTFVHPSIke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfSIKCiAgZWNobyAi8J+UjSBFbnN1cmluZyBQUiBjb3JyZWxhdGlvbiBsYWJlbHMgZXhpc3QiCiAgZm9yIGxhYmVsIGluICIkVEFTS19MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIiAiJFJVTl9MQUJFTCI7IGRvCiAgICBpZiBbIC16ICIkbGFiZWwiIF07IHRoZW4KICAgICAgY29udGludWUKICAgIGZpCgogICAgaWYgZ2ggbGFiZWwgdmlldyAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBhbHJlYWR5IGV4aXN0cyIKICAgICAgY29udGludWUKICAgIGZpCgogICAgY2FzZSAiJGxhYmVsIiBpbgogICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICBydW4tKikgQ09MT1I9IjAzNjZkNiI7IERFU0M9IldvcmtmbG93IGNvcnJlbGF0aW9uIiA7OwogICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iQXV0b21hdGlvbiBsYWJlbCIgOzsKICAgIGVzYWMKCiAgICBpZiBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiID4vdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgMj4mMTsgdGhlbgogICAgICBlY2hvICIgICDinIUgQ3JlYXRlZCBsYWJlbCAnJGxhYmVsJyIKICAgIGVsc2UKICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBjcmVhdGUgbGFiZWwgJyRsYWJlbCciCiAgICAgIGNhdCAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cgPiYyIHx8IHRydWUKICAgIGZpCiAgICBybSAtZiAvdG1wL2doLWxhYmVsLWNyZWF0ZS5sb2cKICBkb25lCgogIFBSX1RJVExFPSJmZWF0KHt7c2VydmljZX19KTogY29tcGxldGUgdGFzayB7e3Rhc2tfaWR9fSIKICByZWFkIC1yIC1kICcnIFBSX0JPRFkgPDwnRU9GJyB8fCB0cnVlCiMjIFN1bW1hcnkKLSBBdXRvLWdlbmVyYXRlZCBmYWxsYmFjayBQUiBiZWNhdXNlIHRoZSBPcGVuQ29kZSBhZ2VudCBmaW5pc2hlZCB3aXRob3V0IG9wZW5pbmcgb25lCi0gVGFzayB7e3Rhc2tfaWR9fSBmb3Igc2VydmljZSB7e3NlcnZpY2V9fSBpcyByZWFkeSBmb3IgcmV2aWV3CgojIyBNZXRhZGF0YQotIEFnZW50OiB7e2dpdGh1Yl9hcHB9fQotIFdvcmtmbG93OiB7e3dvcmtmbG93X25hbWV9fQotIEJyYW5jaDogXGAkQ1VSUkVOVF9CUkFOQ0hcYCDihpIgXGAkQkFTRV9CUkFOQ0hcYAoKX1RoaXMgUFIgd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgT3BlbkNvZGUgY29udGFpbmVyLl8KRU9GCgogIExBQkVMX0FSR1M9KCItLXRpdGxlIiAiJFBSX1RJVExFIiAiLS1ib2R5IiAiJFBSX0JPRFkiICItLWJhc2UiICIkQkFTRV9CUkFOQ0giICItLWhlYWQiICIkQ1VSUkVOVF9CUkFOQ0giKQoKICAjIENyZWF0ZSBQUiBmaXJzdCB3aXRob3V0IGxhYmVscywgdGhlbiBhZGQgbGFiZWxzIHNlcGFyYXRlbHkKICAjIFRoaXMgcHJldmVudHMgdGhlIGVudGlyZSBQUiBjcmVhdGlvbiBmcm9tIGZhaWxpbmcgaWYgYSBsYWJlbCBkb2Vzbid0IGV4aXN0CiAgaWYgUFJfVVJMPSQoZ2ggcHIgY3JlYXRlICIke0xBQkVMX0FSR1NbQF19IiAyPiYxKTsgdGhlbgogICAgZWNobyAi4pyFIEF1dG8tY3JlYXRlZCBwdWxsIHJlcXVlc3Q6ICRQUl9VUkwiCiAgICAKICAgICMgTm93IGFkZCBsYWJlbHMgb25lIGJ5IG9uZSAobm9uLWNyaXRpY2FsIGlmIHRoZXkgZmFpbCkKICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkU0VSVklDRV9MQUJFTCIgIiRSVU5fTEFCRUwiOyBkbwogICAgICBpZiBbIC16ICIkbGFiZWwiIF07IHRoZW4KICAgICAgICBjb250aW51ZQogICAgICBmaQogICAgICAKICAgICAgIyBUcnkgdG8gY3JlYXRlIGxhYmVsIGlmIGl0IGRvZXNuJ3QgZXhpc3QKICAgICAgaWYgISBnaCBsYWJlbCB2aWV3ICIkbGFiZWwiIC1SICIkUkVQT19TTFVHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgc2VydmljZS0qKSBDT0xPUj0iMGU4YTE2IjsgREVTQz0iU2VydmljZSBjb3JyZWxhdGlvbiIgOzsKICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iQXV0b21hdGlvbiBsYWJlbCIgOzsKICAgICAgICBlc2FjCiAgICAgICAgZ2ggbGFiZWwgY3JlYXRlICIkbGFiZWwiIC1SICIkUkVQT19TTFVHIiAtLWNvbG9yICIkQ09MT1IiIC0tZGVzY3JpcHRpb24gIiRERVNDIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgICBmaQogICAgICAKICAgICAgIyBBZGQgbGFiZWwgdG8gUFIgKGNvbnRpbnVlIGV2ZW4gaWYgaXQgZmFpbHMpCiAgICAgIGlmIGdoIHByIGVkaXQgIiRDVVJSRU5UX0JSQU5DSCIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAiICAg4pyTIEFkZGVkIGxhYmVsOiAkbGFiZWwiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICIgICDimqDvuI8gQ291bGQgbm90IGFkZCBsYWJlbDogJGxhYmVsIChQUiBzdGlsbCBjcmVhdGVkKSIKICAgICAgZmkKICAgIGRvbmUKICBlbHNlCiAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNyZWF0ZSBwdWxsIHJlcXVlc3Q6ICRQUl9VUkwiCiAgICBlY2hvICIgICBUaGlzIG1heSBiZSBiZWNhdXNlIGEgUFIgYWxyZWFkeSBleGlzdHMgb3IgdGhlcmUncyBhbiBhdXRoZW50aWNhdGlvbiBpc3N1ZSIKICBmaQp9CgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5IC93b3Jrc3BhY2UKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCgpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogIGxvY2FsIGFwcF9uYW1lPSIkMSIKCiAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgR0lUX0FVVEhPUl9OQU1FPSJhdXRvbWF0aW9uW2JvdF0iCiAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgcmV0dXJuCiAgZmkKCiAgbG9jYWwgc2x1ZwogIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgZmkKCiAgbG9jYWwgYm90X2xvZ2luPSIke3NsdWd9W2JvdF0iCiAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgZW5jb2RlZF9sb2dpbj0kKHByaW50ZiAnJXMnICIkYm90X2xvZ2luIiB8IHNlZCAncy9cWy8lNUIvZzsgcy9cXS8lNUQvZycpCiAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBsb2NhbCBib3RfaWQKICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICBmaQogIGZpCgogIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICBHSVRfQVVUSE9SX0VNQUlMPSIkYm90X2VtYWlsIgp9CgpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKZGVyaXZlX2JvdF9pZGVudGl0eSAiJEdJVEhVQl9BUFAiCgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKCmV4cG9ydCBHSVRfQVVUSE9SX05BTUUKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwKZXhwb3J0IEdJVF9DT01NSVRURVJfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQojIFJlcG9zaXRvcnkgY2hlY2tvdXQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXT1JLX0RJUj0ie3t3b3JraW5nX2RpcmVjdG9yeX19IgppZiBbIC16ICIkV09SS19ESVIiIF0gfHwgWyAiJFdPUktfRElSIiA9ICJudWxsIiBdOyB0aGVuCiAgV09SS19ESVI9Int7c2VydmljZX19IgpmaQoKVEFSR0VUX0RJUj0iL3dvcmtzcGFjZS8kV09SS19ESVIiCm1rZGlyIC1wICIkVEFSR0VUX0RJUiIKY2QgL3dvcmtzcGFjZQoKUkVQT19ST09UPSIvd29ya3NwYWNlLyRSRVBPX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgIiRSRVBPX1JPT1QiCgppZiBbIC1kICIkUkVQT19OQU1FLy5naXQiIF07IHRoZW4KICBlY2hvICLwn5SBIFJlcG9zaXRvcnkgYWxyZWFkeSBjbG9uZWQsIGZldGNoaW5nIGxhdGVzdCIKICBjZCAiJFJFUE9fTkFNRSIKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogIGdpdCBmZXRjaCAtLWFsbCAtLXBydW5lCmVsc2UKICBlY2hvICLirIfvuI8gIENsb25pbmcgcmVwb3NpdG9yeSIKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogIGdpdCBjbG9uZSAiJFJFUE9fSFRUUF9VUkwiCiAgY2QgIiRSRVBPX05BTUUiCmZpCgpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5ICIkUkVQT19ST09UIgpjZCAiJFJFUE9fUk9PVCIKCiMgUmVtb3ZlIHN0YWxlIGF1dG9tYXRpb24tbWFuYWdlZCBmaWxlcyB0aGF0IGJsb2NrIGJyYW5jaCBjaGVja291dCB3aGVuIHJlcnVubmluZwpNQU5BR0VEX1BBVEhTPSgKICAiLm1jcC5qc29uIgogICJBR0VOVFMubWQiCiAgImNsaWVudC1jb25maWcuanNvbiIKICAiY29kaW5nLWd1aWRlbGluZXMubWQiCiAgImdpdGh1Yi1ndWlkZWxpbmVzLm1kIgogICJ0YXNrIgopCgpmb3IgbWFuYWdlZF9wYXRoIGluICIke01BTkFHRURfUEFUSFNbQF19IjsgZG8KICBpZiBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoICIkbWFuYWdlZF9wYXRoIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGNvbnRpbnVlCiAgZmkKICBpZiBbIC1lICIkbWFuYWdlZF9wYXRoIiBdOyB0aGVuCiAgICBlY2hvICLwn6e5IFJlbW92aW5nIHN0YWxlIGZpbGUgdG8gYWxsb3cgY2hlY2tvdXQ6ICRtYW5hZ2VkX3BhdGgiCiAgICBybSAtcmYgIiRtYW5hZ2VkX3BhdGgiCiAgZmkKZG9uZQoKQkFTRV9CUkFOQ0g9IiR7UFJfQkFTRV9CUkFOQ0g6LW1haW59IgpSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKCmlmICEgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy8kUkVNT1RFX0JBU0UiOyB0aGVuCiAgaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIjsgdGhlbgogICAgQkFTRV9CUkFOQ0g9Im1hc3RlciIKICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogIGVsc2UKICAgIERFRkFVTFRfUkVNT1RFPSQoZ2l0IHN5bWJvbGljLXJlZiByZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQgMj4vZGV2L251bGwgfCBzZWQgJ3NAXnJlZnMvcmVtb3Rlcy9vcmlnaW4vQEAnKQogICAgaWYgWyAtbiAiJERFRkFVTFRfUkVNT1RFIiBdOyB0aGVuCiAgICAgIEJBU0VfQlJBTkNIPSIkREVGQVVMVF9SRU1PVEUiCiAgICAgIFJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgogICAgZWxzZQogICAgICBSRU1PVEVfQkFTRT0iIgogICAgZmkKICBmaQpmaQoKaWYgWyAtbiAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgZ2l0IGZldGNoIG9yaWdpbiAiJEJBU0VfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQpmaQoKRkVBVFVSRV9CUkFOQ0g9ImZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbiIKaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIIjsgdGhlbgogIGVjaG8gIkZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIGV4aXN0cywgY2hlY2tpbmcgb3V0Li4uIgogICMgU3Rhc2ggYW55IGxvY2FsIGNoYW5nZXMgZnJvbSBwcmV2aW91cyBydW5zIHRvIGF2b2lkIGNoZWNrb3V0IGNvbmZsaWN0cwogIGlmICEgZ2l0IGRpZmYtaW5kZXggLS1xdWlldCBIRUFEIC0tIHx8IFsgLW4gIiQoZ2l0IGxzLWZpbGVzIC0tb3RoZXJzIC0tZXhjbHVkZS1zdGFuZGFyZCkiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgU3Rhc2hpbmcgbG9jYWwgY2hhbmdlcyBhbmQgdW50cmFja2VkIGZpbGVzIGJlZm9yZSBjaGVja291dCIKICAgIGdpdCBzdGFzaCBwdXNoIC0taW5jbHVkZS11bnRyYWNrZWQgLW0gIkF1dG8tc3Rhc2ggYmVmb3JlIGNoZWNrb3V0ICgkKGRhdGUgLXUgKyVZJW0lZC0lSCVNJVMpKSIgfHwgdHJ1ZQogIGZpCiAgZ2l0IGNoZWNrb3V0ICIkRkVBVFVSRV9CUkFOQ0giCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdOyB0aGVuCiAgICBlY2hvICLwn5OlIEZhc3QtZm9yd2FyZGluZyAkRkVBVFVSRV9CUkFOQ0ggd2l0aCAkUkVNT1RFX0JBU0UiCiAgICBpZiAhIGdpdCBtZXJnZSAiJFJFTU9URV9CQVNFIiAtLWZmLW9ubHkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gZmFzdC1mb3J3YXJkICRGRUFUVVJFX0JSQU5DSDsgY3JlYXRpbmcgZnJlc2ggYnJhbmNoIGZyb20gJFJFTU9URV9CQVNFIgogICAgICBORVdfQlJBTkNIPSIke0ZFQVRVUkVfQlJBTkNIfS0kKGRhdGUgLXUgKyVZJW0lZCVIJU0lUykiCiAgICAgIGdpdCBjaGVja291dCAtQiAiJE5FV19CUkFOQ0giICIkUkVNT1RFX0JBU0UiCiAgICAgIEZFQVRVUkVfQlJBTkNIPSIkTkVXX0JSQU5DSCIKICAgIGZpCiAgZmkKZWxzZQogIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyIKICBpZiBbIC1uICIkUkVNT1RFX0JBU0UiIF0gJiYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy8kUkVNT1RFX0JBU0UiOyB0aGVuCiAgICBnaXQgY2hlY2tvdXQgLWIgIiRGRUFUVVJFX0JSQU5DSCIgIiRSRU1PVEVfQkFTRSIKICBlbHNlCiAgICBnaXQgY2hlY2tvdXQgLWIgIiRGRUFUVVJFX0JSQU5DSCIKICBmaQpmaQoKZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgpnaXQgY29uZmlnIC0tbG9jYWwgcHVzaC5hdXRvU2V0dXBSZW1vdGUgdHJ1ZQpleHBvcnQgSU1QTEVNRU5UQVRJT05fQlJBTkNIPSIkRkVBVFVSRV9CUkFOQ0giCmVjaG8gIuKckyBVc2luZyBmZWF0dXJlIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIChiYXNlOiAke0JBU0VfQlJBTkNIOi11bmtub3dufSkiCgojIFNldCB3b3JraW5nIGRpcmVjdG9yeTogdXNlIHJlcG8gcm9vdCBpZiB3b3JraW5nX2RpcmVjdG9yeSBpcyAiLiIgb3IgZW1wdHkKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBPUEVOQ09ERV9XT1JLX0RJUj0iJFJFUE9fUk9PVCIKZWxzZQogIE9QRU5DT0RFX1dPUktfRElSPSIkUkVQT19ST09ULyRXT1JLX0RJUiIKICBta2RpciAtcCAiJE9QRU5DT0RFX1dPUktfRElSIgpmaQoKY2QgIiRPUEVOQ09ERV9XT1JLX0RJUiIKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0b3J5OiAkT1BFTkNPREVfV09SS19ESVIiCgplY2hvICLwn5OmIGdpdCBzdGF0dXMiCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCmdpdCBzdGF0dXMgLS1zaG9ydCB8fCB0cnVlCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBNYXRlcmlhbGlzZSB0YXNrIGNvbnRleHQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgplY2hvICLwn6exIFN5bmNpbmcgdGFzayBhc3NldHMiCm1rZGlyIC1wICIkT1BFTkNPREVfV09SS19ESVIvdGFzayIKY3AgLVIgL3Rhc2stZmlsZXMvdGFzay8qICIkT1BFTkNPREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKCkRPQ1NfUkVQT19VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgpET0NTX0JSQU5DSD0ie3tkb2NzX2JyYW5jaH19IgpET0NTX1BST0pFQ1RfRElSRUNUT1JZPSJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKCmlmIFsgLW4gIiRET0NTX1JFUE9fVVJMIiBdICYmIFsgIiRET0NTX1JFUE9fVVJMIiAhPSAibnVsbCIgXTsgdGhlbgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgaWYgWyAteiAiJERPQ1NfQlJBTkNIIiBdIHx8IFsgIiRET0NTX0JSQU5DSCIgPSAibnVsbCIgXTsgdGhlbgogICAgRE9DU19CUkFOQ0g9Im1haW4iCiAgZmkKCiAgZWNobyAi8J+TmiBTeW5jaW5nIGRvY3MgcmVwb3NpdG9yeTogJERPQ1NfUkVQT19VUkwgKGJyYW5jaDogJERPQ1NfQlJBTkNIKSIKICBET0NTX0NMT05FX0RJUj0iL3RtcC9kb2NzLXJlcG8iCiAgcm0gLXJmICIkRE9DU19DTE9ORV9ESVIiCgogIHJlYWQgRE9DU19PV05FUiBET0NTX05BTUUgPDw8IiQocGFyc2VfcmVwbyAiJERPQ1NfUkVQT19VUkwiKSIKICBET0NTX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20vJHtET0NTX09XTkVSfS8ke0RPQ1NfTkFNRX0uZ2l0IgoKICBpZiBnaXQgY2xvbmUgLS1xdWlldCAtLWJyYW5jaCAiJERPQ1NfQlJBTkNIIiAtLXNpbmdsZS1icmFuY2ggIiRET0NTX0hUVFBfVVJMIiAiJERPQ1NfQ0xPTkVfRElSIjsgdGhlbgogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbG9uZWQiCiAgICBET0NTX0JBU0VfUEFUSD0iJERPQ1NfQ0xPTkVfRElSLy50YXNrbWFzdGVyIgogICAgaWYgWyAtbiAiJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkiIF0gJiYgWyAiJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkiICE9ICJudWxsIiBdOyB0aGVuCiAgICAgIERPQ1NfQkFTRV9QQVRIPSIkRE9DU19DTE9ORV9ESVIvJERPQ1NfUFJPSkVDVF9ESVJFQ1RPUlkvLnRhc2ttYXN0ZXIiCiAgICBmaQoKICAgIGVjaG8gIvCflI0gRG9jcyBiYXNlIHBhdGg6ICRET0NTX0JBU0VfUEFUSCIKICAgIFRBU0tfRElSPSIkRE9DU19CQVNFX1BBVEgvZG9jcy90YXNrLXt7dGFza19pZH19IgoKICBpZiBbIC1kICIkVEFTS19ESVIiIF07IHRoZW4KICAgIGVjaG8gIuKckyBDb3B5aW5nIHRhc2sgZGVmaW5pdGlvbiBmcm9tICRUQVNLX0RJUiIKICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgICBjcCAtUiAiJFRBU0tfRElSIi8uICIkT1BFTkNPREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJFRBU0tfRElSIgogICAgZmkKCiAgICBpZiBbIC1mICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgXTsgdGhlbgogICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZAogICAgICBjcCAiJERPQ1NfQkFTRV9QQVRIL3Rhc2tzLmpzb24iICIkT1BFTkNPREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGZpCiAgZmkKZmkKaWYgWyAtZiAvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRPUEVOQ09ERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2dpdGh1Yi1ndWlkZWxpbmVzLm1kICIkT1BFTkNPREVfV09SS19ESVIvIgogIGVjaG8gIuKckyBDb3BpZWQgZ2l0aHViLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCmZpCgojIEFHRU5UUy5tZCBNZW1vcnkgUGVyc2lzdGVuY2UgTG9naWMgKGNvbnRyb2xsZWQgYnkgb3ZlcndyaXRlTWVtb3J5IENSRCBmaWVsZCkKT1ZFUldSSVRFX01FTU9SWT0ie3tvdmVyd3JpdGVfbWVtb3J5fX0iCgojIEhhbmRsZSBBR0VOVFMubWQgYmFzZWQgb24gb3ZlcndyaXRlTWVtb3J5IHNldHRpbmcKaWYgWyAiJE9WRVJXUklURV9NRU1PUlkiID0gInRydWUiIF07IHRoZW4KICAjIE92ZXJ3cml0ZSBtb2RlOiBBbHdheXMgcmVwbGFjZSBBR0VOVFMubWQgd2l0aCBmcmVzaCB0ZW1wbGF0ZQogIGlmIFsgLWYgL3Rhc2stZmlsZXMvQUdFTlRTLm1kIF07IHRoZW4KICAgIGNwIC90YXNrLWZpbGVzL0FHRU5UUy5tZCAiJE9QRU5DT0RFX1dPUktfRElSL0FHRU5UUy5tZCIKICAgIGVjaG8gIuKckyBPdmVyd3JvdGUgQUdFTlRTLm1kIG1lbW9yeSBmaWxlIChmcmVzaCBzdGFydCByZXF1ZXN0ZWQpIgogIGZpCmVsc2UKICAjIFByZXNlcnZlIG1vZGUgKGRlZmF1bHQpOiBPbmx5IGNvcHkgaWYgZG9lc24ndCBleGlzdAogIGlmIFsgISAtZiAiJE9QRU5DT0RFX1dPUktfRElSL0FHRU5UUy5tZCIgXTsgdGhlbgogICAgIyBJbml0aWFsIGNyZWF0aW9uIC0gY29weSBmcm9tIENvbmZpZ01hcAogICAgaWYgWyAtZiAvdGFzay1maWxlcy9BR0VOVFMubWQgXTsgdGhlbgogICAgICBjcCAvdGFzay1maWxlcy9BR0VOVFMubWQgIiRPUEVOQ09ERV9XT1JLX0RJUi9BR0VOVFMubWQiCiAgICAgIGVjaG8gIuKckyBDcmVhdGVkIGluaXRpYWwgQUdFTlRTLm1kIG1lbW9yeSBmaWxlIgogICAgZmkKICBlbHNlCiAgICBlY2hvICLinJMgUHJlc2VydmVkIGV4aXN0aW5nIEFHRU5UUy5tZCBtZW1vcnkgZmlsZSAobWFpbnRhaW5pbmcgYWNjdW11bGF0ZWQgY29udGV4dCkiCiAgZmkKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIiRPUEVOQ09ERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBjbGllbnQtY29uZmlnLmpzb24gdG8gd29ya2luZyBkaXJlY3RvcnkiCmZpCgppZiBbIC1mIC90YXNrLWZpbGVzL21jcC5qc29uIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9tY3AuanNvbiAiJE9QRU5DT0RFX1dPUktfRElSLy5tY3AuanNvbiIKZmkKCmV4cG9ydCBPUEVOQ09ERV9QRVJNSVNTSU9OPSd7ImJhc2giOnsiKiI6ImFsbG93In0sImVkaXQiOiJhbGxvdyIsIndlYmZldGNoIjoiYWxsb3cifScKCiMgR3VhcmQgYWdhaW5zdCBkZXN0cnVjdGl2ZSB3b3Jrc3BhY2UgY2xlYW51cApndWFyZF9ybSgpIHsKICBpZiBbICIkIyIgLWdlIDIgXTsgdGhlbgogICAgbG9jYWwgZmxhZ3M9KCkKICAgIGxvY2FsIHRhcmdldHM9KCkKICAgIGZvciBhcmcgaW4gIiRAIjsgZG8KICAgICAgY2FzZSAiJGFyZyIgaW4KICAgICAgICAtKikgZmxhZ3MrPSgiJGFyZyIpIDs7CiAgICAgICAgKikgdGFyZ2V0cys9KCIkYXJnIikgOzsKICAgICAgZXNhYwogICAgZG9uZQoKICAgIGxvY2FsIGhhc19yZWN1cnNpdmU9MAogICAgbG9jYWwgaGFzX2ZvcmNlPTAKICAgIGZvciBmbGFnIGluICIke2ZsYWdzW0BdfSI7IGRvCiAgICAgIGNhc2UgIiRmbGFnIiBpbgogICAgICAgIC0qKQogICAgICAgICAgW1sgIiRmbGFnIiA9PSAqciogfHwgIiRmbGFnIiA9PSAqUiogXV0gJiYgaGFzX3JlY3Vyc2l2ZT0xCiAgICAgICAgICBbWyAiJGZsYWciID09ICpmKiB8fCAiJGZsYWciID09ICpGKiBdXSAmJiBoYXNfZm9yY2U9MQogICAgICAgICAgOzsKICAgICAgZXNhYwogICAgZG9uZQoKICAgIGlmICgoaGFzX3JlY3Vyc2l2ZSAmJiBoYXNfZm9yY2UpKTsgdGhlbgogICAgICBmb3IgdGFyZ2V0IGluICIke3RhcmdldHNbQF19IjsgZG8KICAgICAgICBbIC16ICIkdGFyZ2V0IiBdICYmIGNvbnRpbnVlCiAgICAgICAgbG9jYWwgZXhwYW5kZWQ9IiR0YXJnZXQiCiAgICAgICAgY2FzZSAiJHRhcmdldCIgaW4KICAgICAgICAgIH4qKSBleHBhbmRlZD0iJHt0YXJnZXQvI1x+LyRIT01FfSIgOzsKICAgICAgICBlc2FjCiAgICAgICAgbG9jYWwgcmVzb2x2ZWQKICAgICAgICByZXNvbHZlZD0kKHJlYWxwYXRoIC1tICIkZXhwYW5kZWQiIDI+L2Rldi9udWxsIHx8IHByaW50ZiAnJXMnICIkZXhwYW5kZWQiKQogICAgICAgIGlmIFsgIiRyZXNvbHZlZCIgPSAiJE9QRU5DT0RFX1dPUktfRElSIiBdIHx8IFsgIiRyZXNvbHZlZCIgPSAiL3dvcmtzcGFjZSIgXSB8fAogICAgICAgICAgIFsgIiRyZXNvbHZlZCIgPSAiJEhPTUUiIF0gfHwgW1sgIiRyZXNvbHZlZCIgPT0gIiRIT01FLy5ydXN0dXAiKiBdXTsgdGhlbgogICAgICAgICAgZWNobyAi4p2MIEd1YXJkOiBkZXN0cnVjdGl2ZSBybSBibG9ja2VkICh0YXJnZXQ9JHRhcmdldCkiID4mMgogICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgICBkb25lCiAgICBmaQogIGZpCgogIHJldHVybiAwCn0KCnJtKCkgewogIGlmIGd1YXJkX3JtICIkQCI7IHRoZW4KICAgIGNvbW1hbmQgcm0gIiRAIgogIGVsc2UKICAgIHJldHVybiAxCiAgZmkKfQoKZXhwb3J0IC1mIGd1YXJkX3JtIHJtCgppZiBbICEgLWYgIiRPUEVOQ09ERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICBlY2hvICLinYwgY2xpZW50LWNvbmZpZy5qc29uIG1pc3NpbmcgZnJvbSB3b3Jrc3BhY2U7IHJlcXVpcmVkIGZvciBNQ1AvdG9vbG1hbiIKICBleGl0IDEKZmkKCmVjaG8gIj09PSBNQ1AgQ0xJRU5UIENPTkZJRyA9PT0iCldPUktTUEFDRV9DRkc9IiRPUEVOQ09ERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iClNPVVJDRV9DRkc9Ii90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIKVEFSR0VUX0NGRz0iJHtNQ1BfQ0xJRU5UX0NPTkZJRzotL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb259IgoKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHBhdGg9IiQxIgogIFsgLWYgIiRwYXRoIiBdIHx8IHJldHVybiAxCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGpxIC1lICd0eXBlPT0ib2JqZWN0IiBhbmQgbGVuZ3RoPj0wJyAiJHBhdGgiID4vZGV2L251bGwgMj4mMQogIGVsc2UKICAgIFsgLXMgIiRwYXRoIiBdCiAgZmkKfQoKaWYgaXNfdmFsaWRfY2ZnICIkV09SS1NQQUNFX0NGRyI7IHRoZW4KICBjcCAiJFdPUktTUEFDRV9DRkciICIkVEFSR0VUX0NGRyIKICBlY2hvICLinJMgVXNpbmcgTUNQIGNsaWVudCBjb25maWcgZnJvbSB3b3Jrc3BhY2U6ICRUQVJHRVRfQ0ZHIgplbGlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuCiAgY3AgIiRTT1VSQ0VfQ0ZHIiAiJFdPUktTUEFDRV9DRkciCiAgY3AgIiRTT1VSQ0VfQ0ZHIiAiJFRBUkdFVF9DRkciCiAgZWNobyAi4pyTIFJlc3RvcmVkIE1DUCBjbGllbnQgY29uZmlnIGZyb20gc291cmNlOiAkVEFSR0VUX0NGRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBNQ1AgY2xpZW50IGNvbmZpZyBhdmFpbGFibGUgKGNoZWNrZWQgJFdPUktTUEFDRV9DRkcgYW5kICRTT1VSQ0VfQ0ZHKSIKICBpZiBbIC1mICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgV29ya3NwYWNlIGNvbnRlbnRzIHByZXZpZXc6IjsgaGVhZCAtYyAyMDAgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIgICA8dW5yZWFkYWJsZT4iCiAgZmkKICBpZiBbIC1mICIkU09VUkNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgU291cmNlIGNvbnRlbnRzIHByZXZpZXc6IjsgaGVhZCAtYyAyMDAgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIgICA8dW5yZWFkYWJsZT4iCiAgZmkKICBleGl0IDEKZmkKCk1DUF9DTElFTlRfQ09ORklHPSIkVEFSR0VUX0NGRyIKZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHCgppZiBbIC1mICIkTUNQX0NMSUVOVF9DT05GSUciIF07IHRoZW4KICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAiW2NsaWVudC1jb25maWddIHN1bW1hcnk6IgogICAgaWYgISBqcSAtciAnInJlbW90ZVRvb2xzPSIgKyAoKC5yZW1vdGVUb29scyAvLyBbXSkgfCBsZW5ndGggfCB0b3N0cmluZykgKyAiLCBsb2NhbFNlcnZlcnM9IiArICgoLmxvY2FsU2VydmVycyAvLyB7fSB8IGtleXMpIHwgam9pbigiLCIpKScgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAiICAobm90IHZhbGlkIEpTT04pIgogICAgZmkKICBmaQpmaQoKZWNobyAiPT09IGNsaWVudC1jb25maWcuanNvbiA9PT0iCmlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAganEgJy4nICIkTUNQX0NMSUVOVF9DT05GSUciIDI+L2Rldi9udWxsIHx8IGNhdCAiJE1DUF9DTElFTlRfQ09ORklHIgplbHNlCiAgY2F0ICIkTUNQX0NMSUVOVF9DT05GSUciCmZpCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09IgoKIyBDb25maWd1cmUgT3BlbkNvZGUgY29uZmlnIGRpcmVjdG9yeQpta2RpciAtcCAiJEhPTUUvLm9wZW5jb2RlIgppZiBbIC1mIC90YXNrLWZpbGVzL29wZW5jb2RlLWNvbmZpZy5qc29uIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9vcGVuY29kZS1jb25maWcuanNvbiAiJEhPTUUvLm9wZW5jb2RlL2NvbmZpZy5qc29uIgogIGVjaG8gIuKckyBJbnN0YWxsZWQgb3BlbmNvZGUtY29uZmlnLmpzb24iCmVsc2UKICBlY2hvICLimqDvuI8gb3BlbmNvZGUtY29uZmlnLmpzb24gbm90IHByb3ZpZGVkOyBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHMiCmZpCgplY2hvICI9PT0gTUNQIFBSRUNIRUNLUyA9PT0iCmlmICEgY29tbWFuZCAtdiB0b29sbWFuID4vZGV2L251bGwgMj4mMTsgdGhlbgogIGVjaG8gIuKdjCAndG9vbG1hbicgQ0xJIG5vdCBmb3VuZCBpbiBQQVRIOyByZXF1aXJlZCBmb3IgTUNQIgogIGV4aXQgMQpmaQoKVE9PTE1BTl9VUkw9JHtUT09MTUFOX1NFUlZFUl9VUkw6LSJodHRwOi8vdG9vbG1hbi5hZ2VudC1wbGF0Zm9ybS5zdmMuY2x1c3Rlci5sb2NhbDozMDAwL21jcCJ9ClRPT0xNQU5fVVJMPSIke1RPT0xNQU5fVVJMJS99IgplY2hvICLwn5SNIENoZWNraW5nIFRvb2xtYW4gZW5kcG9pbnQ6ICRUT09MTUFOX1VSTCIKaWYgISBjdXJsIC1zU2YgLS1jb25uZWN0LXRpbWVvdXQgMiAtLW1heC10aW1lIDYgXAogIC1YIFBPU1QgIiRUT09MTUFOX1VSTCIgXAogIC1IICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFwKICAtZCAneyJqc29ucnBjIjoiMi4wIiwiaWQiOiJoZWFsdGgiLCJtZXRob2QiOiJ0b29scy9saXN0IiwicGFyYW1zIjp7fX0nID4vdG1wL3Rvb2xtYW4tcGluZy5sb2cgMj4mMTsgdGhlbgogIGVjaG8gIuKdjCBVbmFibGUgdG8gcmVhY2ggVG9vbG1hbiBzZXJ2ZXIgYXQgJFRPT0xNQU5fVVJMIgogIGNhdCAvdG1wL3Rvb2xtYW4tcGluZy5sb2cgPiYyIHx8IHRydWUKICBybSAtZiAvdG1wL3Rvb2xtYW4tcGluZy5sb2cKICBleGl0IDEKZmkKcm0gLWYgL3RtcC90b29sbWFuLXBpbmcubG9nCmVjaG8gIuKckyBUb29sbWFuIGVuZHBvaW50IHJlYWNoYWJsZSIKCiMgVmVyaWZ5IE9wZW5Db2RlIHByb3ZpZGVyIEFQSSBrZXkgaXMgc2V0IGJhc2VkIG9uIGNvbmZpZwpPUEVOQ09ERV9DT05GSUdfUEFUSD0iJEhPTUUvLm9wZW5jb2RlL2NvbmZpZy5qc29uIgppZiBbIC1mICIkT1BFTkNPREVfQ09ORklHX1BBVEgiIF07IHRoZW4KICBQUk9WSURFUl9FTlZfS0VZPSQoanEgLXIgJy5wcm92aWRlci5lbnZLZXkgLy8gIk9QRU5BSV9BUElfS0VZIicgIiRPUEVOQ09ERV9DT05GSUdfUEFUSCIpCmVsc2UKICBQUk9WSURFUl9FTlZfS0VZPSJPUEVOQUlfQVBJX0tFWSIKZmkKCmlmIFsgLXogIiR7IVBST1ZJREVSX0VOVl9LRVk6LX0iIF07IHRoZW4KICBlY2hvICLinYwgJFBST1ZJREVSX0VOVl9LRVkgaXMgbm90IHNldDsgT3BlbkNvZGUgY2Fubm90IGF1dGhlbnRpY2F0ZSB3aXRoIGl0cyBwcm92aWRlciIKICBleGl0IDEKZmkKCmVjaG8gIvCflJEgQ29uZmlndXJpbmcgT3BlbkNvZGUgYXV0aGVudGljYXRpb24gKHByb3ZpZGVyIGtleTogJFBST1ZJREVSX0VOVl9LRVkpIgoKaWYgWyAhIC1mICIkT1BFTkNPREVfV09SS19ESVIvQUdFTlRTLm1kIiBdOyB0aGVuCiAgZWNobyAi4pqg77iPIE5vIEFHRU5UUy5tZCBndWlkYW5jZSBmaWxlIGRldGVjdGVkOyBjcmVhdGluZyBwbGFjZWhvbGRlciIKICBjYXQgPDwnUExBQ0VIT0xERVInID4gIiRPUEVOQ09ERV9XT1JLX0RJUi9BR0VOVFMubWQiCiMgUHJvamVjdCBHdWlkYW5jZQoKVGhpcyBPcGVuQ29kZSBydW4gd2FzIHRyaWdnZXJlZCB3aXRob3V0IEFHRU5UUy5tZCBjb250ZW50LiBQcm92aWRlIHByb2plY3QgY29udGV4dCBpbiBBR0VOVFMubWQgdG8gZ2l2ZSBPcGVuQ29kZSByaWNoZXIgaW5zdHJ1Y3Rpb25zLgpQTEFDRUhPTERFUgpmaQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvbXB0IGFzc2VtYmx5IGFuZCBPcGVuQ29kZSBleGVjdXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpQUk9NUFRfUFJFRklYPSIiCgojIFNpbXBsZSwgZm9jdXNlZCBjb250ZXh0IC0gbGV0IEAgcmVmZXJlbmNlcyBkbyB0aGUgaGVhdnkgbGlmdGluZwpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9IyMgVGFzayBDb250ZXh0XG5cbiIKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfVlvdSdyZSB3b3JraW5nIG9uICoqVGFzayB7e3Rhc2tfaWR9fSoqIGZvciBzZXJ2aWNlICoqe3tzZXJ2aWNlfX0qKi5cblxuIgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9KipSZXF1aXJlZCBSZWFkaW5nOioqXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQg4oCUIFlvdXIgc3VjY2VzcyBjcml0ZXJpYSAoY29tcGxldGUgQUxMIG9mIHRoZXNlKVxuIgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBAQUdFTlRTLm1kIOKAlCBSZXBvc2l0b3J5IGd1aWRlbGluZXMgYW5kIHdvcmtmbG93XG4iCmlmIFsgLWYgIiRPUEVOQ09ERV9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBAdGFzay90b29sbWFuLWd1aWRlLm1kIOKAlCBUb29sIHVzYWdlIHJlZmVyZW5jZVxuIgpmaQppZiBbIC1mICIkT1BFTkNPREVfV09SS19ESVIvY29kaW5nLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBAY29kaW5nLWd1aWRlbGluZXMubWQg4oCUIENvZGluZyBzdGFuZGFyZHNcbiIKZmkKaWYgWyAtZiAiJE9QRU5DT0RFX1dPUktfRElSL2dpdGh1Yi1ndWlkZWxpbmVzLm1kIiBdOyB0aGVuCiAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIOKAlCBHaXQgd29ya2Zsb3dcbiIKZmkKClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH1cbioqS2V5IFJlcXVpcmVtZW50czoqKlxuIgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBJbXBsZW1lbnQgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgYmVmb3JlIGNvbXBsZXRpbmdcbiIKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gV3JpdGUgcHJvZHVjdGlvbiBjb2RlIChubyBUT0RPcyBvciBwbGFjZWhvbGRlcnMpXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIENvbW1pdCBmcmVxdWVudGx5IGFuZCBjcmVhdGUgYSBQUiB3aGVuIGRvbmVcbiIKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gUnVuIHF1YWxpdHkgZ2F0ZXMgKGNhcmdvIGZtdCwgY2xpcHB5LCB0ZXN0KSBiZWZvcmUgZmluaXNoaW5nXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIFlvdSdyZSBvbiBicmFuY2ggXGBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb25cYFxuIgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBHaXRIdWIgYXV0aCBpcyBwcmUtY29uZmlndXJlZCAoR0hfVE9LRU4gaXMgc2V0KVxuXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tLS1cblxuIgoKZWNobyAi8J+UjSBERUJVRzogQWJvdXQgdG8gY2hlY2sgZm9yIHByb21wdC5tZCBhdDogJE9QRU5DT0RFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiB0YXNrIGRpcmVjdG9yeToiCmxzIC1sYSAiJE9QRU5DT0RFX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW1wdHkiCmVjaG8gIvCflI0gREVCVUc6IEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgY29udGVudHM6IgpscyAtbGEgIiRPUEVOQ09ERV9XT1JLX0RJUi8iIHx8IGVjaG8gIldvcmtpbmcgZGlyZWN0b3J5IG5vdCBhY2Nlc3NpYmxlIgoKUFJPTVBUX0ZJTEU9IiRPUEVOQ09ERV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKaWYgWyAhIC1mICIkUFJPTVBUX0ZJTEUiIF07IHRoZW4KICBlY2hvICLinYwgcHJvbXB0Lm1kIG5vdCBmb3VuZCBhdCAkUFJPTVBUX0ZJTEUiCiAgZXhpdCAxCmZpCgplY2hvICJzdGFydGluZ1Rhc2s6e3t0YXNrX2lkfX0iCmVjaG8gIiIKClBST01QVF9DT05URU5UPSIke1BST01QVF9QUkVGSVh9JChjYXQgIiRQUk9NUFRfRklMRSIpIgoKIyBQcmludCBwcm9tcHQgcHJldmlldyAoc2ltaWxhciB0byBGYWN0b3J5L0NsYXVkZSBDTElzKQplY2hvICLwn5OkIFNlbmRpbmcgcHJvbXB0IHRvIE9wZW5Db2RlL0dyb2sgKHRydW5jYXRlZCB0byAyMDAwIGNoYXJzIGZvciBsb2cgc2FmZXR5KToiCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iClBST01QVF9QUkVWSUVXPSQocHJpbnRmICclcycgIiRQUk9NUFRfQ09OVEVOVCIgfCBoZWFkIC1jIDIwMDApCnByaW50ZiAnJXNcbicgIiRQUk9NUFRfUFJFVklFVyIKZWNobyAiLi4uIgplY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgpQUk9NUFRfQllURVM9JChwcmludGYgJyVzJyAiJFBST01QVF9DT05URU5UIiB8IHdjIC1jIHwgdHIgLWQgJ1s6c3BhY2U6XScpCmVjaG8gIvCfk48gVG90YWwgcHJvbXB0IHNpemU6ICRQUk9NUFRfQllURVMgYnl0ZXMiCmVjaG8gIiIKCk9SSUdJTkFMX1BST01QVD0iJFBST01QVF9DT05URU5UIgpQUkVWSU9VU19NRVNTQUdFX0ZJTEU9IiIKCiMgR3JvayBDb2RlIEZhc3QgMSBoYXMgMjU2ayBjb250ZXh0IHdpbmRvdyAtIE1BWCBJVCBPVVQKVE9LRU5fTElNSVQ9JHtPUEVOQ09ERV9UT0tFTl9MSU1JVDotMjU2MDAwfQoKIyBHcm9rIGlzIGZhc3QgKDE5MCB0b2tlbnMvc2VjKSBzbyBjYW4gaGFuZGxlIGxvbmdlciB0aW1lb3V0cwpPUEVOQ09ERV9USU1FT1VUPSR7T1BFTkNPREVfRVhFQ19USU1FT1VUOi0yNDAwfSAgIyA0MCBtaW51dGVzICh3YXMgMzApCgpSRVNFVF9TRVNTSU9OX09OX1JFVFJZPSR7T1BFTkNPREVfUkVTRVRfU0VTU0lPTl9PTl9SRVRSWTotMX0KQ09OVElOVUVfU0VTU0lPTj0ke09QRU5DT0RFX0NPTlRJTlVFX1NFU1NJT046LTF9CgojIFJlYXNvbmFibGUgcmV0cmllcyBmb3IgR3JvayAtIG5vdCB0b28gbWFueSB0byB3YXN0ZSB0b2tlbnMKIyBTcGVjaWFsIGNhc2U6IDAgbWVhbnMgdW5saW1pdGVkIChrZWVwIGdvaW5nIHVudGlsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0KQpNQVhfUkVUUklFUz0ke09QRU5DT0RFX01BWF9SRVRSSUVTOi0ke0VYRUNVVElPTl9NQVhfUkVUUklFUzotMTB9fQppZiBbICIkTUFYX1JFVFJJRVMiID0gIjAiIF07IHRoZW4KICBlY2hvICLwn5SEIFVubGltaXRlZCByZXRyaWVzIGVuYWJsZWQgLSB3aWxsIGNvbnRpbnVlIHVudGlsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0IgogIFVOTElNSVRFRF9SRVRSSUVTPTEKZWxzZQogIFVOTElNSVRFRF9SRVRSSUVTPTAKZmkKCiMgT3V0cHV0IGZvcm1hdDoganNvbiAoc3RydWN0dXJlZCwgcGFyc2VhYmxlKSBvciBtYXJrZG93biAoaHVtYW4tcmVhZGFibGUpCiMgSlNPTiBpcyBiZXR0ZXIgZm9yIGF1dG9tYXRlZCBwYXJzaW5nIChzZXNzaW9uIElEcywgY2lyY3VpdCBicmVha2VyLCB0b2tlbiB0cmFja2luZykKIyBNQVJLRE9XTiBpcyBiZXR0ZXIgZm9yIGh1bWFuIG9ic2VydmF0aW9uIGR1cmluZyBkZXZlbG9wbWVudC9kZWJ1Z2dpbmcKIyBTZXQgT1BFTkNPREVfVkVSQk9TRT0xIHRvIHVzZSBtYXJrZG93biBmb3JtYXQgZm9yIHJlYWRhYmlsaXR5CmlmIFsgIiR7T1BFTkNPREVfVkVSQk9TRTotMH0iID0gIjEiIF07IHRoZW4KICBPUEVOQ09ERV9GT1JNQVQ9Im1hcmtkb3duIgogICMgT25seSBzZXQgbG9nIGxldmVsIGlmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGJ5IHVzZXIKICBpZiBbIC16ICIke09QRU5DT0RFX0xPR19MRVZFTDotfSIgXTsgdGhlbgogICAgT1BFTkNPREVfTE9HX0xFVkVMPSJJTkZPIgogIGZpCiAgZWNobyAi8J+ToiBWZXJib3NlIG1vZGUgZW5hYmxlZCAtIHVzaW5nIG1hcmtkb3duIGZvcm1hdCB3aXRoICR7T1BFTkNPREVfTE9HX0xFVkVMfSBsb2cgbGV2ZWwgZm9yIHJlYWRhYmlsaXR5IgogIGlmIFsgIiR7T1BFTkNPREVfTE9HX0xFVkVMfSIgIT0gIkRFQlVHIiBdOyB0aGVuCiAgICBlY2hvICIgICBUbyBzZWUgZXZlbiBtb3JlIGRldGFpbCwgc2V0IE9QRU5DT0RFX0xPR19MRVZFTD1ERUJVRyIKICBmaQplbHNlCiAgT1BFTkNPREVfRk9STUFUPSR7T1BFTkNPREVfRk9STUFUOi1qc29ufQogICMgT25seSBzZXQgbG9nIGxldmVsIGlmIG5vdCBleHBsaWNpdGx5IHByb3ZpZGVkIGJ5IHVzZXIKICBpZiBbIC16ICIke09QRU5DT0RFX0xPR19MRVZFTDotfSIgXTsgdGhlbgogICAgT1BFTkNPREVfTE9HX0xFVkVMPSJERUJVRyIKICBmaQpmaQoKQVRURU1QVD0xClNVQ0NFU1M9MApPUEVOQ09ERV9FWElUPTEKTEFTVF9NRVNTQUdFX0ZJTEU9IiIKUlVOX0xPRz0iIgoKU0VTU0lPTl9ESVI9IiRIT01FLy5vcGVuY29kZS9zZXNzaW9ucyIKTEFURVNUX1NFU1NJT05fSUQ9IiIKCiMgQ2lyY3VpdCBicmVha2VyOiB0cmFjayByZXBlYXRlZCBjb21tYW5kIGZhaWx1cmVzCmRlY2xhcmUgLUEgRkFJTEVEX0NPTU1BTkRTCk1BWF9TQU1FX0NPTU1BTkRfRkFJTFVSRVM9MwoKIyBTZXNzaW9uIGNvbnRpbnVhdGlvbjogcmV0cnkgd2l0aGluIHNhbWUgc2Vzc2lvbiB3aGVuIG5vIHRvb2xzIHVzZWQKTUFYX0NPTlRJTlVBVElPTl9SRVRSSUVTPTUKCiMgSGVscGVyOiBDaGVjayBpZiByZXNwb25zZSBoYWQgYW55IHRvb2wgY2FsbHMKaGFzX3Rvb2xfY2FsbHMoKSB7CiAgbG9jYWwgbG9nX2ZpbGU9IiQxIgogIGlmIFsgISAtZiAiJGxvZ19maWxlIiBdOyB0aGVuCiAgICByZXR1cm4gMQogIGZpCiAgCiAgIyBDaGVjayBmb3IgdG9vbF91c2UgZXZlbnRzIGluIHRoZSBKU09OIGxvZwogIGlmIGdyZXAgLXEgJyJ0eXBlIjoidG9vbF91c2UiJyAiJGxvZ19maWxlIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgcmV0dXJuIDAKICBmaQogIHJldHVybiAxCn0KCmhhc19leGlzdGluZ19zZXNzaW9ucygpIHsKICBsb2NhbCBzZXNzaW9uX2Rpcj0iJDEiCiAgaWYgWyAhIC1kICIkc2Vzc2lvbl9kaXIiIF07IHRoZW4KICAgIHJldHVybiAxCiAgZmkKCiAgZm9yIHNlc3Npb25fZmlsZSBpbiAiJHNlc3Npb25fZGlyIi8qLmpzb247IGRvCiAgICBpZiBbIC1mICIkc2Vzc2lvbl9maWxlIiBdOyB0aGVuCiAgICAgIHJldHVybiAwCiAgICBmaQogIGRvbmUKCiAgcmV0dXJuIDEKfQoKZXh0cmFjdF9zZXNzaW9uX2lkKCkgewogIGxvY2FsIGxvZ19maWxlPSIkMSIKICBbIC1mICIkbG9nX2ZpbGUiIF0gfHwgcmV0dXJuIDEKICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAganEgLXIgJ3NlbGVjdCguc2Vzc2lvbklEICE9IG51bGwpIHwgLnNlc3Npb25JRCcgIiRsb2dfZmlsZSIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSB8IHRyIC1kICdccicgfCB0ciAtZCAnXG4nCiAgZWxzZQogICAgYXdrICcKICAgICAgewogICAgICAgIGdzdWIoL1wwMzNcW1swLTk7XSpbbUtdLywgIiIpOwogICAgICAgIGlmICgkMCB+IC9zZXNzaW9uSUQiW1s6c3BhY2U6XV0qOltbOnNwYWNlOl1dKiJbMC05YS1mQS1GLV17NCx9LykgewogICAgICAgICAgbWF0Y2goJDAsIC9zZXNzaW9uSUQiW1s6c3BhY2U6XV0qOltbOnNwYWNlOl1dKiIoWzAtOWEtZkEtRi1dKykvLCBhKTsKICAgICAgICAgIGlmIChhWzFdICE9ICIiKSBsYXN0PWFbMV07CiAgICAgICAgfSBlbHNlIGlmICgkMCB+IC9vcGVuY29kZSBzZXNzaW9uW1s6c3BhY2U6XV0rWzAtOWEtZkEtRi1dezQsfS8pIHsKICAgICAgICAgIG1hdGNoKCQwLCAvb3BlbmNvZGUgc2Vzc2lvbltbOnNwYWNlOl1dKyhbMC05YS1mQS1GLV0rKS8sIGEpOwogICAgICAgICAgaWYgKGFbMV0gIT0gIiIpIGxhc3Q9YVsxXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRU5EIHsKICAgICAgICBpZiAobGFzdCAhPSAiIikgcHJpbnQgbGFzdDsKICAgICAgfQogICAgJyAiJGxvZ19maWxlIiAyPi9kZXYvbnVsbAogIGZpCn0KCmlmIFsgIiRDT05USU5VRV9TRVNTSU9OIiA9ICIxIiBdOyB0aGVuCiAgaWYgISBoYXNfZXhpc3Rpbmdfc2Vzc2lvbnMgIiRTRVNTSU9OX0RJUiI7IHRoZW4KICAgIGVjaG8gIuKEue+4jyBObyBleGlzdGluZyBPcGVuQ29kZSBzZXNzaW9ucyBkZXRlY3RlZDsgc3RhcnRpbmcgbmV3IHNlc3Npb24iCiAgICBDT05USU5VRV9TRVNTSU9OPTAKICBmaQpmaQoKd3JpdGVfbGFzdF9tZXNzYWdlKCkgewogIGxvY2FsIGxvZ19maWxlPSIkMSIKICBsb2NhbCBkZXN0X2ZpbGU9IiQyIgogIFsgLWYgIiRsb2dfZmlsZSIgXSB8fCByZXR1cm4gMQoKICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgbG9jYWwgbGFzdF90ZXh0CiAgICBsYXN0X3RleHQ9JChqcSAtciAnCiAgICAgIHNlbGVjdCgudHlwZSA9PSAidGV4dCIpCiAgICAgIHwgKGlmICgudGV4dCB8IHR5cGUpID09ICJvYmplY3QiIHRoZW4gLnRleHQudGV4dAogICAgICAgICBlbHNlIGlmICgucGFydCB8IHR5cGUpID09ICJvYmplY3QiIHRoZW4gLnBhcnQudGV4dAogICAgICAgICBlbHNlIC50ZXh0IGVuZCkKICAgICAgfCBzZWxlY3QoLiAhPSBudWxsIGFuZCAuICE9ICIiKQogICAgJyAiJGxvZ19maWxlIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xKQoKICAgIGlmIFsgLW4gIiRsYXN0X3RleHQiIF07IHRoZW4KICAgICAgcHJpbnRmICclc1xuJyAiJGxhc3RfdGV4dCIgPiAiJGRlc3RfZmlsZSIKICAgICAgcmV0dXJuIDAKICAgIGZpCiAgZmkKCiAgdGFpbCAtbiAxMDAgIiRsb2dfZmlsZSIgMj4vZGV2L251bGwgPiAiJGRlc3RfZmlsZSIKICByZXR1cm4gMAp9CgppZiBbICIkQ09OVElOVUVfU0VTU0lPTiIgPSAiMSIgXTsgdGhlbgogIGVjaG8gIuKEue+4jyBPcGVuQ29kZSB3aWxsIGF0dGVtcHQgdG8gY29udGludWUgdGhlIG1vc3QgcmVjZW50IHNlc3Npb24gd2hlbiBhdmFpbGFibGUuIgplbHNlCiAgaWYgWyAtZCAiJFNFU1NJT05fRElSIiBdOyB0aGVuCiAgICBmaW5kICIkU0VTU0lPTl9ESVIiIC1tYXhkZXB0aCAxIC10eXBlIGYgLW5hbWUgJyouanNvbicgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZmkKZmkKCndoaWxlIFsgIiRVTkxJTUlURURfUkVUUklFUyIgPSAiMSIgXSB8fCBbICRBVFRFTVBUIC1sZSAkTUFYX1JFVFJJRVMgXTsgZG8KICBpZiBbICIkVU5MSU1JVEVEX1JFVFJJRVMiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIvCfmoAgT3BlbkNvZGUgZXhlY3V0aW9uIGF0dGVtcHQgJEFUVEVNUFQgKHVubGltaXRlZCBtb2RlKSIKICBlbHNlCiAgICBlY2hvICLwn5qAIE9wZW5Db2RlIGV4ZWN1dGlvbiBhdHRlbXB0ICRBVFRFTVBULyRNQVhfUkVUUklFUyIKICBmaQogIExBU1RfTUVTU0FHRV9GSUxFPSIvdG1wL29wZW5jb2RlLWxhc3QtbWVzc2FnZS0ke0FUVEVNUFR9LnR4dCIKICBSVU5fTE9HPSIvdG1wL29wZW5jb2RlLXJ1bi0ke0FUVEVNUFR9Lmpzb25sIgoKICBpZiBbICIkUkVTRVRfU0VTU0lPTl9PTl9SRVRSWSIgPSAiMSIgXSAmJiBbICIkQ09OVElOVUVfU0VTU0lPTiIgIT0gIjEiIF0gJiYgWyAkQVRURU1QVCAtZ3QgMSBdICYmIFsgLWQgIiRTRVNTSU9OX0RJUiIgXTsgdGhlbgogICAgZmluZCAiJFNFU1NJT05fRElSIiAtbWF4ZGVwdGggMSAtdHlwZSBmIC1uYW1lICcqLmpzb24nIC1kZWxldGUgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGZpCgogICMgSW5uZXIgY29udGludWF0aW9uIGxvb3AgY291bnRlcgogIENPTlRJTlVBVElPTl9BVFRFTVBUPTAKCiAgaWYgWyAkQVRURU1QVCAtZXEgMSBdOyB0aGVuCiAgICBQUk9NUFRfUEFZTE9BRD0iJE9SSUdJTkFMX1BST01QVCIKICBlbHNlCiAgICBpZiBbIC1uICIkUFJFVklPVVNfTUVTU0FHRV9GSUxFIiBdICYmIFsgLXMgIiRQUkVWSU9VU19NRVNTQUdFX0ZJTEUiIF07IHRoZW4KICAgICAgUFJFVklPVVNfU05JUFBFVD0kKHRhaWwgLW4gNDAgIiRQUkVWSU9VU19NRVNTQUdFX0ZJTEUiIDI+L2Rldi9udWxsIHwgc2VkICdzL14vICAgIC8nKQogICAgZWxzZQogICAgICBQUkVWSU9VU19TTklQUEVUPSIgICAgPG5vIHByZXZpb3VzIG91dHB1dCBhdmFpbGFibGU+IgogICAgZmkKICAgIFBST01QVF9QQVlMT0FEPSIjIyBDb250aW51YXRpb24gLSBBdHRlbXB0ICRBVFRFTVBULyRNQVhfUkVUUklFUwoKVGhlIHRhc2sgaXNuJ3QgY29tcGxldGUgeWV0LiBIZXJlJ3Mgd2hhdCB5b3Ugc2FpZCBsYXN0IHRpbWU6CgokUFJFVklPVVNfU05JUFBFVAoKKipOZXh0IHN0ZXBzOioqCjEuIFJldmlldyBAdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIHRvIHNlZSB3aGF0J3Mgc3RpbGwgbWlzc2luZwoyLiBJbXBsZW1lbnQgdGhlIHJlbWFpbmluZyByZXF1aXJlbWVudHMKMy4gQ29tbWl0IHlvdXIgY2hhbmdlcyBhbmQgcHVzaAo0LiBWZXJpZnkgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgYXJlIG1ldAoKQ29udGludWUgd29ya2luZyBvbiB0aGUgaW5jb21wbGV0ZSBpdGVtcy4iCiAgZmkKCiAgIyBJbm5lciBsb29wOiBrZWVwIHNlc3Npb24gYWxpdmUgd2hlbiBtb2RlbCByZXR1cm5zIHRleHQtb25seSAobm8gdG9vbHMpCiAgd2hpbGUgWyAkQ09OVElOVUFUSU9OX0FUVEVNUFQgLWxlICRNQVhfQ09OVElOVUFUSU9OX1JFVFJJRVMgXTsgZG8KICAgIGlmIFsgJENPTlRJTlVBVElPTl9BVFRFTVBUIC1ndCAwIF07IHRoZW4KICAgICAgZWNobyAi8J+UhCBDb250aW51YXRpb24gJENPTlRJTlVBVElPTl9BVFRFTVBULyRNQVhfQ09OVElOVUFUSU9OX1JFVFJJRVMgKGtlZXBpbmcgc2Vzc2lvbiBhbGl2ZSkiCiAgICAgIFBST01QVF9QQVlMT0FEPSJUaGUgdGFzayBpcyBub3QgY29tcGxldGUgeWV0LiAqKlVzZSB0b29scyoqIHRvIGNvbnRpbnVlIHdvcmtpbmcgb24gdGhlIHJlbWFpbmluZyByZXF1aXJlbWVudHMuCgpSZW1haW5pbmcgd29yazoKLSBSZXZpZXcgYWNjZXB0YW5jZSBjcml0ZXJpYTogXGBjYXQgdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kXGAgIAotIENoZWNrIHdoYXQncyBiZWVuIGRvbmU6IFxgZ2l0IHN0YXR1c1xgIGFuZCBcYGdpdCBsb2dcYAotIEZpeCBhbnkgZXJyb3JzIG9yIGluY29tcGxldGUgaW1wbGVtZW50YXRpb25zCi0gUnVuIHF1YWxpdHkgZ2F0ZXMgKGNhcmdvIGZtdCwgY2FyZ28gY2xpcHB5LCBjYXJnbyB0ZXN0KQotIENvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzCi0gQ3JlYXRlIG9yIHVwZGF0ZSBQUgoKKipJbXBvcnRhbnQ6KiogRG8gbm90IGp1c3QgZXhwbGFpbiAtIHRha2UgYWN0aW9uIHdpdGggdG9vbHMgdG8gY29tcGxldGUgdGhlIHRhc2suIgogICAgICBSVU5fTE9HPSIvdG1wL29wZW5jb2RlLXJ1bi0ke0FUVEVNUFR9LWNvbnQke0NPTlRJTlVBVElPTl9BVFRFTVBUfS5qc29ubCIKICAgIGZpCiAgICAKICAgIHNldCArZQogICAgc2V0IC1vIHBpcGVmYWlsCiAgICAjIFdyaXRlIHByb21wdCB0byB0ZW1wIGZpbGUgdG8gYXZvaWQgIkFyZ3VtZW50IGxpc3QgdG9vIGxvbmciIGVycm9yCiAgICBQUk9NUFRfRklMRT0iL3RtcC9vcGVuY29kZS1wcm9tcHQtJHtBVFRFTVBUfS0ke0NPTlRJTlVBVElPTl9BVFRFTVBUfS50eHQiCiAgICBwcmludGYgJyVzJyAiJFBST01QVF9QQVlMT0FEIiA+ICIkUFJPTVBUX0ZJTEUiCiAgICAKICAgIE9QRU5DT0RFX0NNRD0oCiAgICAgICJvcGVuY29kZSIKICAgICAgInJ1biIKICAgICAgIi0tZm9ybWF0IgogICAgICAiJE9QRU5DT0RFX0ZPUk1BVCIKICAgICAgIi0tbG9nLWxldmVsIgogICAgICAiJE9QRU5DT0RFX0xPR19MRVZFTCIKICAgICkKICAgIGlmIFsgIiRDT05USU5VRV9TRVNTSU9OIiA9ICIxIiBdOyB0aGVuCiAgICAgIGlmIFsgLW4gIiRMQVRFU1RfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgICAgIE9QRU5DT0RFX0NNRCs9KCItLXNlc3Npb24iICIkTEFURVNUX1NFU1NJT05fSUQiKQogICAgICBlbHNlCiAgICAgICAgT1BFTkNPREVfQ01EKz0oIi0tY29udGludWUiKQogICAgICBmaQogICAgZmkKICAgIAogICAgIyBQYXNzIHByb21wdCB2aWEgc3RkaW4gdG8gaGFuZGxlIGxhcmdlIHByb21wdHMKICAgIGlmIGNvbW1hbmQgLXYgdGltZW91dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgdGltZW91dCAiJE9QRU5DT0RFX1RJTUVPVVQiICIke09QRU5DT0RFX0NNRFtAXX0iIDwgIiRQUk9NUFRfRklMRSIgfCB0ZWUgIiRSVU5fTE9HIgogICAgZWxzZQogICAgICAiJHtPUEVOQ09ERV9DTURbQF19IiA8ICIkUFJPTVBUX0ZJTEUiIHwgdGVlICIkUlVOX0xPRyIKICAgIGZpCiAgICBPUEVOQ09ERV9FWElUPSR7UElQRVNUQVRVU1swXX0KICAgIHNldCArbyBwaXBlZmFpbAogICAgc2V0IC1lCiAgICAKICAgICMgQ2xlYW4gdXAgcHJvbXB0IGZpbGUKICAgIHJtIC1mICIkUFJPTVBUX0ZJTEUiCiAgICAKICAgICMgQ2hlY2sgaWYgdGhpcyBydW4gaGFkIHRvb2wgY2FsbHMKICAgIGlmIGhhc190b29sX2NhbGxzICIkUlVOX0xPRyI7IHRoZW4KICAgICAgZWNobyAi4pyFIFNlc3Npb24gcHJvZHVjZWQgdG9vbCBjYWxscyAtIGdvb2QgcHJvZ3Jlc3MiCiAgICAgIGJyZWFrCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBObyB0b29sIGNhbGxzIGRldGVjdGVkIC0gbW9kZWwgc3R1Y2sgaW4gZXhwbGFuYXRpb24gbW9kZSIKICAgICAgaWYgWyAkQ09OVElOVUFUSU9OX0FUVEVNUFQgLWdlICRNQVhfQ09OVElOVUFUSU9OX1JFVFJJRVMgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBNYXggY29udGludWF0aW9uIHJldHJpZXMgcmVhY2hlZCAtIG1vdmluZyB0byBuZXh0IGF0dGVtcHQiCiAgICAgICAgYnJlYWsKICAgICAgZmkKICAgIGZpCiAgICAKICAgIENPTlRJTlVBVElPTl9BVFRFTVBUPSQoKENPTlRJTlVBVElPTl9BVFRFTVBUICsgMSkpCiAgZG9uZQoKICBpZiBbICRPUEVOQ09ERV9FWElUIC1lcSAxMjQgXTsgdGhlbgogICAgZWNobyAi4o+x77iPIE9wZW5Db2RlIGNvbW1hbmQgZXhjZWVkZWQgJHtPUEVOQ09ERV9USU1FT1VUfXMgdGltZW91dDsgdGVybWluYXRpbmcgc2Vzc2lvbiIKICAgIHBraWxsIC1mICJvcGVuY29kZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgUFJFVklPVVNfTUVTU0FHRV9GSUxFPSIkTEFTVF9NRVNTQUdFX0ZJTEUiCiAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgIGNvbnRpbnVlCiAgZmkKCiAgZWNobyAiW29wZW5jb2RlLWRlYnVnXSBBdHRlbXB0ICRBVFRFTVBUIGZpbmlzaGVkIHdpdGggZXhpdCBjb2RlICRPUEVOQ09ERV9FWElUIgoKICBpZiBbICRPUEVOQ09ERV9FWElUIC1uZSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBPcGVuQ29kZSBleGl0ZWQgd2l0aCBzdGF0dXMgJE9QRU5DT0RFX0VYSVQgb24gYXR0ZW1wdCAkQVRURU1QVCIKICBmaQoKICAjIENpcmN1aXQgYnJlYWtlcjogZGV0ZWN0IHJlcGVhdGVkIGZhaWxpbmcgYmFzaCBjb21tYW5kcwogIGlmIFsgLWYgIiRSVU5fTE9HIiBdOyB0aGVuCiAgICAjIEV4dHJhY3QgZmFpbGVkIGJhc2ggY29tbWFuZHMgZnJvbSB0aGUgbG9nCiAgICBGQUlMRURfQ01EPSQoanEgLXIgJ3NlbGVjdCgudHlwZT09InRvb2xfdXNlIiBhbmQgLnBhcnQudG9vbD09ImJhc2giIGFuZCAucGFydC5zdGF0ZS5zdGF0dXM9PSJjb21wbGV0ZWQiIGFuZCAucGFydC5zdGF0ZS5tZXRhZGF0YS5leGl0IT0wKSB8IC5wYXJ0LnN0YXRlLmlucHV0LmNvbW1hbmQnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSB8IGhlYWQgLWMgMTAwKQogICAgCiAgICBpZiBbIC1uICIkRkFJTEVEX0NNRCIgXTsgdGhlbgogICAgICAjIFRyYWNrIGhvdyBtYW55IHRpbWVzIHRoaXMgY29tbWFuZCBoYXMgZmFpbGVkCiAgICAgIEZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXT0kKCgke0ZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXTotMH0gKyAxKSkKICAgICAgRkFJTF9DT1VOVD0ke0ZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXX0KICAgICAgCiAgICAgIGlmIFsgJEZBSUxfQ09VTlQgLWdlICRNQVhfU0FNRV9DT01NQU5EX0ZBSUxVUkVTIF07IHRoZW4KICAgICAgICBlY2hvICLwn5S0IENJUkNVSVQgQlJFQUtFUiBUUklHR0VSRUQ6IENvbW1hbmQgaGFzIGZhaWxlZCAkRkFJTF9DT1VOVCB0aW1lcyBpbiBhIHJvdzoiCiAgICAgICAgZWNobyAiICAgQ29tbWFuZDogJEZBSUxFRF9DTUQiCiAgICAgICAgZWNobyAiICAgVGhpcyBpbmRpY2F0ZXMgdGhlIGFnZW50IGlzIHN0dWNrIGluIGEgbG9vcC4gQWRkaW5nIGV4cGxpY2l0IGd1aWRhbmNlLi4uIgogICAgICAgIAogICAgICAgICMgRm9yY2UgYSBzdHJvbmdlciBwcm9tcHQgZm9yIG5leHQgcmV0cnkKICAgICAgICBQUk9NUFRfUEFZTE9BRD0i4pqg77iPICoqTE9PUCBERVRFQ1RFRCoqOiBZb3UgaGF2ZSB0cmllZCB0aGlzIGNvbW1hbmQgJEZBSUxfQ09VTlQgdGltZXM6ClxgXGBcYGJhc2gKJEZBSUxFRF9DTUQKXGBcYFxgCgpJdCBrZWVwcyBmYWlsaW5nIHdpdGggdGhlIHNhbWUgZXJyb3IuICoqU1RPUCBSRVBFQVRJTkcgVEhJUyBDT01NQU5ELioqCgpJbnN0ZWFkOgoxLiBDaGVjayB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGggXGBwd2RcYAoyLiBMaXN0IGZpbGVzIHdpdGggXGBscyAtbGFcYAozLiBUcnkgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBhcHByb2FjaCAoY3JlYXRlIGZpbGVzIG9uZSBhdCBhIHRpbWUsIHVzZSBkaWZmZXJlbnQgc3ludGF4LCBldGMuKQo0LiBJZiBkaXJlY3RvcmllcyBkb24ndCBleGlzdCwgY3JlYXRlIHRoZW0gc3RlcC1ieS1zdGVwIGFuZCB2ZXJpZnkgZWFjaCBzdGVwCgpDb250aW51aW5nIFRhc2sge3t0YXNrX2lkfX0gLSBmb2N1cyBvbiBzb2x2aW5nIHRoZSB1bmRlcmx5aW5nIGlzc3VlLCBub3QgcmVwZWF0aW5nIHRoZSBzYW1lIGZhaWxlZCBjb21tYW5kLiIKICAgICAgICAKICAgICAgICAjIFJlc2V0IHRoZSBjb3VudGVyIHRvIGdpdmUgaXQgYSBmcmVzaCBjaGFuY2Ugd2l0aCBuZXcgZ3VpZGFuY2UKICAgICAgICBGQUlMRURfQ09NTUFORFNbIiRGQUlMRURfQ01EIl09MAogICAgICBmaQogICAgZmkKICBmaQoKICB3cml0ZV9sYXN0X21lc3NhZ2UgIiRSVU5fTE9HIiAiJExBU1RfTUVTU0FHRV9GSUxFIiB8fCB0cnVlCgogIGlmIFsgLXMgIiRMQVNUX01FU1NBR0VfRklMRSIgXTsgdGhlbgogICAgZWNobyAi8J+TnSBPcGVuQ29kZSBzdW1tYXJ5IChhdHRlbXB0ICRBVFRFTVBUKToiCiAgICBzZWQgJ3MvXi8gICAgLycgIiRMQVNUX01FU1NBR0VfRklMRSIKICBlbHNlCiAgICBlY2hvICLihLnvuI8gTm8gdGV4dHVhbCBzdW1tYXJ5IGNhcHR1cmVkIGZyb20gT3BlbkNvZGUgb24gYXR0ZW1wdCAkQVRURU1QVCIKICBmaQoKICBORVdfU0VTU0lPTl9JRD0iIgogIGlmIFsgLW4gIiRSVU5fTE9HIiBdICYmIFsgLWYgIiRSVU5fTE9HIiBdOyB0aGVuCiAgICBORVdfU0VTU0lPTl9JRD0kKGV4dHJhY3Rfc2Vzc2lvbl9pZCAiJFJVTl9MT0ciIHx8IHRydWUpCiAgZmkKICBpZiBbIC1uICIkTkVXX1NFU1NJT05fSUQiIF07IHRoZW4KICAgIGlmIFsgIiRMQVRFU1RfU0VTU0lPTl9JRCIgIT0gIiRORVdfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgICBlY2hvICLihLnvuI8gIENhcHR1cmVkIE9wZW5Db2RlIHNlc3Npb24gSUQ6ICRORVdfU0VTU0lPTl9JRCIKICAgICAgTEFURVNUX1NFU1NJT05fSUQ9IiRORVdfU0VTU0lPTl9JRCIKICAgIGZpCiAgICBDT05USU5VRV9TRVNTSU9OPTEKICBmaQoKICBQUkVWSU9VU19NRVNTQUdFX0ZJTEU9IiRMQVNUX01FU1NBR0VfRklMRSIKCiAgaWYgWyAiJHtUT0tFTl9MSU1JVDotMH0iIC1ndCAwIF0gJiYgWyAtZiAiJFJVTl9MT0ciIF07IHRoZW4KICAgIExBU1RfVE9LRU5TPSQoZ3JlcCAtRW8gJ3Rva2VucyB1c2VkOiBbMC05LF0rJyAiJFJVTl9MT0ciIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEgfCBhd2sgJ3twcmludCAkM30nIHwgdHIgLWQgJywnIHwgdHIgLWQgJ1xuJyB8fCB0cnVlKQogICAgaWYgW1sgIiRMQVNUX1RPS0VOUyIgPX4gXlswLTldKyQgXV07IHRoZW4KICAgICAgZWNobyAi8J+TiiBPcGVuQ29kZSB0b2tlbnMgdXNlZCB0aGlzIGF0dGVtcHQ6ICRMQVNUX1RPS0VOUyIKICAgICAgaWYgWyAiJExBU1RfVE9LRU5TIiAtZ3QgIiRUT0tFTl9MSU1JVCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBUb2tlbiB1c2FnZSAkTEFTVF9UT0tFTlMgZXhjZWVkcyBsaW1pdCAkVE9LRU5fTElNSVQ7IGZvcmNpbmcgY2xlYW4gc2Vzc2lvbiBiZWZvcmUgcmV0cnkiCiAgICAgICAgaWYgWyAtZCAiJFNFU1NJT05fRElSIiBdOyB0aGVuCiAgICAgICAgICBmaW5kICIkU0VTU0lPTl9ESVIiIC1tYXhkZXB0aCAxIC10eXBlIGYgLW5hbWUgJyouanNvbicgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgZmkKICAgICAgICBQUkVWSU9VU19NRVNTQUdFX0ZJTEU9IiRMQVNUX01FU1NBR0VfRklMRSIKICAgICAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgICAgICBjb250aW51ZQogICAgICBmaQogICAgZmkKICBmaQoKICAjIFJleC1zcGVjaWZpYyBjb21wbGV0aW9uIGNyaXRlcmlhIChpbXBsZW1lbnRhdGlvbi1mb2N1c2VkLCBub3QgcXVhbGl0eS1mb2N1c2VkKQogIGlmIFtbICJ7e2dpdGh1Yl9hcHB9fSIgPT0gKiJSZXgiKiBdXSB8fCBbWyAie3tnaXRodWJfYXBwfX0iID09ICoicmV4IiogXV07IHRoZW4KICAgIENPTVBMRVRJT05fUFJPTVBUPSJUYXNrIHt7dGFza19pZH19IGNvbXBsZXRpb24gdmVyaWZpY2F0aW9uIOKAlCBSZXggSW1wbGVtZW50YXRpb24gQWdlbnQKCioqWW91ciBSb2xlKio6IFlvdSBhcmUgUmV4LCB0aGUgSU1QTEVNRU5UQVRJT04gYWdlbnQuIENsZW8gd2lsbCBoYW5kbGUgY29kZSBxdWFsaXR5IGluIHRoZSBuZXh0IHN0YWdlLgoKKipGSVJTVCoqOiBSZXZpZXcgdGhlIEZVTkNUSU9OQUwgcmVxdWlyZW1lbnRzIGluIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZAoKKipUaGVuIGFuc3dlciAneWVzJyBpZiBBTEwgb2YgdGhlc2UgYXJlIHRydWU6KioKCjEuICoqRlVOQ1RJT05BTCBhY2NlcHRhbmNlIGNyaXRlcmlhIGltcGxlbWVudGVkKiogKGZlYXR1cmVzIGV4aXN0IGFuZCBiYXNpY2FsbHkgd29yaykKMi4gQ29kZSBDT01QSUxFUyBzdWNjZXNzZnVsbHkgKFxgY2FyZ28gYnVpbGRcYCBwYXNzZXMpCjMuIEFsbCBjb2RlIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCB0byBnaXQKNC4gQ2hhbmdlcyBhcmUgcHVzaGVkIHRvIHJlbW90ZSBicmFuY2ggZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uCjUuIEEgcHVsbCByZXF1ZXN0IGV4aXN0cyAod2l0aCBhdCBsZWFzdCB0YXNrLXt7dGFza19pZH19IGxhYmVsKQoKKipDb2RlIHF1YWxpdHkgaXNzdWVzIGFyZSBPSyBmb3IgUmV4IC0gQ2xlbyB3aWxsIGZpeDoqKgotIOKaoO+4jyBDbGlwcHkgd2FybmluZ3M/IE9LIC0gQ2xlbyB3aWxsIGZpeAotIOKaoO+4jyBGb3JtYXR0aW5nIGlzc3Vlcz8gT0sgLSBDbGVvIHdpbGwgZml4ICAKLSDimqDvuI8gU29tZSB0ZXN0cyBmYWlsaW5nPyBPSyBpZiBiYXNpYyBmdW5jdGlvbmFsaXR5IHdvcmtzIC0gQ2xlby9UZXNzIHdpbGwgZml4Ci0g4pqg77iPIFVudXNlZCBmdW5jdGlvbnMvdmFyaWFibGVzPyBPSyAtIENsZW8gd2lsbCBjbGVhbiB1cAoKKipGb2N1cyBvbioqOiBEb2VzIHRoZSBpbXBsZW1lbnRhdGlvbiB3b3JrPyBBcmUgdGhlIGZlYXR1cmVzIHRoZXJlPwoKKipSZXNwb25zZSBmb3JtYXQ6KioKCklmIGZ1bmN0aW9uYWxseSBjb21wbGV0ZSAoZmVhdHVyZXMgd29yaywgY29kZSBjb21waWxlcywgUFIgY3JlYXRlZCksIHJlc3BvbmQgd2l0aDogeWVzCgpJZiBmZWF0dXJlcyBpbmNvbXBsZXRlIG9yIGNvZGUgZG9lc24ndCBjb21waWxlLCByZXNwb25kIHdpdGg6Cm5vClJFQVNPTjogPHNwZWNpZmljIEZVTkNUSU9OQUwgaXNzdWU+CgpFeGFtcGxlICd5ZXMnIHJlc3BvbnNlIChldmVuIHdpdGggd2FybmluZ3MpOgp5ZXMKCkV4YW1wbGUgJ25vJyByZXNwb25zZToKbm8KUkVBU09OOiBBY2NlcHRhbmNlIGNyaXRlcmlhIDIgaW5jb21wbGV0ZSAtIGhlYWx0aCBlbmRwb2ludCBub3QgeWV0IGltcGxlbWVudGVkLiBGZWF0dXJlIHdvcmsgcmVtYWlucy4KCllvdXIgcmVzcG9uc2U6IgogIGVsc2UKICAgICMgRGVmYXVsdCBjb21wbGV0aW9uIHByb21wdCBmb3Igb3RoZXIgYWdlbnRzIChDbGVvLCBUZXNzKQogICAgQ09NUExFVElPTl9QUk9NUFQ9IlRhc2sge3t0YXNrX2lkfX0gY29tcGxldGlvbiB2ZXJpZmljYXRpb24uCgoqKkZJUlNUKio6IFJldmlldyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYSBpbiB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQKCioqVGhlbiBhbnN3ZXIgJ3llcycgT05MWSBpZiBBTEwgb2YgdGhlc2UgYXJlIHRydWU6KioKCjEuICoqRVZFUlkgYWNjZXB0YW5jZSBjcml0ZXJpb24gaXMgZnVsbHkgaW1wbGVtZW50ZWQqKiAobm90IGp1c3Qgc3RhcnRlZCwgYnV0IERPTkUpCjIuIEFsbCBjb2RlIGNoYW5nZXMgYXJlIGNvbW1pdHRlZCB0byBnaXQKMy4gQ2hhbmdlcyBhcmUgcHVzaGVkIHRvIHJlbW90ZSBicmFuY2ggZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uCjQuIEEgcHVsbCByZXF1ZXN0IGV4aXN0cyAod2l0aCBhdCBsZWFzdCB0YXNrLXt7dGFza19pZH19IGxhYmVsOyBvdGhlciBsYWJlbHMgYXJlIG9wdGlvbmFsKQo1LiBRdWFsaXR5IGdhdGVzIHBhc3NlZCAoY2FyZ28gZm10LCBjYXJnbyBjbGlwcHkgd2l0aCBubyB3YXJuaW5ncywgdGVzdHMgcGFzcykKCioqQmUgaG9uZXN0Kio6IElmIEFOWSBhY2NlcHRhbmNlIGNyaXRlcmlvbiBpcyBpbmNvbXBsZXRlIG9yIHBhcnRpYWxseSBpbXBsZW1lbnRlZCwgYW5zd2VyICdubycgYW5kIGNvbnRpbnVlIHdvcmtpbmcuCgoqKlRvIHZlcmlmeToqKgotIFJldmlldzogXGBjYXQgdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kXGAKLSBHaXQgc3RhdHVzOiBcYGdpdCBzdGF0dXNcYAotIENvbW1pdHMgcHVzaGVkOiBcYGdpdCBsb2cgb3JpZ2luL21haW4uLkhFQURcYAotIFBSIGV4aXN0czogXGBnaCBwciB2aWV3XGAKLSBUZXN0cyBwYXNzOiBDaGVjayB5b3VyIHRlc3QgcmVzdWx0cwoKKipSZXNwb25zZSBmb3JtYXQ6KioKCklmIGNvbXBsZXRlLCByZXNwb25kIHdpdGg6IHllcwoKSWYgaW5jb21wbGV0ZSwgcmVzcG9uZCB3aXRoOgpubwpSRUFTT046IDxzcGVjaWZpYyByZWFzb24gd2h5IG5vdCBjb21wbGV0ZT4KCkZvciAnbm8nIHJlc3BvbnNlcywgUkVBU09OIG11c3Qgc3BlY2lmeToKLSBXaGljaCBhY2NlcHRhbmNlIGNyaXRlcmlhIGFyZSBpbmNvbXBsZXRlIChsaXN0IHRoZW0gYnkgbnVtYmVyL25hbWUpCi0gV2hhdCBzcGVjaWZpYyB3b3JrIHJlbWFpbnMgKGJlIGNvbmNyZXRlKQotIEFueSBibG9ja2VycyBvciBpc3N1ZXMgZW5jb3VudGVyZWQKCkV4YW1wbGUgJ25vJyByZXNwb25zZToKbm8KUkVBU09OOiBBY2NlcHRhbmNlIGNyaXRlcmlhIDIgYW5kIDQgaW5jb21wbGV0ZS4gQVBJIGVuZHBvaW50IC91c2VycyBjcmVhdGVkIGJ1dCBub3QgeWV0IGNvbm5lY3RlZCB0byBkYXRhYmFzZS4gUFIgY3JlYXRlZCBidXQgdGVzdHMgZmFpbGluZyBkdWUgdG8gbWlzc2luZyBlcnJvciBoYW5kbGluZyBpbiB1c2VyX2NvbnRyb2xsZXIucnMuCgpZb3VyIHJlc3BvbnNlOiIKICBmaQogIENPTVBMRVRJT05fTEFTVF9NRVNTQUdFPSIvdG1wL29wZW5jb2RlLWNvbXBsZXRpb24tJHtBVFRFTVBUfS50eHQiCiAgQ09NUExFVElPTl9MT0c9Ii90bXAvb3BlbmNvZGUtY29tcGxldGlvbi0ke0FUVEVNUFR9Lmpzb25sIgoKICBDT01QTEVUSU9OX1JFU1BPTlNFPSIiCiAgaWYgWyAiJENPTlRJTlVFX1NFU1NJT04iID0gIjEiIF07IHRoZW4KICAgICMgV3JpdGUgY29tcGxldGlvbiBwcm9tcHQgdG8gZmlsZSAoc2FtZSBwYXR0ZXJuIGFzIG1haW4gcHJvbXB0KQogICAgQ09NUExFVElPTl9QUk9NUFRfRklMRT0iL3RtcC9vcGVuY29kZS1jb21wbGV0aW9uLXByb21wdC0ke0FUVEVNUFR9LnR4dCIKICAgIHByaW50ZiAnJXMnICIkQ09NUExFVElPTl9QUk9NUFQiID4gIiRDT01QTEVUSU9OX1BST01QVF9GSUxFIgogICAgCiAgICBzZXQgK2UKICAgIHNldCAtbyBwaXBlZmFpbAogICAgQ09NUExFVElPTl9DTUQ9KAogICAgICAib3BlbmNvZGUiCiAgICAgICJydW4iCiAgICAgICItLWZvcm1hdCIKICAgICAgIiRPUEVOQ09ERV9GT1JNQVQiCiAgICAgICItLWxvZy1sZXZlbCIKICAgICAgIiRPUEVOQ09ERV9MT0dfTEVWRUwiCiAgICApCiAgICBpZiBbIC1uICIkTEFURVNUX1NFU1NJT05fSUQiIF07IHRoZW4KICAgICAgQ09NUExFVElPTl9DTUQrPSgiLS1zZXNzaW9uIiAiJExBVEVTVF9TRVNTSU9OX0lEIikKICAgIGVsc2UKICAgICAgQ09NUExFVElPTl9DTUQrPSgiLS1jb250aW51ZSIpCiAgICBmaQogICAgCiAgICAjIFBhc3MgY29tcGxldGlvbiBwcm9tcHQgdmlhIHN0ZGluCiAgICAiJHtDT01QTEVUSU9OX0NNRFtAXX0iIDwgIiRDT01QTEVUSU9OX1BST01QVF9GSUxFIiB8IHRlZSAiJENPTVBMRVRJT05fTE9HIgogICAgQ09NUExFVElPTl9FWElUPSR7UElQRVNUQVRVU1swXX0KICAgIHNldCArbyBwaXBlZmFpbAogICAgc2V0IC1lCiAgICAKICAgICMgQ2xlYW4gdXAgcHJvbXB0IGZpbGUKICAgIHJtIC1mICIkQ09NUExFVElPTl9QUk9NUFRfRklMRSIKCiAgICBpZiBbICRDT01QTEVUSU9OX0VYSVQgLW5lIDAgXTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gQ29tcGxldGlvbiBwcm9iZSBleGl0ZWQgd2l0aCBzdGF0dXMgJENPTVBMRVRJT05fRVhJVCIKICAgIGZpCgogICAgd3JpdGVfbGFzdF9tZXNzYWdlICIkQ09NUExFVElPTl9MT0ciICIkQ09NUExFVElPTl9MQVNUX01FU1NBR0UiIHx8IHRydWUKCiAgICBlY2hvICJbb3BlbmNvZGUtZGVidWddIENvbXBsZXRpb24gcHJvYmUgZm9yIGF0dGVtcHQgJEFUVEVNUFQgZXhpdGVkICRDT01QTEVUSU9OX0VYSVQiCgogICAgaWYgWyAtcyAiJENPTVBMRVRJT05fTEFTVF9NRVNTQUdFIiBdOyB0aGVuCiAgICAgIENPTVBMRVRJT05fUkVTUE9OU0U9JCh0ciAtZCAnXHInIDwgIiRDT01QTEVUSU9OX0xBU1RfTUVTU0FHRSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKICAgICAgZWNobyAi8J+nriBDb21wbGV0aW9uIHByb2JlIHJlc3BvbnNlOiAkQ09NUExFVElPTl9SRVNQT05TRSIKICAgICAgCiAgICAgICMgRXh0cmFjdCByZWFzb24gaWYgcmVzcG9uc2UgaXMgJ25vJwogICAgICBpZiBlY2hvICIkQ09NUExFVElPTl9SRVNQT05TRSIgfCBncmVwIC1FcSAnXm5vJzsgdGhlbgogICAgICAgIENPTVBMRVRJT05fUkVBU09OPSQoZWNobyAiJENPTVBMRVRJT05fUkVTUE9OU0UiIHwgZ3JlcCAtQSAxMDAgInJlYXNvbjoiIHwgdGFpbCAtbiArMSB8IHNlZCAncy9ecmVhc29uOlxzKi8vJyB8IGhlYWQgLW4gMjApCiAgICAgICAgaWYgWyAtbiAiJENPTVBMRVRJT05fUkVBU09OIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLwn5OLIEluY29tcGxldGlvbiBkZXRhaWxzOiIKICAgICAgICAgIGVjaG8gIiRDT01QTEVUSU9OX1JFQVNPTiIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLimqDvuI8gTm8gcmVhc29uIHByb3ZpZGVkIGZvciBpbmNvbXBsZXRlIHN0YXR1cyIKICAgICAgICBmaQogICAgICBmaQogICAgZmkKICBlbHNlCiAgICBlY2hvICLihLnvuI8gQ29tcGxldGlvbiBwcm9iZSBza2lwcGVkIChzZXNzaW9uIGNvbnRpbnVhdGlvbiBkaXNhYmxlZCkiCiAgZmkKCiAgaWYgZWNobyAiJENPTVBMRVRJT05fUkVTUE9OU0UiIHwgZ3JlcCAtRXEgJ155ZXMnOyB0aGVuCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZmkKCiAgZWNobyAiW29wZW5jb2RlLWRlYnVnXSBDb21wbGV0aW9uIHJlc3BvbnNlIG9uIGF0dGVtcHQgJEFUVEVNUFQ6ICRDT01QTEVUSU9OX1JFU1BPTlNFIgoKICBlY2hvICLimqDvuI8gT3BlbkNvZGUgcmVwb3J0ZWQgdGFzayBpbmNvbXBsZXRlOyByZXRyeWluZy4uLiIKICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKZG9uZQoKaWYgWyAkU1VDQ0VTUyAtbmUgMSBdOyB0aGVuCiAgaWYgWyAiJFVOTElNSVRFRF9SRVRSSUVTIiA9ICIxIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gT3BlbkNvZGUgZGlkIG5vdCBjb25maXJtIHRhc2sgY29tcGxldGlvbiBhZnRlciAkQVRURU1QVCBhdHRlbXB0cyAodW5saW1pdGVkIG1vZGUpIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBPcGVuQ29kZSBkaWQgbm90IGNvbmZpcm0gdGFzayBjb21wbGV0aW9uIGFmdGVyICRNQVhfUkVUUklFUyBhdHRlbXB0cyIKICBmaQogIGVjaG8gIuKdjCBUYXNrIGluY29tcGxldGUgLSBtYXJraW5nIGFzIEZBSUxFRCIKICAKICAjIERpc3BsYXkgdGhlIGxhc3QgcmVjb3JkZWQgcmVhc29uIGZvciBpbmNvbXBsZXRpb24KICBpZiBbIC1uICIkQ09NUExFVElPTl9SRUFTT04iIF07IHRoZW4KICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfkqEgTGFzdCByZXBvcnRlZCByZWFzb24gZm9yIGluY29tcGxldGlvbjoiCiAgICBlY2hvICIkQ09NUExFVElPTl9SRUFTT04iCiAgZmkKICAKICBFWElUX0NPREU9MSAgIyBGQUlMIHRoZSBqb2Igc28gaXQgZG9lc24ndCBhcHBlYXIgc3VjY2Vzc2Z1bAplbHNlCiAgZWNobyAi4pyFIE9wZW5Db2RlIGNvbmZpcm1lZCB0YXNrIGNvbXBsZXRpb24iCiAgaWYgWyAke09QRU5DT0RFX0VYSVQ6LTB9IC1uZSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBPcGVuQ29kZSByZXR1cm5lZCBub24temVybyBleGl0IGNvZGUgJHtPUEVOQ09ERV9FWElUfSwgYnV0IGNvbXBsZXRpb24gcHJvYmUgcGFzc2VkIgogIGZpCiAgRVhJVF9DT0RFPTAKZmkKCmlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogIGVjaG8gIvCflI0gVmVyaWZ5aW5nIHB1bGwgcmVxdWVzdCBzdGF0dXMiCiAgZW5zdXJlX3ByX2NyZWF0ZWQKZWxzZQogIGVjaG8gIuKaoO+4jyBTa2lwcGluZyBhdXRvIFBSIGVuZm9yY2VtZW50IGR1ZSB0byBPcGVuQ29kZSBjb21wbGV0aW9uIHN0YXR1cyIKZmkKCiMgU3VibWl0IEdpdEh1YiBQUiByZXZpZXcgZm9yIENsZW8vVGVzcyBzdGFnZXMgKGVuYWJsZXMgd29ya2Zsb3cgcHJvZ3Jlc3Npb24pCldPUktGTE9XX1NUQUdFPSIke1dPUktGTE9XX1NUQUdFOi19IgppZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInF1YWxpdHkiIF0gfHwgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nIiBdOyB0aGVuCiAgUFJfTlVNPSIke1BSX05VTUJFUjotfSIKICBpZiBbIC16ICIkUFJfTlVNIiBdOyB0aGVuCiAgICAjIFRyeSB0byBnZXQgUFIgbnVtYmVyIGZyb20gY3VycmVudCBicmFuY2gKICAgIENVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAtbiAiJENVUlJFTlRfQlJBTkNIIiBdOyB0aGVuCiAgICAgIFBSX05VTT0kKGdoIHByIGxpc3QgLS1zdGF0ZSBvcGVuIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKICBmaQoKICBpZiBbIC1uICIkUFJfTlVNIiBdOyB0aGVuCiAgICBpZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICAgICAgU1RBR0VfTkFNRT0iUXVhbGl0eSIKICAgICAgU1RBR0VfRU1PSkk9IvCfm6HvuI8iCiAgICAgIENIRUNLU19QQVNTRUQ9JCctIENvZGUgZm9ybWF0dGluZyB2ZXJpZmllZAotIExpbnRpbmcgcGFzc2VkCi0gVW5pdCB0ZXN0cyBzdWNjZXNzZnVsCi0gUXVhbGl0eSBzdGFuZGFyZHMgbWV0JwogICAgICBORVhUX1NUQUdFPSJlbmQtdG8tZW5kIHRlc3RpbmcgYnkgVGVzcyIKICAgICAgCiAgICAgIGlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAidGVzdGluZyIgXTsgdGhlbgogICAgICAgICMgVGVzcyBoYXMgZmluYWwgYXBwcm92YWwgYXV0aG9yaXR5CiAgICAgICAgU1RBR0VfTkFNRT0iUUEgVGVzdGluZyIKICAgICAgICBTVEFHRV9FTU9KST0i8J+nqiIKICAgICAgICBDSEVDS1NfUEFTU0VEPSQnLSBFbmQtdG8tZW5kIHRlc3RzIHBhc3NlZAotIEludGVncmF0aW9uIHRlc3RzIHN1Y2Nlc3NmdWwKLSBBY2NlcHRhbmNlIGNyaXRlcmlhIHZhbGlkYXRlZAotIFByb2R1Y3Rpb24gcmVhZGluZXNzIGNvbmZpcm1lZCcKICAgICAgICBORVhUX1NUQUdFPSJodW1hbiByZXZpZXcgYW5kIG1lcmdlIgogICAgICAgIAogICAgICAgIGVjaG8gIuKchSAkU1RBR0VfTkFNRSBjb21wbGV0ZSAtIHBvc3RpbmcgQVBQUk9WRSByZXZpZXcgKFRlc3MgZmluYWwgYXBwcm92YWwpIgogICAgICAgIFJFVklFV19CT0RZX0ZJTEU9JChta3RlbXApCiAgICAgICAgY2F0IDw8RU9GID4gIiRSRVZJRVdfQk9EWV9GSUxFIgojIyMgJFNUQUdFX0VNT0pJICRTVEFHRV9OQU1FIFJldmlldyAtIEFQUFJPVkVECkFsbCBjaGVja3MgaGF2ZSBwYXNzZWQ6CiRDSEVDS1NfUEFTU0VEClJlYWR5IGZvciAkTkVYVF9TVEFHRS4KCioqRmluYWwgQXBwcm92YWw6KiogVGVzcyBoYXMgdmVyaWZpZWQgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgYXJlIG1ldC4KRU9GCiAgICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLWFwcHJvdmUgLS1ib2R5LWZpbGUgIiRSRVZJRVdfQk9EWV9GSUxFIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCBmYWlsZWQiCiAgICAgICAgcm0gLWYgIiRSRVZJRVdfQk9EWV9GSUxFIgogICAgICBlbHNlCiAgICAgICAgIyBDbGVvIGhhbmRzIG9mZiB0byBUZXNzIHZpYSBjb21tZW50IGFuZCBsYWJlbCAoTk9UIGFwcHJvdmUpCiAgICAgICAgZWNobyAi4pyFICRTVEFHRV9OQU1FIGNoZWNrcyBwYXNzZWQgLSBoYW5kaW5nIG9mZiB0byBUZXNzIgogICAgICAgIFJFVklFV19CT0RZX0ZJTEU9JChta3RlbXApCiAgICAgICAgY2F0IDw8RU9GID4gIiRSRVZJRVdfQk9EWV9GSUxFIgojIyMgJFNUQUdFX0VNT0pJICRTVEFHRV9OQU1FIFJldmlldyAtIFBBU1NFRApBbGwgY2hlY2tzIGhhdmUgcGFzc2VkOgokQ0hFQ0tTX1BBU1NFRAoKKipTdGF0dXM6KiogUmVhZHkgZm9yICRORVhUX1NUQUdFCioqTmV4dCBTdGVwOioqIFRlc3Mgd2lsbCBub3cgcGVyZm9ybSBjb21wcmVoZW5zaXZlIFFBIHZhbGlkYXRpb24KCi0tLQoqUXVhbGl0eSByZXZpZXcgYnkgQ2xlbyoKRU9GCiAgICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgY29tbWVudCAiJFBSX05VTSIgLS1ib2R5LWZpbGUgIiRSRVZJRVdfQk9EWV9GSUxFIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBQUiBjb21tZW50IGNvbW1hbmQgZmFpbGVkIgogICAgICAgIHJtIC1mICIkUkVWSUVXX0JPRFlfRklMRSIKICAgICAgICAKICAgICAgICAjIEFkZCByZWFkeS1mb3ItcWEgbGFiZWwgdG8gc2lnbmFsIFRlc3MKICAgICAgICBlY2hvICLwn4+377iPICBBZGRpbmcgJ3JlYWR5LWZvci1xYScgbGFiZWwgdG8gdHJpZ2dlciBUZXNzIHJldmlldyIKICAgICAgICB0aW1lb3V0IDMwIGdoIHByIGVkaXQgIiRQUl9OVU0iIC0tYWRkLWxhYmVsICJyZWFkeS1mb3ItcWEiIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgcmVhZHktZm9yLXFhIGxhYmVsIgogICAgICBmaQogICAgZWxzZQogICAgICBTVEFHRV9OQU1FPSJRdWFsaXR5IgogICAgICBTVEFHRV9FTU9KST0i8J+boe+4jyIKICAgICAgSVNTVUVTX0RFU0M9JCctIFJldmlldyBjb2RlIGZvcm1hdHRpbmcKLSBGaXggbGludGluZyBlcnJvcnMKLSBFbnN1cmUgdW5pdCB0ZXN0cyBwYXNzCi0gTWVldCBxdWFsaXR5IHN0YW5kYXJkcycKICAgICAgaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nIiBdOyB0aGVuCiAgICAgICAgU1RBR0VfTkFNRT0iUUEgVGVzdGluZyIKICAgICAgICBTVEFHRV9FTU9KST0i8J+nqiIKICAgICAgICBJU1NVRVNfREVTQz0kJy0gRml4IGZhaWxpbmcgZW5kLXRvLWVuZCB0ZXN0cwotIEFkZHJlc3MgaW50ZWdyYXRpb24gdGVzdCBmYWlsdXJlcwotIFZhbGlkYXRlIGFjY2VwdGFuY2UgY3JpdGVyaWEKLSBFbnN1cmUgcHJvZHVjdGlvbiByZWFkaW5lc3MnCiAgICAgIGZpCgogICAgICBlY2hvICLinYwgJFNUQUdFX05BTUUgaXNzdWVzIGRldGVjdGVkIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgICBSRVZJRVdfQk9EWV9GSUxFPSQobWt0ZW1wKQogICAgICBjYXQgPDxFT0YgPiAiJFJFVklFV19CT0RZX0ZJTEUiCiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKJFNUQUdFX05BTUUgaXNzdWVzIGRldGVjdGVkLiBQbGVhc2UgYWRkcmVzcyB0aGUgZm9sbG93aW5nOgokSVNTVUVTX0RFU0MKRU9GCiAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keS1maWxlICIkUkVWSUVXX0JPRFlfRklMRSIgMj4mMSB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgZmFpbGVkIgogICAgICBybSAtZiAiJFJFVklFV19CT0RZX0ZJTEUiCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKEue+4jyBObyBQUiBudW1iZXIgYXZhaWxhYmxlIGZvciAkV09SS0ZMT1dfU1RBR0UgcmV2aWV3IHN1Ym1pc3Npb24iCiAgZmkKZmkKCnRvdWNoIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUgMj4vZGV2L251bGwgfHwgdHJ1ZQoKaWYgWyAkU1VDQ0VTUyAtbmUgMSBdOyB0aGVuCiAge3sjaWYgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlfX0KZWNobyAie3thZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fSIKICB7e2Vsc2V9fQplY2hvICLimqDvuI8gT3BlbkNvZGUgZXhlY3V0aW9uIGluY29tcGxldGUiCiAge3svaWZ9fQogIGV4aXQgJEVYSVRfQ09ERQpmaQoKe3sjaWYgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlfX0KZWNobyAie3thZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fSIKe3tlbHNlfX0KZWNobyAi4pyFIE9wZW5Db2RlIGV4ZWN1dGlvbiBjb21wbGV0ZSIKe3svaWZ9fQpleGl0ICRFWElUX0NPREU= + code_opencode_container-base.sh.hbs: IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp7eyNpZiBhZ2VudF9iYW5uZXJ9fQplY2hvICJ7e2FnZW50X2Jhbm5lcn19Igp7e2Vsc2V9fQplY2hvICLwn5SnIEluaXRpYWxpc2luZyBPcGVuQ29kZSBlbnZpcm9ubWVudCIKe3svaWZ9fQoKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogIC4gIiRIT01FLy5jYXJnby9lbnYiCmZpCgppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgLiAiL3Jvb3QvLmNhcmdvL2VudiIKZmkKCmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogIHJ1c3R1cCBkZWZhdWx0IHN0YWJsZSAyPi9kZXYvbnVsbCB8fCB0cnVlCmZpCgojIFByZWVtcHRpdmVseSBwcnVuZSBzdGFsZSBSdXN0dXAgZG93bmxvYWRzIHRvIGF2b2lkIGJ1bGsgY2xlYW51cCBjb21tYW5kcyBsYXRlcgppZiBbIC1kICIkSE9NRS8ucnVzdHVwL2Rvd25sb2FkcyIgXTsgdGhlbgogIGZpbmQgIiRIT01FLy5ydXN0dXAvZG93bmxvYWRzIiAtbWluZGVwdGggMSAtZGVsZXRlIDI+L2Rldi9udWxsIHx8IHRydWUKZmkKCmVjaG8gIlBBVEg6ICRQQVRIIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUkVUUlkgQ09ORklHVVJBVElPTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KTUFYX1JFVFJJRVNfQ09ORklHPSR7T1BFTkNPREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi0xMH19CmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLilZEgICAgICAgICAgICAgICAgICAgIFJFVFJZIENPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICDilZEiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAiJE1BWF9SRVRSSUVTX0NPTkZJRyIgPSAiMCIgXTsgdGhlbgogIGVjaG8gIvCflIQgTWF4aW11bSBJdGVyYXRpb25zOiBVTkxJTUlURUQgKHdpbGwgcmV0cnkgdW50aWwgY29tcGxldGUpIgplbHNlCiAgZWNobyAi8J+UhCBNYXhpbXVtIEl0ZXJhdGlvbnM6ICRNQVhfUkVUUklFU19DT05GSUciCmZpCmlmIFsgLW4gIiR7T1BFTkNPREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogT1BFTkNPREVfTUFYX1JFVFJJRVMgZW52aXJvbm1lbnQgdmFyaWFibGUiCmVsaWYgWyAtbiAiJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogRVhFQ1VUSU9OX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbHNlCiAgZWNobyAi8J+TjSBTb3VyY2U6IERlZmF1bHQgY29uZmlndXJhdGlvbiIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCmlmIFsgLXogIiR7R0lUSFVCX0FQUF9QUklWQVRFX0tFWTotfSIgXSB8fCBbIC16ICIke0dJVEhVQl9BUFBfSUQ6LX0iIF07IHRoZW4KICBlY2hvICLinYwgTWlzc2luZyBHaXRIdWIgQXBwIGNyZWRlbnRpYWxzIgogIGV4aXQgMQpmaQoKZWNobyAi8J+UkCBBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAiClRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgpwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4iJFRFTVBfS0VZX0ZJTEUiCmNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgpKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCk5PVz0kKGRhdGUgKyVzKQpFWFA9JCgoTk9XICsgNjAwKSkKSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCkpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgpybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgpwYXJzZV9yZXBvKCkgewogIGxvY2FsIGlucHV0PSIkMSIKICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8oW14vXSs/KShcLmdpdCk/JHxcMSBcMnwnCiAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICBlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvKFteL10rPykoXC5naXQpPyR8XDEgXDJ8JwogIGVsc2UKICAgIGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8XC5naXQkfHwnIHwgc2VkIC1FICdzfChbXi9dKykvKFteL10rKXxcMSBcMnwnCiAgZmkKfQoKcmVhZCBSRVBPX09XTkVSIFJFUE9fTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkUkVQT19VUkwiKSIKUkVQT19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7UkVQT19PV05FUn0vJHtSRVBPX05BTUV9LmdpdCIKCklOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtTCBcCiAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCmZpCgppZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIHJlc29sdmUgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogIGV4aXQgMQpmaQoKR0lUSFVCX1RPS0VOPSQoY3VybCAtcyAtWCBQT1NUIFwKICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiIHwganEgLXIgJy50b2tlbicpCgppZiBbICIkR0lUSFVCX1RPS0VOIiA9ICJudWxsIiBdIHx8IFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICBlY2hvICLinYwgVW5hYmxlIHRvIG9idGFpbiBpbnN0YWxsYXRpb24gdG9rZW4iCiAgZXhpdCAxCmZpCgpleHBvcnQgR0lUSFVCX1RPS0VOCmV4cG9ydCBHSF9UT0tFTj0iJEdJVEhVQl9UT0tFTiIKZXhwb3J0IEdIX0hPU1Q9ImdpdGh1Yi5jb20iCgpleHBvcnQgR0lUX0NPTkZJR19HTE9CQUw9L3dvcmtzcGFjZS8uZ2l0Y29uZmlnCkNSRURFTlRJQUxTX0ZJTEU9L3dvcmtzcGFjZS8uZ2l0LWNyZWRlbnRpYWxzCm1rZGlyIC1wIC93b3Jrc3BhY2UKCmdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciAic3RvcmUgLS1maWxlPSRDUkVERU5USUFMU19GSUxFIgoKd3JpdGVfZ2l0X2NyZWRlbnRpYWxzKCkgewogIGlmIFsgLXogIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICByZXR1cm4KICBmaQogIHByaW50ZiAnaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjolc0BnaXRodWIuY29tXG4nICIkR0lUSFVCX1RPS0VOIiA+IiRDUkVERU5USUFMU19GSUxFIgogIGNobW9kIDYwMCAiJENSRURFTlRJQUxTX0ZJTEUiIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKd3JpdGVfZ2l0X2NyZWRlbnRpYWxzCgpUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykKCnJlZnJlc2hfZ2l0aHViX3Rva2VuKCkgewogIGVjaG8gIvCflIQgUmVmcmVzaGluZyBHaXRIdWIgQXBwIHRva2VuLi4uIgoKICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LSQkIgogIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIE5PVz0kKGRhdGUgKyVzKQogIEVYUD0kKChOT1cgKyA2MDApKQogIEpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgSldUX1RPS0VOPSIkSldUX0hFQURFUi4kSldUX1BBWUxPQUQuJEpXVF9TSUdOQVRVUkUiCgogIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICBpZiBbICIkTkVXX0lOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkTkVXX0lOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgTkVXX0lOU1RBTExBVElPTl9JRD0kKGN1cmwgLXMgLUwgXAogICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQogIGZpCgogIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kTkVXX0lOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgTkVXX1RPS0VOPSQoZWNobyAiJFRPS0VOX1JFU1BPTlNFIiB8IGpxIC1yICcudG9rZW4nKQoKICBpZiBbICIkTkVXX1RPS0VOIiAhPSAibnVsbCIgXSAmJiBbIC1uICIkTkVXX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgZXhwb3J0IEdIX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCiAgICB3cml0ZV9naXRfY3JlZGVudGlhbHMKCiAgICBpZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBwcmludGYgJyVzXG4nICIkTkVXX1RPS0VOIiB8IHRpbWVvdXQgMTAgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gLS1ob3N0bmFtZSAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICAgIGdoIGF1dGggc2V0dXAtZ2l0ID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQoKICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQiCiAgICByZXR1cm4gMAogIGZpCgogIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogIHJldHVybiAxCn0KCnJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuIHx8IHRydWUKICAgIHJldHVybgogIGZpCgogIE5PVz0kKGRhdGUgKyVzKQogIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgZWNobyAi8J+UhCBUb2tlbiBhZ2U6ICQoKFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyDigJQgcmVmcmVzaGluZyIKICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuIHx8IHRydWUKICBmaQp9CgpzdG9wX2RvY2tlcl9zaWRlY2FyKCkgewogIGlmIFsgISAtUyAvdmFyL3J1bi9kb2NrZXIuc29jayBdOyB0aGVuCiAgICByZXR1cm4KICBmaQoKICBlY2hvICLwn5uRIFN0b3BwaW5nIERvY2tlciBzaWRlY2FyIgoKICBpZiBjb21tYW5kIC12IHBraWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcGtpbGwgZG9ja2VyZCA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogIGVsaWYgY29tbWFuZCAtdiBraWxsYWxsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAga2lsbGFsbCBkb2NrZXJkID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgZWxzZQogICAgUElEPSQocGlkb2YgZG9ja2VyZCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRCIgXTsgdGhlbgogICAgICBraWxsICIkUElEIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBmaQp9Cgp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCmVuc3VyZV9naF9hdXRoZW50aWNhdGVkKCkgewogIGlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBHaXRIdWIgQ0xJIChnaCkgbm90IGZvdW5kOyBza2lwcGluZyBhdXRoZW50aWNhdGlvbiIKICAgIHJldHVybiAwCiAgZmkKCiAgaWYgISBnaCBhdXRoIHN0YXR1cyAtaCAiJEdIX0hPU1QiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi8J+UkCBMb2dnaW5nIGluIHRvIEdpdEh1YiBDTEkgZm9yIGhvc3QgJEdIX0hPU1QiCiAgICBpZiAhIHByaW50ZiAnJXNcbicgIiRHSVRIVUJfVE9LRU4iIHwgdGltZW91dCAxMCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAtLWhvc3RuYW1lICIkR0hfSE9TVCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBnaCBhdXRoIGxvZ2luIHJldHVybmVkIG5vbi16ZXJvIG9yIHRpbWVkIG91dDsgY29udGludWluZyB3aXRoIEdIX1RPS0VOIGVudiIKICAgIGZpCiAgZmkKCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogIGdoIGF1dGggc2V0dXAtZ2l0ID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCgogIGlmIGdoIGF1dGggc3RhdHVzIC1oICIkR0hfSE9TVCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinIUgR2l0SHViIENMSSBhdXRoZW50aWNhdGVkIGZvciAkR0hfSE9TVCIKICBlbHNlCiAgICBlY2hvICLimqDvuI8gVW5hYmxlIHRvIGNvbmZpcm0gR2l0SHViIENMSSBhdXRoOyBHSF9UT0tFTiB3aWxsIHN0aWxsIGJlIHVzZWQgZm9yIGdpdCBvcGVyYXRpb25zIgogIGZpCn0KCmVuc3VyZV9naF9hdXRoZW50aWNhdGVkCgplbnN1cmVfcHJfY3JlYXRlZCgpIHsKICBpZiBbICIke1NLSVBfQVVUT19QUjotMH0iID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIuKPre+4jyAgQXV0byBQUiBjcmVhdGlvbiBkaXNhYmxlZCB2aWEgU0tJUF9BVVRPX1BSPTEiCiAgICByZXR1cm4KICBmaQoKICBpZiBbICEgLWQgLmdpdCBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gUmVwb3NpdG9yeSBub3QgaW5pdGlhbGlzZWQ7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8gR2l0SHViIENMSSBub3QgYXZhaWxhYmxlOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBpZiBbIC16ICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIEdJVEhVQl9UT0tFTiBub3Qgc2V0OyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgQ1VSUkVOVF9CUkFOQ0g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHByaW50ZiAnJykKICBpZiBbIC16ICIkQ1VSUkVOVF9CUkFOQ0giIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnQgYnJhbmNoOyBza2lwcGluZyBhdXRvIFBSIGNyZWF0aW9uIgogICAgcmV0dXJuCiAgZmkKCiAgUFJfREFUQT0kKGdoIHByIGxpc3QgLS1zdGF0ZSBvcGVuIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tbGltaXQgMSAyPi9kZXYvbnVsbCB8fCBlY2hvICJbXSIpCiAgaWYgWyAiJChwcmludGYgJyVzJyAiJFBSX0RBVEEiIHwganEgJ2xlbmd0aCcgMj4vZGV2L251bGwgfHwgZWNobyAwKSIgLWd0IDAgXTsgdGhlbgogICAgZWNobyAi4pyFIFB1bGwgcmVxdWVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgYnJhbmNoICRDVVJSRU5UX0JSQU5DSCIKICAgIHJldHVybgogIGZpCgogIEJBU0VfQlJBTkNIPSIke1BSX0JBU0VfQlJBTkNIOi1tYWlufSIKICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICBpZiAhIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0ICJyZWZzL3JlbW90ZXMvJFJFTU9URV9CQVNFIjsgdGhlbgogICAgaWYgZ2l0IHNob3ctcmVmIC0tdmVyaWZ5IC0tcXVpZXQgInJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIjsgdGhlbgogICAgICBCQVNFX0JSQU5DSD0ibWFzdGVyIgogICAgICBSRU1PVEVfQkFTRT0ib3JpZ2luLyRCQVNFX0JSQU5DSCIKICAgIGVsc2UKICAgICAgREVGQVVMVF9SRU1PVEU9JChnaXQgc3ltYm9saWMtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCAyPi9kZXYvbnVsbCB8IHNlZCAnc0BecmVmcy9yZW1vdGVzL29yaWdpbi9AQCcpCiAgICAgIGlmIFsgLW4gIiRERUZBVUxUX1JFTU9URSIgXTsgdGhlbgogICAgICAgIEJBU0VfQlJBTkNIPSIkREVGQVVMVF9SRU1PVEUiCiAgICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICAgIGVsc2UKICAgICAgICBSRU1PVEVfQkFTRT0iIgogICAgICBmaQogICAgZmkKICBmaQoKICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgaWYgWyAtbiAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgICBnaXQgZmV0Y2ggb3JpZ2luICIkQkFTRV9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgZmkKCiAgaWYgWyAiJENVUlJFTlRfQlJBTkNIIiA9ICJIRUFEIiBdIHx8IFsgIiRDVVJSRU5UX0JSQU5DSCIgPSAiJEJBU0VfQlJBTkNIIiBdOyB0aGVuCiAgICBBVVRPX0JSQU5DSD0idGFzay17e3Rhc2tfaWR9fS17e3NlcnZpY2V9fS0kKGRhdGUgKyVZJW0lZC0lSCVNJVMpIgogICAgZWNobyAi4pqg77iPIEJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0ggdW5zdWl0YWJsZSBmb3IgUFI7IGNyZWF0aW5nICRBVVRPX0JSQU5DSCIKICAgIGlmICEgZ2l0IGNoZWNrb3V0IC1CICIkQVVUT19CUkFOQ0giID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNyZWF0ZSBmYWxsYmFjayBicmFuY2ggJEFVVE9fQlJBTkNIIgogICAgICByZXR1cm4KICAgIGZpCiAgICBDVVJSRU5UX0JSQU5DSD0iJEFVVE9fQlJBTkNIIgogIGZpCgogIGdpdCBhZGQgLgogIGlmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQgLS1leGl0LWNvZGU7IHRoZW4KICAgIGVjaG8gIuKEue+4jyBObyBzdGFnZWQgY2hhbmdlcyBkZXRlY3RlZCBhZnRlciBhdXRvLXN0YWdpbmciCiAgZWxzZQogICAgQ09NTUlUX01TRz0iY2hvcmUoe3tzZXJ2aWNlfX0pOiBhdXRvLWNvbW1pdCBmb3IgdGFzayB7e3Rhc2tfaWR9fSIKICAgIGlmICEgZ2l0IGNvbW1pdCAtbSAiJENPTU1JVF9NU0ciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGNvbW1pdCBzdGFnZWQgY2hhbmdlcyBhdXRvbWF0aWNhbGx5IgogICAgZWxzZQogICAgICBlY2hvICLinIUgQXV0by1jb21taXR0ZWQgc3RhZ2VkIGNoYW5nZXMiCiAgICBmaQogIGZpCgogIGlmIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgLS1xdWlldCAiJENVUlJFTlRfQlJBTkNIIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkIHx8IHRydWUKICAgIGlmICEgZ2l0IHB1c2ggLXUgb3JpZ2luICIkQ1VSUkVOVF9CUkFOQ0giID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHB1c2ggYnJhbmNoICRDVVJSRU5UX0JSQU5DSDsgc2tpcHBpbmcgYXV0byBQUiBjcmVhdGlvbiIKICAgICAgcmV0dXJuCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBVbmFibGUgdG8gdmVyaWZ5IGJyYW5jaCAkQ1VSUkVOVF9CUkFOQ0g7IHNraXBwaW5nIGF1dG8gUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBnaXQgZmV0Y2ggb3JpZ2luICIkQ1VSUkVOVF9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgaWYgWyAtbiAiJFJFTU9URV9CQVNFIiBdOyB0aGVuCiAgICBBSEVBRF9DT1VOVD0kKGdpdCByZXYtbGlzdCAtLWxlZnQtcmlnaHQgIiRSRU1PVEVfQkFTRS4uLiRDVVJSRU5UX0JSQU5DSCIgMj4vZGV2L251bGwgfCBhd2sgJy9ePi97YysrfSBFTkR7cHJpbnQgYyswfScpCiAgZWxzZQogICAgQUhFQURfQ09VTlQ9MQogIGZpCiAgaWYgWyAiJHtBSEVBRF9DT1VOVDotMH0iIC1lcSAwIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBCcmFuY2ggJENVUlJFTlRfQlJBTkNIIGhhcyBubyBjb21taXRzIGFoZWFkIG9mICRCQVNFX0JSQU5DSDsgc2tpcHBpbmcgUFIgY3JlYXRpb24iCiAgICByZXR1cm4KICBmaQoKICBSVU5fTEFCRUw9InJ1bi17e3dvcmtmbG93X25hbWV9fSIKICBpZiBbICIke1JVTl9MQUJFTCNydW4tfSIgPSAiIiBdOyB0aGVuCiAgICBSVU5fTEFCRUw9InJ1bi11bmtub3duIgogIGZpCgogIFRBU0tfTEFCRUw9InRhc2ste3t0YXNrX2lkfX0iCiAgU0VSVklDRV9MQUJFTD0ic2VydmljZS17e3NlcnZpY2V9fSIKICBSRVBPX1NMVUc9IiR7UkVQT19PV05FUn0vJHtSRVBPX05BTUV9IgoKICBlY2hvICLwn5SNIEVuc3VyaW5nIFBSIGNvcnJlbGF0aW9uIGxhYmVscyBleGlzdCIKICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiICIkUlVOX0xBQkVMIjsgZG8KICAgIGlmIFsgLXogIiRsYWJlbCIgXTsgdGhlbgogICAgICBjb250aW51ZQogICAgZmkKCiAgICBpZiBnaCBsYWJlbCB2aWV3ICIkbGFiZWwiIC1SICIkUkVQT19TTFVHIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAiICAg4pyTIExhYmVsICckbGFiZWwnIGFscmVhZHkgZXhpc3RzIgogICAgICBjb250aW51ZQogICAgZmkKCiAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgIHNlcnZpY2UtKikgQ09MT1I9IjBlOGExNiI7IERFU0M9IlNlcnZpY2UgY29ycmVsYXRpb24iIDs7CiAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgY29ycmVsYXRpb24iIDs7CiAgICAgICopIENPTE9SPSJlZGVkZWQiOyBERVNDPSJBdXRvbWF0aW9uIGxhYmVsIiA7OwogICAgZXNhYwoKICAgIGlmIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgPi90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZyAyPiYxOyB0aGVuCiAgICAgIGVjaG8gIiAgIOKchSBDcmVhdGVkIGxhYmVsICckbGFiZWwnIgogICAgZWxzZQogICAgICBlY2hvICIgICDinYwgRmFpbGVkIHRvIGNyZWF0ZSBsYWJlbCAnJGxhYmVsJyIKICAgICAgY2F0IC90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZyA+JjIgfHwgdHJ1ZQogICAgZmkKICAgIHJtIC1mIC90bXAvZ2gtbGFiZWwtY3JlYXRlLmxvZwogIGRvbmUKCiAgUFJfVElUTEU9ImZlYXQoe3tzZXJ2aWNlfX0pOiBjb21wbGV0ZSB0YXNrIHt7dGFza19pZH19IgogIHJlYWQgLXIgLWQgJycgUFJfQk9EWSA8PCdFT0YnIHx8IHRydWUKIyMgU3VtbWFyeQotIEF1dG8tZ2VuZXJhdGVkIGZhbGxiYWNrIFBSIGJlY2F1c2UgdGhlIE9wZW5Db2RlIGFnZW50IGZpbmlzaGVkIHdpdGhvdXQgb3BlbmluZyBvbmUKLSBUYXNrIHt7dGFza19pZH19IGZvciBzZXJ2aWNlIHt7c2VydmljZX19IGlzIHJlYWR5IGZvciByZXZpZXcKCiMjIE1ldGFkYXRhCi0gQWdlbnQ6IHt7Z2l0aHViX2FwcH19Ci0gV29ya2Zsb3c6IHt7d29ya2Zsb3dfbmFtZX19Ci0gQnJhbmNoOiBcYCRDVVJSRU5UX0JSQU5DSFxgIOKGkiBcYCRCQVNFX0JSQU5DSFxgCgpfVGhpcyBQUiB3YXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBPcGVuQ29kZSBjb250YWluZXIuXwpFT0YKCiAgTEFCRUxfQVJHUz0oIi0tdGl0bGUiICIkUFJfVElUTEUiICItLWJvZHkiICIkUFJfQk9EWSIgIi0tYmFzZSIgIiRCQVNFX0JSQU5DSCIgIi0taGVhZCIgIiRDVVJSRU5UX0JSQU5DSCIpCgogICMgQ3JlYXRlIFBSIGZpcnN0IHdpdGhvdXQgbGFiZWxzLCB0aGVuIGFkZCBsYWJlbHMgc2VwYXJhdGVseQogICMgVGhpcyBwcmV2ZW50cyB0aGUgZW50aXJlIFBSIGNyZWF0aW9uIGZyb20gZmFpbGluZyBpZiBhIGxhYmVsIGRvZXNuJ3QgZXhpc3QKICBpZiBQUl9VUkw9JChnaCBwciBjcmVhdGUgIiR7TEFCRUxfQVJHU1tAXX0iIDI+JjEpOyB0aGVuCiAgICBlY2hvICLinIUgQXV0by1jcmVhdGVkIHB1bGwgcmVxdWVzdDogJFBSX1VSTCIKICAgIAogICAgIyBOb3cgYWRkIGxhYmVscyBvbmUgYnkgb25lIChub24tY3JpdGljYWwgaWYgdGhleSBmYWlsKQogICAgZm9yIGxhYmVsIGluICIkVEFTS19MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIiAiJFJVTl9MQUJFTCI7IGRvCiAgICAgIGlmIFsgLXogIiRsYWJlbCIgXTsgdGhlbgogICAgICAgIGNvbnRpbnVlCiAgICAgIGZpCiAgICAgIAogICAgICAjIFRyeSB0byBjcmVhdGUgbGFiZWwgaWYgaXQgZG9lc24ndCBleGlzdAogICAgICBpZiAhIGdoIGxhYmVsIHZpZXcgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGNhc2UgIiRsYWJlbCIgaW4KICAgICAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgcnVuLSopIENPTE9SPSIwMzY2ZDYiOyBERVNDPSJXb3JrZmxvdyBjb3JyZWxhdGlvbiIgOzsKICAgICAgICAgICopIENPTE9SPSJlZGVkZWQiOyBERVNDPSJBdXRvbWF0aW9uIGxhYmVsIiA7OwogICAgICAgIGVzYWMKICAgICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICAgIGZpCiAgICAgIAogICAgICAjIEFkZCBsYWJlbCB0byBQUiAoY29udGludWUgZXZlbiBpZiBpdCBmYWlscykKICAgICAgaWYgZ2ggcHIgZWRpdCAiJENVUlJFTlRfQlJBTkNIIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBlY2hvICIgICDinJMgQWRkZWQgbGFiZWw6ICRsYWJlbCIKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgIOKaoO+4jyBDb3VsZCBub3QgYWRkIGxhYmVsOiAkbGFiZWwgKFBSIHN0aWxsIGNyZWF0ZWQpIgogICAgICBmaQogICAgZG9uZQogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gY3JlYXRlIHB1bGwgcmVxdWVzdDogJFBSX1VSTCIKICAgIGVjaG8gIiAgIFRoaXMgbWF5IGJlIGJlY2F1c2UgYSBQUiBhbHJlYWR5IGV4aXN0cyBvciB0aGVyZSdzIGFuIGF1dGhlbnRpY2F0aW9uIGlzc3VlIgogIGZpCn0KCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCmRlcml2ZV9ib3RfaWRlbnRpdHkoKSB7CiAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICBpZiBbIC16ICIkYXBwX25hbWUiIF0gfHwgWyAiJGFwcF9uYW1lIiA9ICJudWxsIiBdOyB0aGVuCiAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dG9tYXRpb25bYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICByZXR1cm4KICBmaQoKICBsb2NhbCBzbHVnCiAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScgfCBzZWQgLUUgJ3MvW15hLXowLTldKy8tL2cnIHwgc2VkIC1FICdzL14tK3wtKyQvL2cnKQogIGlmIFsgLXogIiRzbHVnIiBdOyB0aGVuCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKICBmaQoKICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICBsb2NhbCBib3RfZW1haWw9IiR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCgogIGlmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICBsb2NhbCBlbmNvZGVkX2xvZ2luCiAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgIGxvY2FsIGJvdF9yZXNwb25zZQogICAgYm90X3Jlc3BvbnNlPSQoY3VybCAtc1MgLUggIkF1dGhvcml6YXRpb246IHRva2VuICRHSVRIVUJfVE9LRU4iIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvJHtlbmNvZGVkX2xvZ2lufSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGxvY2FsIGJvdF9pZAogICAgYm90X2lkPSQocHJpbnRmICclcycgIiRib3RfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyBlbXB0eScgMj4vZGV2L251bGwgfHwgZWNobyAnJykKICAgIGlmIFsgLW4gIiRib3RfaWQiIF07IHRoZW4KICAgICAgYm90X2VtYWlsPSIke2JvdF9pZH0rJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKICAgIGZpCiAgZmkKCiAgR0lUX0FVVEhPUl9OQU1FPSIkYm90X2xvZ2luIgogIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgoKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRQpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTApleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfVEVSTUlOQUxfUFJPTVBUPTAKZXhwb3J0IEdJVF9BU0tQQVNTPS9iaW4vdHJ1ZQpleHBvcnQgU1NIX0FTS1BBU1M9L2Jpbi90cnVlCiMgUmVwb3NpdG9yeSBjaGVja291dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgLXogIiRXT1JLX0RJUiIgXSB8fCBbICIkV09SS19ESVIiID0gIm51bGwiIF07IHRoZW4KICBXT1JLX0RJUj0ie3tzZXJ2aWNlfX0iCmZpCgpUQVJHRVRfRElSPSIvd29ya3NwYWNlLyRXT1JLX0RJUiIKbWtkaXIgLXAgIiRUQVJHRVRfRElSIgpjZCAvd29ya3NwYWNlCgpSRVBPX1JPT1Q9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAiJFJFUE9fUk9PVCIKCmlmIFsgLWQgIiRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogIGVjaG8gIvCflIEgUmVwb3NpdG9yeSBhbHJlYWR5IGNsb25lZCwgZmV0Y2hpbmcgbGF0ZXN0IgogIGNkICIkUkVQT19OQU1FIgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgZ2l0IGZldGNoIC0tYWxsIC0tcHJ1bmUKZWxzZQogIGVjaG8gIuKsh++4jyAgQ2xvbmluZyByZXBvc2l0b3J5IgogIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgZ2l0IGNsb25lICIkUkVQT19IVFRQX1VSTCIKICBjZCAiJFJFUE9fTkFNRSIKZmkKCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgIiRSRVBPX1JPT1QiCmNkICIkUkVQT19ST09UIgoKIyBSZW1vdmUgc3RhbGUgYXV0b21hdGlvbi1tYW5hZ2VkIGZpbGVzIHRoYXQgYmxvY2sgYnJhbmNoIGNoZWNrb3V0IHdoZW4gcmVydW5uaW5nCk1BTkFHRURfUEFUSFM9KAogICIubWNwLmpzb24iCiAgIkFHRU5UUy5tZCIKICAiY2xpZW50LWNvbmZpZy5qc29uIgogICJjb2RpbmctZ3VpZGVsaW5lcy5tZCIKICAiZ2l0aHViLWd1aWRlbGluZXMubWQiCiAgInRhc2siCikKCmZvciBtYW5hZ2VkX3BhdGggaW4gIiR7TUFOQUdFRF9QQVRIU1tAXX0iOyBkbwogIGlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggIiRtYW5hZ2VkX3BhdGgiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY29udGludWUKICBmaQogIGlmIFsgLWUgIiRtYW5hZ2VkX3BhdGgiIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgUmVtb3Zpbmcgc3RhbGUgZmlsZSB0byBhbGxvdyBjaGVja291dDogJG1hbmFnZWRfcGF0aCIKICAgIHJtIC1yZiAiJG1hbmFnZWRfcGF0aCIKICBmaQpkb25lCgpCQVNFX0JSQU5DSD0iJHtQUl9CQVNFX0JSQU5DSDotbWFpbn0iClJFTU9URV9CQVNFPSJvcmlnaW4vJEJBU0VfQlJBTkNIIgoKaWYgISBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICBpZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiOyB0aGVuCiAgICBCQVNFX0JSQU5DSD0ibWFzdGVyIgogICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgZWxzZQogICAgREVGQVVMVF9SRU1PVEU9JChnaXQgc3ltYm9saWMtcmVmIHJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCAyPi9kZXYvbnVsbCB8IHNlZCAnc0BecmVmcy9yZW1vdGVzL29yaWdpbi9AQCcpCiAgICBpZiBbIC1uICIkREVGQVVMVF9SRU1PVEUiIF07IHRoZW4KICAgICAgQkFTRV9CUkFOQ0g9IiRERUZBVUxUX1JFTU9URSIKICAgICAgUkVNT1RFX0JBU0U9Im9yaWdpbi8kQkFTRV9CUkFOQ0giCiAgICBlbHNlCiAgICAgIFJFTU9URV9CQVNFPSIiCiAgICBmaQogIGZpCmZpCgppZiBbIC1uICIkQkFTRV9CUkFOQ0giIF07IHRoZW4KICBnaXQgZmV0Y2ggb3JpZ2luICIkQkFTRV9CUkFOQ0giID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCmZpCgpGRUFUVVJFX0JSQU5DSD0iZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uIgppZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9oZWFkcy8kRkVBVFVSRV9CUkFOQ0giOyB0aGVuCiAgZWNobyAiRmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZXhpc3RzLCBjaGVja2luZyBvdXQuLi4iCiAgIyBTdGFzaCBhbnkgbG9jYWwgY2hhbmdlcyBmcm9tIHByZXZpb3VzIHJ1bnMgdG8gYXZvaWQgY2hlY2tvdXQgY29uZmxpY3RzCiAgaWYgISBnaXQgZGlmZi1pbmRleCAtLXF1aWV0IEhFQUQgLS0gfHwgWyAtbiAiJChnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS1leGNsdWRlLXN0YW5kYXJkKSIgXTsgdGhlbgogICAgZWNobyAi8J+UhCBTdGFzaGluZyBsb2NhbCBjaGFuZ2VzIGFuZCB1bnRyYWNrZWQgZmlsZXMgYmVmb3JlIGNoZWNrb3V0IgogICAgZ2l0IHN0YXNoIHB1c2ggLS1pbmNsdWRlLXVudHJhY2tlZCAtbSAiQXV0by1zdGFzaCBiZWZvcmUgY2hlY2tvdXQgKCQoZGF0ZSAtdSArJVklbSVkLSVIJU0lUykpIiB8fCB0cnVlCiAgZmkKICBnaXQgY2hlY2tvdXQgIiRGRUFUVVJFX0JSQU5DSCIKICBpZiBbIC1uICIkUkVNT1RFX0JBU0UiIF07IHRoZW4KICAgIGVjaG8gIvCfk6UgRmFzdC1mb3J3YXJkaW5nICRGRUFUVVJFX0JSQU5DSCB3aXRoICRSRU1PVEVfQkFTRSIKICAgIGlmICEgZ2l0IG1lcmdlICIkUkVNT1RFX0JBU0UiIC0tZmYtb25seSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIFVuYWJsZSB0byBmYXN0LWZvcndhcmQgJEZFQVRVUkVfQlJBTkNIOyBjcmVhdGluZyBmcmVzaCBicmFuY2ggZnJvbSAkUkVNT1RFX0JBU0UiCiAgICAgIE5FV19CUkFOQ0g9IiR7RkVBVFVSRV9CUkFOQ0h9LSQoZGF0ZSAtdSArJVklbSVkJUglTSVTKSIKICAgICAgZ2l0IGNoZWNrb3V0IC1CICIkTkVXX0JSQU5DSCIgIiRSRU1PVEVfQkFTRSIKICAgICAgRkVBVFVSRV9CUkFOQ0g9IiRORVdfQlJBTkNIIgogICAgZmkKICBmaQplbHNlCiAgZWNobyAiQ3JlYXRpbmcgbmV3IGZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIgogIGlmIFsgLW4gIiRSRU1PVEVfQkFTRSIgXSAmJiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCAicmVmcy9yZW1vdGVzLyRSRU1PVEVfQkFTRSI7IHRoZW4KICAgIGdpdCBjaGVja291dCAtYiAiJEZFQVRVUkVfQlJBTkNIIiAiJFJFTU9URV9CQVNFIgogIGVsc2UKICAgIGdpdCBjaGVja291dCAtYiAiJEZFQVRVUkVfQlJBTkNIIgogIGZpCmZpCgpnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCmdpdCBjb25maWcgLS1sb2NhbCBwdXNoLmF1dG9TZXR1cFJlbW90ZSB0cnVlCmV4cG9ydCBJTVBMRU1FTlRBVElPTl9CUkFOQ0g9IiRGRUFUVVJFX0JSQU5DSCIKZWNobyAi4pyTIFVzaW5nIGZlYXR1cmUgYnJhbmNoOiAkRkVBVFVSRV9CUkFOQ0ggKGJhc2U6ICR7QkFTRV9CUkFOQ0g6LXVua25vd259KSIKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5OiB1c2UgcmVwbyByb290IGlmIHdvcmtpbmdfZGlyZWN0b3J5IGlzICIuIiBvciBlbXB0eQppZiBbICIkV09SS19ESVIiID0gIi4iIF0gfHwgWyAteiAiJFdPUktfRElSIiBdIHx8IFsgIiRXT1JLX0RJUiIgPSAibnVsbCIgXTsgdGhlbgogIE9QRU5DT0RFX1dPUktfRElSPSIkUkVQT19ST09UIgplbHNlCiAgT1BFTkNPREVfV09SS19ESVI9IiRSRVBPX1JPT1QvJFdPUktfRElSIgogIG1rZGlyIC1wICIkT1BFTkNPREVfV09SS19ESVIiCmZpCgpjZCAiJE9QRU5DT0RFX1dPUktfRElSIgplY2hvICLinJMgV29ya2luZyBkaXJlY3Rvcnk6ICRPUEVOQ09ERV9XT1JLX0RJUiIKCmVjaG8gIvCfk6YgZ2l0IHN0YXR1cyIKcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKZ2l0IHN0YXR1cyAtLXNob3J0IHx8IHRydWUKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1hdGVyaWFsaXNlIHRhc2sgY29udGV4dAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmVjaG8gIvCfp7EgU3luY2luZyB0YXNrIGFzc2V0cyIKbWtkaXIgLXAgIiRPUEVOQ09ERV9XT1JLX0RJUi90YXNrIgpjcCAtUiAvdGFzay1maWxlcy90YXNrLyogIiRPUEVOQ09ERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQoKRE9DU19SRVBPX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCkRPQ1NfQlJBTkNIPSJ7e2RvY3NfYnJhbmNofX0iCkRPQ1NfUFJPSkVDVF9ESVJFQ1RPUlk9Int7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgoKaWYgWyAtbiAiJERPQ1NfUkVQT19VUkwiIF0gJiYgWyAiJERPQ1NfUkVQT19VUkwiICE9ICJudWxsIiBdOyB0aGVuCiAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICBpZiBbIC16ICIkRE9DU19CUkFOQ0giIF0gfHwgWyAiJERPQ1NfQlJBTkNIIiA9ICJudWxsIiBdOyB0aGVuCiAgICBET0NTX0JSQU5DSD0ibWFpbiIKICBmaQoKICBlY2hvICLwn5OaIFN5bmNpbmcgZG9jcyByZXBvc2l0b3J5OiAkRE9DU19SRVBPX1VSTCAoYnJhbmNoOiAkRE9DU19CUkFOQ0gpIgogIERPQ1NfQ0xPTkVfRElSPSIvdG1wL2RvY3MtcmVwbyIKICBybSAtcmYgIiRET0NTX0NMT05FX0RJUiIKCiAgcmVhZCBET0NTX09XTkVSIERPQ1NfTkFNRSA8PDwiJChwYXJzZV9yZXBvICIkRE9DU19SRVBPX1VSTCIpIgogIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS8ke0RPQ1NfT1dORVJ9LyR7RE9DU19OQU1FfS5naXQiCgogIGlmIGdpdCBjbG9uZSAtLXF1aWV0IC0tYnJhbmNoICIkRE9DU19CUkFOQ0giIC0tc2luZ2xlLWJyYW5jaCAiJERPQ1NfSFRUUF9VUkwiICIkRE9DU19DTE9ORV9ESVIiOyB0aGVuCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCIKICAgIERPQ1NfQkFTRV9QQVRIPSIkRE9DU19DTE9ORV9ESVIvLnRhc2ttYXN0ZXIiCiAgICBpZiBbIC1uICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgXSAmJiBbICIkRE9DU19QUk9KRUNUX0RJUkVDVE9SWSIgIT0gIm51bGwiIF07IHRoZW4KICAgICAgRE9DU19CQVNFX1BBVEg9IiRET0NTX0NMT05FX0RJUi8kRE9DU19QUk9KRUNUX0RJUkVDVE9SWS8udGFza21hc3RlciIKICAgIGZpCgogICAgZWNobyAi8J+UjSBEb2NzIGJhc2UgcGF0aDogJERPQ1NfQkFTRV9QQVRIIgogICAgVEFTS19ESVI9IiRET0NTX0JBU0VfUEFUSC9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCgogIGlmIFsgLWQgIiRUQVNLX0RJUiIgXTsgdGhlbgogICAgZWNobyAi4pyTIENvcHlpbmcgdGFzayBkZWZpbml0aW9uIGZyb20gJFRBU0tfRElSIgogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQKICAgIGNwIC1SICIkVEFTS19ESVIiLy4gIiRPUEVOQ09ERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxzZQogICAgICBlY2hvICLinYwgQ1JJVElDQUw6IFRhc2sgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAkVEFTS19ESVIiCiAgICBmaQoKICAgIGlmIFsgLWYgIiRET0NTX0JBU0VfUEFUSC90YXNrcy5qc29uIiBdOyB0aGVuCiAgICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkCiAgICAgIGNwICIkRE9DU19CQVNFX1BBVEgvdGFza3MuanNvbiIgIiRPUEVOQ09ERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQpmaQppZiBbIC1mIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCAiJE9QRU5DT0RFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRPUEVOQ09ERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCiMgQUdFTlRTLm1kIE1lbW9yeSBQZXJzaXN0ZW5jZSBMb2dpYyAoY29udHJvbGxlZCBieSBvdmVyd3JpdGVNZW1vcnkgQ1JEIGZpZWxkKQpPVkVSV1JJVEVfTUVNT1JZPSJ7e292ZXJ3cml0ZV9tZW1vcnl9fSIKCiMgSGFuZGxlIEFHRU5UUy5tZCBiYXNlZCBvbiBvdmVyd3JpdGVNZW1vcnkgc2V0dGluZwppZiBbICIkT1ZFUldSSVRFX01FTU9SWSIgPSAidHJ1ZSIgXTsgdGhlbgogICMgT3ZlcndyaXRlIG1vZGU6IEFsd2F5cyByZXBsYWNlIEFHRU5UUy5tZCB3aXRoIGZyZXNoIHRlbXBsYXRlCiAgaWYgWyAtZiAvdGFzay1maWxlcy9BR0VOVFMubWQgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvQUdFTlRTLm1kICIkT1BFTkNPREVfV09SS19ESVIvQUdFTlRTLm1kIgogICAgZWNobyAi4pyTIE92ZXJ3cm90ZSBBR0VOVFMubWQgbWVtb3J5IGZpbGUgKGZyZXNoIHN0YXJ0IHJlcXVlc3RlZCkiCiAgZmkKZWxzZQogICMgUHJlc2VydmUgbW9kZSAoZGVmYXVsdCk6IE9ubHkgY29weSBpZiBkb2Vzbid0IGV4aXN0CiAgaWYgWyAhIC1mICIkT1BFTkNPREVfV09SS19ESVIvQUdFTlRTLm1kIiBdOyB0aGVuCiAgICAjIEluaXRpYWwgY3JlYXRpb24gLSBjb3B5IGZyb20gQ29uZmlnTWFwCiAgICBpZiBbIC1mIC90YXNrLWZpbGVzL0FHRU5UUy5tZCBdOyB0aGVuCiAgICAgIGNwIC90YXNrLWZpbGVzL0FHRU5UUy5tZCAiJE9QRU5DT0RFX1dPUktfRElSL0FHRU5UUy5tZCIKICAgICAgZWNobyAi4pyTIENyZWF0ZWQgaW5pdGlhbCBBR0VOVFMubWQgbWVtb3J5IGZpbGUiCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKckyBQcmVzZXJ2ZWQgZXhpc3RpbmcgQUdFTlRTLm1kIG1lbW9yeSBmaWxlIChtYWludGFpbmluZyBhY2N1bXVsYXRlZCBjb250ZXh0KSIKICBmaQpmaQoKaWYgWyAtZiAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiJE9QRU5DT0RFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNsaWVudC1jb25maWcuanNvbiB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCmlmIFsgLWYgL3Rhc2stZmlsZXMvbWNwLmpzb24gXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL21jcC5qc29uICIkT1BFTkNPREVfV09SS19ESVIvLm1jcC5qc29uIgpmaQoKZXhwb3J0IE9QRU5DT0RFX1BFUk1JU1NJT049J3siYmFzaCI6eyIqIjoiYWxsb3cifSwiZWRpdCI6ImFsbG93Iiwid2ViZmV0Y2giOiJhbGxvdyJ9JwoKIyBHdWFyZCBhZ2FpbnN0IGRlc3RydWN0aXZlIHdvcmtzcGFjZSBjbGVhbnVwCmd1YXJkX3JtKCkgewogIGlmIFsgIiQjIiAtZ2UgMiBdOyB0aGVuCiAgICBsb2NhbCBmbGFncz0oKQogICAgbG9jYWwgdGFyZ2V0cz0oKQogICAgZm9yIGFyZyBpbiAiJEAiOyBkbwogICAgICBjYXNlICIkYXJnIiBpbgogICAgICAgIC0qKSBmbGFncys9KCIkYXJnIikgOzsKICAgICAgICAqKSB0YXJnZXRzKz0oIiRhcmciKSA7OwogICAgICBlc2FjCiAgICBkb25lCgogICAgbG9jYWwgaGFzX3JlY3Vyc2l2ZT0wCiAgICBsb2NhbCBoYXNfZm9yY2U9MAogICAgZm9yIGZsYWcgaW4gIiR7ZmxhZ3NbQF19IjsgZG8KICAgICAgY2FzZSAiJGZsYWciIGluCiAgICAgICAgLSopCiAgICAgICAgICBbWyAiJGZsYWciID09ICpyKiB8fCAiJGZsYWciID09ICpSKiBdXSAmJiBoYXNfcmVjdXJzaXZlPTEKICAgICAgICAgIFtbICIkZmxhZyIgPT0gKmYqIHx8ICIkZmxhZyIgPT0gKkYqIF1dICYmIGhhc19mb3JjZT0xCiAgICAgICAgICA7OwogICAgICBlc2FjCiAgICBkb25lCgogICAgaWYgKChoYXNfcmVjdXJzaXZlICYmIGhhc19mb3JjZSkpOyB0aGVuCiAgICAgIGZvciB0YXJnZXQgaW4gIiR7dGFyZ2V0c1tAXX0iOyBkbwogICAgICAgIFsgLXogIiR0YXJnZXQiIF0gJiYgY29udGludWUKICAgICAgICBsb2NhbCBleHBhbmRlZD0iJHRhcmdldCIKICAgICAgICBjYXNlICIkdGFyZ2V0IiBpbgogICAgICAgICAgfiopIGV4cGFuZGVkPSIke3RhcmdldC8jXH4vJEhPTUV9IiA7OwogICAgICAgIGVzYWMKICAgICAgICBsb2NhbCByZXNvbHZlZAogICAgICAgIHJlc29sdmVkPSQocmVhbHBhdGggLW0gIiRleHBhbmRlZCIgMj4vZGV2L251bGwgfHwgcHJpbnRmICclcycgIiRleHBhbmRlZCIpCiAgICAgICAgaWYgWyAiJHJlc29sdmVkIiA9ICIkT1BFTkNPREVfV09SS19ESVIiIF0gfHwgWyAiJHJlc29sdmVkIiA9ICIvd29ya3NwYWNlIiBdIHx8CiAgICAgICAgICAgWyAiJHJlc29sdmVkIiA9ICIkSE9NRSIgXSB8fCBbWyAiJHJlc29sdmVkIiA9PSAiJEhPTUUvLnJ1c3R1cCIqIF1dOyB0aGVuCiAgICAgICAgICBlY2hvICLinYwgR3VhcmQ6IGRlc3RydWN0aXZlIHJtIGJsb2NrZWQgKHRhcmdldD0kdGFyZ2V0KSIgPiYyCiAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICAgIGRvbmUKICAgIGZpCiAgZmkKCiAgcmV0dXJuIDAKfQoKcm0oKSB7CiAgaWYgZ3VhcmRfcm0gIiRAIjsgdGhlbgogICAgY29tbWFuZCBybSAiJEAiCiAgZWxzZQogICAgcmV0dXJuIDEKICBmaQp9CgpleHBvcnQgLWYgZ3VhcmRfcm0gcm0KCmlmIFsgISAtZiAiJE9QRU5DT0RFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgXTsgdGhlbgogIGVjaG8gIuKdjCBjbGllbnQtY29uZmlnLmpzb24gbWlzc2luZyBmcm9tIHdvcmtzcGFjZTsgcmVxdWlyZWQgZm9yIE1DUC90b29sbWFuIgogIGV4aXQgMQpmaQoKZWNobyAiPT09IE1DUCBDTElFTlQgQ09ORklHID09PSIKV09SS1NQQUNFX0NGRz0iJE9QRU5DT0RFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIKU09VUkNFX0NGRz0iL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIgpUQVJHRVRfQ0ZHPSIke01DUF9DTElFTlRfQ09ORklHOi0vd29ya3NwYWNlL2NsaWVudC1jb25maWcuanNvbn0iCgppc192YWxpZF9jZmcoKSB7CiAgbG9jYWwgcGF0aD0iJDEiCiAgWyAtZiAiJHBhdGgiIF0gfHwgcmV0dXJuIDEKICBpZiBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAganEgLWUgJ3R5cGU9PSJvYmplY3QiIGFuZCBsZW5ndGg+PTAnICIkcGF0aCIgPi9kZXYvbnVsbCAyPiYxCiAgZWxzZQogICAgWyAtcyAiJHBhdGgiIF0KICBmaQp9CgppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbgogIGNwICIkV09SS1NQQUNFX0NGRyIgIiRUQVJHRVRfQ0ZHIgogIGVjaG8gIuKckyBVc2luZyBNQ1AgY2xpZW50IGNvbmZpZyBmcm9tIHdvcmtzcGFjZTogJFRBUkdFVF9DRkciCmVsaWYgaXNfdmFsaWRfY2ZnICIkU09VUkNFX0NGRyI7IHRoZW4KICBjcCAiJFNPVVJDRV9DRkciICIkV09SS1NQQUNFX0NGRyIKICBjcCAiJFNPVVJDRV9DRkciICIkVEFSR0VUX0NGRyIKICBlY2hvICLinJMgUmVzdG9yZWQgTUNQIGNsaWVudCBjb25maWcgZnJvbSBzb3VyY2U6ICRUQVJHRVRfQ0ZHIgplbHNlCiAgZWNobyAi4p2MIE5vIHZhbGlkIE1DUCBjbGllbnQgY29uZmlnIGF2YWlsYWJsZSAoY2hlY2tlZCAkV09SS1NQQUNFX0NGRyBhbmQgJFNPVVJDRV9DRkcpIgogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2UgY29udGVudHMgcHJldmlldzoiOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciIDI+L2Rldi9udWxsIHx8IGVjaG8gIiAgIDx1bnJlYWRhYmxlPiIKICBmaQogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2UgY29udGVudHMgcHJldmlldzoiOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciIDI+L2Rldi9udWxsIHx8IGVjaG8gIiAgIDx1bnJlYWRhYmxlPiIKICBmaQogIGV4aXQgMQpmaQoKTUNQX0NMSUVOVF9DT05GSUc9IiRUQVJHRVRfQ0ZHIgpleHBvcnQgTUNQX0NMSUVOVF9DT05GSUcKCmlmIFsgLWYgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgXTsgdGhlbgogIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICJbY2xpZW50LWNvbmZpZ10gc3VtbWFyeToiCiAgICBpZiAhIGpxIC1yICcicmVtb3RlVG9vbHM9IiArICgoLnJlbW90ZVRvb2xzIC8vIFtdKSB8IGxlbmd0aCB8IHRvc3RyaW5nKSArICIsIGxvY2FsU2VydmVycz0iICsgKCgubG9jYWxTZXJ2ZXJzIC8vIHt9IHwga2V5cykgfCBqb2luKCIsIikpJyAiJE1DUF9DTElFTlRfQ09ORklHIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICBlY2hvICIgIChub3QgdmFsaWQgSlNPTikiCiAgICBmaQogIGZpCmZpCgplY2hvICI9PT0gY2xpZW50LWNvbmZpZy5qc29uID09PSIKaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBqcSAnLicgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgMj4vZGV2L251bGwgfHwgY2F0ICIkTUNQX0NMSUVOVF9DT05GSUciCmVsc2UKICBjYXQgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIKZmkKZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT0iCgojIENvbmZpZ3VyZSBPcGVuQ29kZSBjb25maWcgZGlyZWN0b3J5Cm1rZGlyIC1wICIkSE9NRS8ub3BlbmNvZGUiCmlmIFsgLWYgL3Rhc2stZmlsZXMvb3BlbmNvZGUtY29uZmlnLmpzb24gXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL29wZW5jb2RlLWNvbmZpZy5qc29uICIkSE9NRS8ub3BlbmNvZGUvY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIEluc3RhbGxlZCBvcGVuY29kZS1jb25maWcuanNvbiIKZWxzZQogIGVjaG8gIuKaoO+4jyBvcGVuY29kZS1jb25maWcuanNvbiBub3QgcHJvdmlkZWQ7IGZhbGxpbmcgYmFjayB0byBkZWZhdWx0cyIKZmkKCmVjaG8gIj09PSBNQ1AgUFJFQ0hFQ0tTID09PSIKaWYgISBjb21tYW5kIC12IHRvb2xtYW4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MICd0b29sbWFuJyBDTEkgbm90IGZvdW5kIGluIFBBVEg7IHJlcXVpcmVkIGZvciBNQ1AiCiAgZXhpdCAxCmZpCgpUT09MTUFOX1VSTD0ke1RPT0xNQU5fU0VSVkVSX1VSTDotImh0dHA6Ly90b29sbWFuLmFnZW50LXBsYXRmb3JtLnN2Yy5jbHVzdGVyLmxvY2FsOjMwMDAvbWNwIn0KVE9PTE1BTl9VUkw9IiR7VE9PTE1BTl9VUkwlL30iCmVjaG8gIvCflI0gQ2hlY2tpbmcgVG9vbG1hbiBlbmRwb2ludDogJFRPT0xNQU5fVVJMIgppZiAhIGN1cmwgLXNTZiAtLWNvbm5lY3QtdGltZW91dCAyIC0tbWF4LXRpbWUgNiBcCiAgLVggUE9TVCAiJFRPT0xNQU5fVVJMIiBcCiAgLUggJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicgXAogIC1kICd7Impzb25ycGMiOiIyLjAiLCJpZCI6ImhlYWx0aCIsIm1ldGhvZCI6InRvb2xzL2xpc3QiLCJwYXJhbXMiOnt9fScgPi90bXAvdG9vbG1hbi1waW5nLmxvZyAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIFVuYWJsZSB0byByZWFjaCBUb29sbWFuIHNlcnZlciBhdCAkVE9PTE1BTl9VUkwiCiAgY2F0IC90bXAvdG9vbG1hbi1waW5nLmxvZyA+JjIgfHwgdHJ1ZQogIHJtIC1mIC90bXAvdG9vbG1hbi1waW5nLmxvZwogIGV4aXQgMQpmaQpybSAtZiAvdG1wL3Rvb2xtYW4tcGluZy5sb2cKZWNobyAi4pyTIFRvb2xtYW4gZW5kcG9pbnQgcmVhY2hhYmxlIgoKIyBWZXJpZnkgT3BlbkNvZGUgcHJvdmlkZXIgQVBJIGtleSBpcyBzZXQgYmFzZWQgb24gY29uZmlnCk9QRU5DT0RFX0NPTkZJR19QQVRIPSIkSE9NRS8ub3BlbmNvZGUvY29uZmlnLmpzb24iCmlmIFsgLWYgIiRPUEVOQ09ERV9DT05GSUdfUEFUSCIgXTsgdGhlbgogIFBST1ZJREVSX0VOVl9LRVk9JChqcSAtciAnLnByb3ZpZGVyLmVudktleSAvLyAiT1BFTkFJX0FQSV9LRVkiJyAiJE9QRU5DT0RFX0NPTkZJR19QQVRIIikKZWxzZQogIFBST1ZJREVSX0VOVl9LRVk9Ik9QRU5BSV9BUElfS0VZIgpmaQoKaWYgWyAteiAiJHshUFJPVklERVJfRU5WX0tFWTotfSIgXTsgdGhlbgogIGVjaG8gIuKdjCAkUFJPVklERVJfRU5WX0tFWSBpcyBub3Qgc2V0OyBPcGVuQ29kZSBjYW5ub3QgYXV0aGVudGljYXRlIHdpdGggaXRzIHByb3ZpZGVyIgogIGV4aXQgMQpmaQoKZWNobyAi8J+UkSBDb25maWd1cmluZyBPcGVuQ29kZSBhdXRoZW50aWNhdGlvbiAocHJvdmlkZXIga2V5OiAkUFJPVklERVJfRU5WX0tFWSkiCgppZiBbICEgLWYgIiRPUEVOQ09ERV9XT1JLX0RJUi9BR0VOVFMubWQiIF07IHRoZW4KICBlY2hvICLimqDvuI8gTm8gQUdFTlRTLm1kIGd1aWRhbmNlIGZpbGUgZGV0ZWN0ZWQ7IGNyZWF0aW5nIHBsYWNlaG9sZGVyIgogIGNhdCA8PCdQTEFDRUhPTERFUicgPiAiJE9QRU5DT0RFX1dPUktfRElSL0FHRU5UUy5tZCIKIyBQcm9qZWN0IEd1aWRhbmNlCgpUaGlzIE9wZW5Db2RlIHJ1biB3YXMgdHJpZ2dlcmVkIHdpdGhvdXQgQUdFTlRTLm1kIGNvbnRlbnQuIFByb3ZpZGUgcHJvamVjdCBjb250ZXh0IGluIEFHRU5UUy5tZCB0byBnaXZlIE9wZW5Db2RlIHJpY2hlciBpbnN0cnVjdGlvbnMuClBMQUNFSE9MREVSCmZpCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQcm9tcHQgYXNzZW1ibHkgYW5kIE9wZW5Db2RlIGV4ZWN1dGlvbgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClBST01QVF9QUkVGSVg9IiIKCiMgU2ltcGxlLCBmb2N1c2VkIGNvbnRleHQgLSBsZXQgQCByZWZlcmVuY2VzIGRvIHRoZSBoZWF2eSBsaWZ0aW5nClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0jIyBUYXNrIENvbnRleHRcblxuIgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9WW91J3JlIHdvcmtpbmcgb24gKipUYXNrIHt7dGFza19pZH19KiogZm9yIHNlcnZpY2UgKip7e3NlcnZpY2V9fSoqLlxuXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0qKlJlcXVpcmVkIFJlYWRpbmc6KipcbiIKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCDigJQgWW91ciBzdWNjZXNzIGNyaXRlcmlhIChjb21wbGV0ZSBBTEwgb2YgdGhlc2UpXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEBBR0VOVFMubWQg4oCUIFJlcG9zaXRvcnkgZ3VpZGVsaW5lcyBhbmQgd29ya2Zsb3dcbiIKaWYgWyAtZiAiJE9QRU5DT0RFX1dPUktfRElSL3Rhc2svdG9vbG1hbi1ndWlkZS5tZCIgXTsgdGhlbgogIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEB0YXNrL3Rvb2xtYW4tZ3VpZGUubWQg4oCUIFRvb2wgdXNhZ2UgcmVmZXJlbmNlXG4iCmZpCmlmIFsgLWYgIiRPUEVOQ09ERV9XT1JLX0RJUi9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIFBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCDigJQgQ29kaW5nIHN0YW5kYXJkc1xuIgpmaQppZiBbIC1mICIkT1BFTkNPREVfV09SS19ESVIvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBAZ2l0aHViLWd1aWRlbGluZXMubWQg4oCUIEdpdCB3b3JrZmxvd1xuIgpmaQoKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfVxuKipLZXkgUmVxdWlyZW1lbnRzOioqXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEltcGxlbWVudCBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBiZWZvcmUgY29tcGxldGluZ1xuIgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBXcml0ZSBwcm9kdWN0aW9uIGNvZGUgKG5vIFRPRE9zIG9yIHBsYWNlaG9sZGVycylcbiIKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gQ29tbWl0IGZyZXF1ZW50bHkgYW5kIGNyZWF0ZSBhIFBSIHdoZW4gZG9uZVxuIgpQUk9NUFRfUFJFRklYPSIke1BST01QVF9QUkVGSVh9LSBSdW4gcXVhbGl0eSBnYXRlcyAoY2FyZ28gZm10LCBjbGlwcHksIHRlc3QpIGJlZm9yZSBmaW5pc2hpbmdcbiIKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0gWW91J3JlIG9uIGJyYW5jaCBcYGZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvblxgXG4iClBST01QVF9QUkVGSVg9IiR7UFJPTVBUX1BSRUZJWH0tIEdpdEh1YiBhdXRoIGlzIHByZS1jb25maWd1cmVkIChHSF9UT0tFTiBpcyBzZXQpXG5cbiIKUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYfS0tLVxuXG4iCgplY2hvICLwn5SNIERFQlVHOiBBYm91dCB0byBjaGVjayBmb3IgcHJvbXB0Lm1kIGF0OiAkT1BFTkNPREVfV09SS19ESVIvdGFzay9wcm9tcHQubWQiCmVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhc2sgZGlyZWN0b3J5OiIKbHMgLWxhICIkT1BFTkNPREVfV09SS19ESVIvdGFzay8iIHx8IGVjaG8gIlRhc2sgZGlyZWN0b3J5IG5vdCBmb3VuZCBvciBlbXB0eSIKZWNobyAi8J+UjSBERUJVRzogQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBjb250ZW50czoiCmxzIC1sYSAiJE9QRU5DT0RFX1dPUktfRElSLyIgfHwgZWNobyAiV29ya2luZyBkaXJlY3Rvcnkgbm90IGFjY2Vzc2libGUiCgpQUk9NUFRfRklMRT0iJE9QRU5DT0RFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgppZiBbICEgLWYgIiRQUk9NUFRfRklMRSIgXTsgdGhlbgogIGVjaG8gIuKdjCBwcm9tcHQubWQgbm90IGZvdW5kIGF0ICRQUk9NUFRfRklMRSIKICBleGl0IDEKZmkKCmVjaG8gInN0YXJ0aW5nVGFzazp7e3Rhc2tfaWR9fSIKZWNobyAiIgoKUFJPTVBUX0NPTlRFTlQ9IiR7UFJPTVBUX1BSRUZJWH0kKGNhdCAiJFBST01QVF9GSUxFIikiCgojIFByaW50IHByb21wdCBwcmV2aWV3IChzaW1pbGFyIHRvIEZhY3RvcnkvQ2xhdWRlIENMSXMpCmVjaG8gIvCfk6QgU2VuZGluZyBwcm9tcHQgdG8gT3BlbkNvZGUvR3JvayAodHJ1bmNhdGVkIHRvIDIwMDAgY2hhcnMgZm9yIGxvZyBzYWZldHkpOiIKZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKUFJPTVBUX1BSRVZJRVc9JChwcmludGYgJyVzJyAiJFBST01QVF9DT05URU5UIiB8IGhlYWQgLWMgMjAwMCkKcHJpbnRmICclc1xuJyAiJFBST01QVF9QUkVWSUVXIgplY2hvICIuLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iClBST01QVF9CWVRFUz0kKHByaW50ZiAnJXMnICIkUFJPTVBUX0NPTlRFTlQiIHwgd2MgLWMgfCB0ciAtZCAnWzpzcGFjZTpdJykKZWNobyAi8J+TjyBUb3RhbCBwcm9tcHQgc2l6ZTogJFBST01QVF9CWVRFUyBieXRlcyIKZWNobyAiIgoKT1JJR0lOQUxfUFJPTVBUPSIkUFJPTVBUX0NPTlRFTlQiClBSRVZJT1VTX01FU1NBR0VfRklMRT0iIgoKIyBHcm9rIENvZGUgRmFzdCAxIGhhcyAyNTZrIGNvbnRleHQgd2luZG93IC0gTUFYIElUIE9VVApUT0tFTl9MSU1JVD0ke09QRU5DT0RFX1RPS0VOX0xJTUlUOi0yNTYwMDB9CgojIEdyb2sgaXMgZmFzdCAoMTkwIHRva2Vucy9zZWMpIHNvIGNhbiBoYW5kbGUgbG9uZ2VyIHRpbWVvdXRzCk9QRU5DT0RFX1RJTUVPVVQ9JHtPUEVOQ09ERV9FWEVDX1RJTUVPVVQ6LTI0MDB9ICAjIDQwIG1pbnV0ZXMgKHdhcyAzMCkKClJFU0VUX1NFU1NJT05fT05fUkVUUlk9JHtPUEVOQ09ERV9SRVNFVF9TRVNTSU9OX09OX1JFVFJZOi0xfQpDT05USU5VRV9TRVNTSU9OPSR7T1BFTkNPREVfQ09OVElOVUVfU0VTU0lPTjotMX0KCiMgUmVhc29uYWJsZSByZXRyaWVzIGZvciBHcm9rIC0gbm90IHRvbyBtYW55IHRvIHdhc3RlIHRva2VucwojIFNwZWNpYWwgY2FzZTogMCBtZWFucyB1bmxpbWl0ZWQgKGtlZXAgZ29pbmcgdW50aWwgYWNjZXB0YW5jZSBjcml0ZXJpYSBtZXQpCk1BWF9SRVRSSUVTPSR7T1BFTkNPREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi0xMH19CmlmIFsgIiRNQVhfUkVUUklFUyIgPSAiMCIgXTsgdGhlbgogIGVjaG8gIvCflIQgVW5saW1pdGVkIHJldHJpZXMgZW5hYmxlZCAtIHdpbGwgY29udGludWUgdW50aWwgYWNjZXB0YW5jZSBjcml0ZXJpYSBtZXQiCiAgVU5MSU1JVEVEX1JFVFJJRVM9MQplbHNlCiAgVU5MSU1JVEVEX1JFVFJJRVM9MApmaQoKIyBPdXRwdXQgZm9ybWF0OiBqc29uIChzdHJ1Y3R1cmVkLCBwYXJzZWFibGUpIG9yIG1hcmtkb3duIChodW1hbi1yZWFkYWJsZSkKIyBKU09OIGlzIGJldHRlciBmb3IgYXV0b21hdGVkIHBhcnNpbmcgKHNlc3Npb24gSURzLCBjaXJjdWl0IGJyZWFrZXIsIHRva2VuIHRyYWNraW5nKQojIE1BUktET1dOIGlzIGJldHRlciBmb3IgaHVtYW4gb2JzZXJ2YXRpb24gZHVyaW5nIGRldmVsb3BtZW50L2RlYnVnZ2luZwojIFNldCBPUEVOQ09ERV9WRVJCT1NFPTEgdG8gdXNlIG1hcmtkb3duIGZvcm1hdCBmb3IgcmVhZGFiaWxpdHkKaWYgWyAiJHtPUEVOQ09ERV9WRVJCT1NFOi0wfSIgPSAiMSIgXTsgdGhlbgogIE9QRU5DT0RFX0ZPUk1BVD0ibWFya2Rvd24iCiAgIyBPbmx5IHNldCBsb2cgbGV2ZWwgaWYgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQgYnkgdXNlcgogIGlmIFsgLXogIiR7T1BFTkNPREVfTE9HX0xFVkVMOi19IiBdOyB0aGVuCiAgICBPUEVOQ09ERV9MT0dfTEVWRUw9IklORk8iCiAgZmkKICBlY2hvICLwn5OiIFZlcmJvc2UgbW9kZSBlbmFibGVkIC0gdXNpbmcgbWFya2Rvd24gZm9ybWF0IHdpdGggJHtPUEVOQ09ERV9MT0dfTEVWRUx9IGxvZyBsZXZlbCBmb3IgcmVhZGFiaWxpdHkiCiAgaWYgWyAiJHtPUEVOQ09ERV9MT0dfTEVWRUx9IiAhPSAiREVCVUciIF07IHRoZW4KICAgIGVjaG8gIiAgIFRvIHNlZSBldmVuIG1vcmUgZGV0YWlsLCBzZXQgT1BFTkNPREVfTE9HX0xFVkVMPURFQlVHIgogIGZpCmVsc2UKICBPUEVOQ09ERV9GT1JNQVQ9JHtPUEVOQ09ERV9GT1JNQVQ6LWpzb259CiAgIyBPbmx5IHNldCBsb2cgbGV2ZWwgaWYgbm90IGV4cGxpY2l0bHkgcHJvdmlkZWQgYnkgdXNlcgogIGlmIFsgLXogIiR7T1BFTkNPREVfTE9HX0xFVkVMOi19IiBdOyB0aGVuCiAgICBPUEVOQ09ERV9MT0dfTEVWRUw9IkRFQlVHIgogIGZpCmZpCgpBVFRFTVBUPTEKU1VDQ0VTUz0wCk9QRU5DT0RFX0VYSVQ9MQpMQVNUX01FU1NBR0VfRklMRT0iIgpSVU5fTE9HPSIiCgpTRVNTSU9OX0RJUj0iJEhPTUUvLm9wZW5jb2RlL3Nlc3Npb25zIgpMQVRFU1RfU0VTU0lPTl9JRD0iIgoKIyBDaXJjdWl0IGJyZWFrZXI6IHRyYWNrIHJlcGVhdGVkIGNvbW1hbmQgZmFpbHVyZXMKZGVjbGFyZSAtQSBGQUlMRURfQ09NTUFORFMKTUFYX1NBTUVfQ09NTUFORF9GQUlMVVJFUz0zCgojIFNlc3Npb24gY29udGludWF0aW9uOiByZXRyeSB3aXRoaW4gc2FtZSBzZXNzaW9uIHdoZW4gbm8gdG9vbHMgdXNlZApNQVhfQ09OVElOVUFUSU9OX1JFVFJJRVM9NQoKIyBIZWxwZXI6IENoZWNrIGlmIHJlc3BvbnNlIGhhZCBhbnkgdG9vbCBjYWxscwpoYXNfdG9vbF9jYWxscygpIHsKICBsb2NhbCBsb2dfZmlsZT0iJDEiCiAgaWYgWyAhIC1mICIkbG9nX2ZpbGUiIF07IHRoZW4KICAgIHJldHVybiAxCiAgZmkKICAKICAjIENoZWNrIGZvciB0b29sX3VzZSBldmVudHMgaW4gdGhlIEpTT04gbG9nCiAgaWYgZ3JlcCAtcSAnInR5cGUiOiJ0b29sX3VzZSInICIkbG9nX2ZpbGUiIDI+L2Rldi9udWxsOyB0aGVuCiAgICByZXR1cm4gMAogIGZpCiAgcmV0dXJuIDEKfQoKaGFzX2V4aXN0aW5nX3Nlc3Npb25zKCkgewogIGxvY2FsIHNlc3Npb25fZGlyPSIkMSIKICBpZiBbICEgLWQgIiRzZXNzaW9uX2RpciIgXTsgdGhlbgogICAgcmV0dXJuIDEKICBmaQoKICBmb3Igc2Vzc2lvbl9maWxlIGluICIkc2Vzc2lvbl9kaXIiLyouanNvbjsgZG8KICAgIGlmIFsgLWYgIiRzZXNzaW9uX2ZpbGUiIF07IHRoZW4KICAgICAgcmV0dXJuIDAKICAgIGZpCiAgZG9uZQoKICByZXR1cm4gMQp9CgpleHRyYWN0X3Nlc3Npb25faWQoKSB7CiAgbG9jYWwgbG9nX2ZpbGU9IiQxIgogIFsgLWYgIiRsb2dfZmlsZSIgXSB8fCByZXR1cm4gMQogIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBqcSAtciAnc2VsZWN0KC5zZXNzaW9uSUQgIT0gbnVsbCkgfCAuc2Vzc2lvbklEJyAiJGxvZ19maWxlIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xIHwgdHIgLWQgJ1xyJyB8IHRyIC1kICdcbicKICBlbHNlCiAgICBhd2sgJwogICAgICB7CiAgICAgICAgZ3N1YigvXDAzM1xbWzAtOTtdKlttS10vLCAiIik7CiAgICAgICAgaWYgKCQwIH4gL3Nlc3Npb25JRCJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0qIlswLTlhLWZBLUYtXXs0LH0vKSB7CiAgICAgICAgICBtYXRjaCgkMCwgL3Nlc3Npb25JRCJbWzpzcGFjZTpdXSo6W1s6c3BhY2U6XV0qIihbMC05YS1mQS1GLV0rKS8sIGEpOwogICAgICAgICAgaWYgKGFbMV0gIT0gIiIpIGxhc3Q9YVsxXTsKICAgICAgICB9IGVsc2UgaWYgKCQwIH4gL29wZW5jb2RlIHNlc3Npb25bWzpzcGFjZTpdXStbMC05YS1mQS1GLV17NCx9LykgewogICAgICAgICAgbWF0Y2goJDAsIC9vcGVuY29kZSBzZXNzaW9uW1s6c3BhY2U6XV0rKFswLTlhLWZBLUYtXSspLywgYSk7CiAgICAgICAgICBpZiAoYVsxXSAhPSAiIikgbGFzdD1hWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICBFTkQgewogICAgICAgIGlmIChsYXN0ICE9ICIiKSBwcmludCBsYXN0OwogICAgICB9CiAgICAnICIkbG9nX2ZpbGUiIDI+L2Rldi9udWxsCiAgZmkKfQoKaWYgWyAiJENPTlRJTlVFX1NFU1NJT04iID0gIjEiIF07IHRoZW4KICBpZiAhIGhhc19leGlzdGluZ19zZXNzaW9ucyAiJFNFU1NJT05fRElSIjsgdGhlbgogICAgZWNobyAi4oS577iPIE5vIGV4aXN0aW5nIE9wZW5Db2RlIHNlc3Npb25zIGRldGVjdGVkOyBzdGFydGluZyBuZXcgc2Vzc2lvbiIKICAgIENPTlRJTlVFX1NFU1NJT049MAogIGZpCmZpCgp3cml0ZV9sYXN0X21lc3NhZ2UoKSB7CiAgbG9jYWwgbG9nX2ZpbGU9IiQxIgogIGxvY2FsIGRlc3RfZmlsZT0iJDIiCiAgWyAtZiAiJGxvZ19maWxlIiBdIHx8IHJldHVybiAxCgogIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBsb2NhbCBsYXN0X3RleHQKICAgIGxhc3RfdGV4dD0kKGpxIC1yICcKICAgICAgc2VsZWN0KC50eXBlID09ICJ0ZXh0IikKICAgICAgfCAoaWYgKC50ZXh0IHwgdHlwZSkgPT0gIm9iamVjdCIgdGhlbiAudGV4dC50ZXh0CiAgICAgICAgIGVsc2UgaWYgKC5wYXJ0IHwgdHlwZSkgPT0gIm9iamVjdCIgdGhlbiAucGFydC50ZXh0CiAgICAgICAgIGVsc2UgLnRleHQgZW5kKQogICAgICB8IHNlbGVjdCguICE9IG51bGwgYW5kIC4gIT0gIiIpCiAgICAnICIkbG9nX2ZpbGUiIDI+L2Rldi9udWxsIHwgdGFpbCAtbjEpCgogICAgaWYgWyAtbiAiJGxhc3RfdGV4dCIgXTsgdGhlbgogICAgICBwcmludGYgJyVzXG4nICIkbGFzdF90ZXh0IiA+ICIkZGVzdF9maWxlIgogICAgICByZXR1cm4gMAogICAgZmkKICBmaQoKICB0YWlsIC1uIDEwMCAiJGxvZ19maWxlIiAyPi9kZXYvbnVsbCA+ICIkZGVzdF9maWxlIgogIHJldHVybiAwCn0KCmlmIFsgIiRDT05USU5VRV9TRVNTSU9OIiA9ICIxIiBdOyB0aGVuCiAgZWNobyAi4oS577iPIE9wZW5Db2RlIHdpbGwgYXR0ZW1wdCB0byBjb250aW51ZSB0aGUgbW9zdCByZWNlbnQgc2Vzc2lvbiB3aGVuIGF2YWlsYWJsZS4iCmVsc2UKICBpZiBbIC1kICIkU0VTU0lPTl9ESVIiIF07IHRoZW4KICAgIGZpbmQgIiRTRVNTSU9OX0RJUiIgLW1heGRlcHRoIDEgLXR5cGUgZiAtbmFtZSAnKi5qc29uJyAtZGVsZXRlIDI+L2Rldi9udWxsIHx8IHRydWUKICBmaQpmaQoKd2hpbGUgWyAiJFVOTElNSVRFRF9SRVRSSUVTIiA9ICIxIiBdIHx8IFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGlmIFsgIiRVTkxJTUlURURfUkVUUklFUyIgPSAiMSIgXTsgdGhlbgogICAgZWNobyAi8J+agCBPcGVuQ29kZSBleGVjdXRpb24gYXR0ZW1wdCAkQVRURU1QVCAodW5saW1pdGVkIG1vZGUpIgogIGVsc2UKICAgIGVjaG8gIvCfmoAgT3BlbkNvZGUgZXhlY3V0aW9uIGF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTIgogIGZpCiAgTEFTVF9NRVNTQUdFX0ZJTEU9Ii90bXAvb3BlbmNvZGUtbGFzdC1tZXNzYWdlLSR7QVRURU1QVH0udHh0IgogIFJVTl9MT0c9Ii90bXAvb3BlbmNvZGUtcnVuLSR7QVRURU1QVH0uanNvbmwiCgogIGlmIFsgIiRSRVNFVF9TRVNTSU9OX09OX1JFVFJZIiA9ICIxIiBdICYmIFsgIiRDT05USU5VRV9TRVNTSU9OIiAhPSAiMSIgXSAmJiBbICRBVFRFTVBUIC1ndCAxIF0gJiYgWyAtZCAiJFNFU1NJT05fRElSIiBdOyB0aGVuCiAgICBmaW5kICIkU0VTU0lPTl9ESVIiIC1tYXhkZXB0aCAxIC10eXBlIGYgLW5hbWUgJyouanNvbicgLWRlbGV0ZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZmkKCiAgIyBJbm5lciBjb250aW51YXRpb24gbG9vcCBjb3VudGVyCiAgQ09OVElOVUFUSU9OX0FUVEVNUFQ9MAoKICBpZiBbICRBVFRFTVBUIC1lcSAxIF07IHRoZW4KICAgIFBST01QVF9QQVlMT0FEPSIkT1JJR0lOQUxfUFJPTVBUIgogIGVsc2UKICAgIGlmIFsgLW4gIiRQUkVWSU9VU19NRVNTQUdFX0ZJTEUiIF0gJiYgWyAtcyAiJFBSRVZJT1VTX01FU1NBR0VfRklMRSIgXTsgdGhlbgogICAgICBQUkVWSU9VU19TTklQUEVUPSQodGFpbCAtbiA0MCAiJFBSRVZJT1VTX01FU1NBR0VfRklMRSIgMj4vZGV2L251bGwgfCBzZWQgJ3MvXi8gICAgLycpCiAgICBlbHNlCiAgICAgIFBSRVZJT1VTX1NOSVBQRVQ9IiAgICA8bm8gcHJldmlvdXMgb3V0cHV0IGF2YWlsYWJsZT4iCiAgICBmaQogICAgUFJPTVBUX1BBWUxPQUQ9IiMjIENvbnRpbnVhdGlvbiAtIEF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTCgpUaGUgdGFzayBpc24ndCBjb21wbGV0ZSB5ZXQuIEhlcmUncyB3aGF0IHlvdSBzYWlkIGxhc3QgdGltZToKCiRQUkVWSU9VU19TTklQUEVUCgoqKk5leHQgc3RlcHM6KioKMS4gUmV2aWV3IEB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQgdG8gc2VlIHdoYXQncyBzdGlsbCBtaXNzaW5nCjIuIEltcGxlbWVudCB0aGUgcmVtYWluaW5nIHJlcXVpcmVtZW50cwozLiBDb21taXQgeW91ciBjaGFuZ2VzIGFuZCBwdXNoCjQuIFZlcmlmeSBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgbWV0CgpDb250aW51ZSB3b3JraW5nIG9uIHRoZSBpbmNvbXBsZXRlIGl0ZW1zLiIKICBmaQoKICAjIElubmVyIGxvb3A6IGtlZXAgc2Vzc2lvbiBhbGl2ZSB3aGVuIG1vZGVsIHJldHVybnMgdGV4dC1vbmx5IChubyB0b29scykKICB3aGlsZSBbICRDT05USU5VQVRJT05fQVRURU1QVCAtbGUgJE1BWF9DT05USU5VQVRJT05fUkVUUklFUyBdOyBkbwogICAgaWYgWyAkQ09OVElOVUFUSU9OX0FUVEVNUFQgLWd0IDAgXTsgdGhlbgogICAgICBlY2hvICLwn5SEIENvbnRpbnVhdGlvbiAkQ09OVElOVUFUSU9OX0FUVEVNUFQvJE1BWF9DT05USU5VQVRJT05fUkVUUklFUyAoa2VlcGluZyBzZXNzaW9uIGFsaXZlKSIKICAgICAgUFJPTVBUX1BBWUxPQUQ9IlRoZSB0YXNrIGlzIG5vdCBjb21wbGV0ZSB5ZXQuICoqVXNlIHRvb2xzKiogdG8gY29udGludWUgd29ya2luZyBvbiB0aGUgcmVtYWluaW5nIHJlcXVpcmVtZW50cy4KClJlbWFpbmluZyB3b3JrOgotIFJldmlldyBhY2NlcHRhbmNlIGNyaXRlcmlhOiBcYGNhdCB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWRcYCAgCi0gQ2hlY2sgd2hhdCdzIGJlZW4gZG9uZTogXGBnaXQgc3RhdHVzXGAgYW5kIFxgZ2l0IGxvZ1xgCi0gRml4IGFueSBlcnJvcnMgb3IgaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbnMKLSBSdW4gcXVhbGl0eSBnYXRlcyAoY2FyZ28gZm10LCBjYXJnbyBjbGlwcHksIGNhcmdvIHRlc3QpCi0gQ29tbWl0IGFuZCBwdXNoIGNoYW5nZXMKLSBDcmVhdGUgb3IgdXBkYXRlIFBSCgoqKkltcG9ydGFudDoqKiBEbyBub3QganVzdCBleHBsYWluIC0gdGFrZSBhY3Rpb24gd2l0aCB0b29scyB0byBjb21wbGV0ZSB0aGUgdGFzay4iCiAgICAgIFJVTl9MT0c9Ii90bXAvb3BlbmNvZGUtcnVuLSR7QVRURU1QVH0tY29udCR7Q09OVElOVUFUSU9OX0FUVEVNUFR9Lmpzb25sIgogICAgZmkKICAgIAogICAgc2V0ICtlCiAgICBzZXQgLW8gcGlwZWZhaWwKICAgICMgV3JpdGUgcHJvbXB0IHRvIHRlbXAgZmlsZSB0byBhdm9pZCAiQXJndW1lbnQgbGlzdCB0b28gbG9uZyIgZXJyb3IKICAgIFBST01QVF9GSUxFPSIvdG1wL29wZW5jb2RlLXByb21wdC0ke0FUVEVNUFR9LSR7Q09OVElOVUFUSU9OX0FUVEVNUFR9LnR4dCIKICAgIHByaW50ZiAnJXMnICIkUFJPTVBUX1BBWUxPQUQiID4gIiRQUk9NUFRfRklMRSIKICAgIAogICAgT1BFTkNPREVfQ01EPSgKICAgICAgIm9wZW5jb2RlIgogICAgICAicnVuIgogICAgICAiLS1mb3JtYXQiCiAgICAgICIkT1BFTkNPREVfRk9STUFUIgogICAgICAiLS1sb2ctbGV2ZWwiCiAgICAgICIkT1BFTkNPREVfTE9HX0xFVkVMIgogICAgKQogICAgaWYgWyAiJENPTlRJTlVFX1NFU1NJT04iID0gIjEiIF07IHRoZW4KICAgICAgaWYgWyAtbiAiJExBVEVTVF9TRVNTSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgT1BFTkNPREVfQ01EKz0oIi0tc2Vzc2lvbiIgIiRMQVRFU1RfU0VTU0lPTl9JRCIpCiAgICAgIGVsc2UKICAgICAgICBPUEVOQ09ERV9DTUQrPSgiLS1jb250aW51ZSIpCiAgICAgIGZpCiAgICBmaQogICAgCiAgICAjIFBhc3MgcHJvbXB0IHZpYSBzdGRpbiB0byBoYW5kbGUgbGFyZ2UgcHJvbXB0cwogICAgaWYgY29tbWFuZCAtdiB0aW1lb3V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICB0aW1lb3V0ICIkT1BFTkNPREVfVElNRU9VVCIgIiR7T1BFTkNPREVfQ01EW0BdfSIgPCAiJFBST01QVF9GSUxFIiB8IHRlZSAiJFJVTl9MT0ciCiAgICBlbHNlCiAgICAgICIke09QRU5DT0RFX0NNRFtAXX0iIDwgIiRQUk9NUFRfRklMRSIgfCB0ZWUgIiRSVU5fTE9HIgogICAgZmkKICAgIE9QRU5DT0RFX0VYSVQ9JHtQSVBFU1RBVFVTWzBdfQogICAgc2V0ICtvIHBpcGVmYWlsCiAgICBzZXQgLWUKICAgIAogICAgIyBDbGVhbiB1cCBwcm9tcHQgZmlsZQogICAgcm0gLWYgIiRQUk9NUFRfRklMRSIKICAgIAogICAgIyBDaGVjayBpZiB0aGlzIHJ1biBoYWQgdG9vbCBjYWxscwogICAgaWYgaGFzX3Rvb2xfY2FsbHMgIiRSVU5fTE9HIjsgdGhlbgogICAgICBlY2hvICLinIUgU2Vzc2lvbiBwcm9kdWNlZCB0b29sIGNhbGxzIC0gZ29vZCBwcm9ncmVzcyIKICAgICAgYnJlYWsKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIE5vIHRvb2wgY2FsbHMgZGV0ZWN0ZWQgLSBtb2RlbCBzdHVjayBpbiBleHBsYW5hdGlvbiBtb2RlIgogICAgICBpZiBbICRDT05USU5VQVRJT05fQVRURU1QVCAtZ2UgJE1BWF9DT05USU5VQVRJT05fUkVUUklFUyBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIE1heCBjb250aW51YXRpb24gcmV0cmllcyByZWFjaGVkIC0gbW92aW5nIHRvIG5leHQgYXR0ZW1wdCIKICAgICAgICBicmVhawogICAgICBmaQogICAgZmkKICAgIAogICAgQ09OVElOVUFUSU9OX0FUVEVNUFQ9JCgoQ09OVElOVUFUSU9OX0FUVEVNUFQgKyAxKSkKICBkb25lCgogIGlmIFsgJE9QRU5DT0RFX0VYSVQgLWVxIDEyNCBdOyB0aGVuCiAgICBlY2hvICLij7HvuI8gT3BlbkNvZGUgY29tbWFuZCBleGNlZWRlZCAke09QRU5DT0RFX1RJTUVPVVR9cyB0aW1lb3V0OyB0ZXJtaW5hdGluZyBzZXNzaW9uIgogICAgcGtpbGwgLWYgIm9wZW5jb2RlIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBQUkVWSU9VU19NRVNTQUdFX0ZJTEU9IiRMQVNUX01FU1NBR0VfRklMRSIKICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgY29udGludWUKICBmaQoKICBlY2hvICJbb3BlbmNvZGUtZGVidWddIEF0dGVtcHQgJEFUVEVNUFQgZmluaXNoZWQgd2l0aCBleGl0IGNvZGUgJE9QRU5DT0RFX0VYSVQiCgogIGlmIFsgJE9QRU5DT0RFX0VYSVQgLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIE9wZW5Db2RlIGV4aXRlZCB3aXRoIHN0YXR1cyAkT1BFTkNPREVfRVhJVCBvbiBhdHRlbXB0ICRBVFRFTVBUIgogIGZpCgogICMgQ2lyY3VpdCBicmVha2VyOiBkZXRlY3QgcmVwZWF0ZWQgZmFpbGluZyBiYXNoIGNvbW1hbmRzCiAgaWYgWyAtZiAiJFJVTl9MT0ciIF07IHRoZW4KICAgICMgRXh0cmFjdCBmYWlsZWQgYmFzaCBjb21tYW5kcyBmcm9tIHRoZSBsb2cKICAgIEZBSUxFRF9DTUQ9JChqcSAtciAnc2VsZWN0KC50eXBlPT0idG9vbF91c2UiIGFuZCAucGFydC50b29sPT0iYmFzaCIgYW5kIC5wYXJ0LnN0YXRlLnN0YXR1cz09ImNvbXBsZXRlZCIgYW5kIC5wYXJ0LnN0YXRlLm1ldGFkYXRhLmV4aXQhPTApIHwgLnBhcnQuc3RhdGUuaW5wdXQuY29tbWFuZCcgIiRSVU5fTE9HIiAyPi9kZXYvbnVsbCB8IHRhaWwgLW4xIHwgaGVhZCAtYyAxMDApCiAgICAKICAgIGlmIFsgLW4gIiRGQUlMRURfQ01EIiBdOyB0aGVuCiAgICAgICMgVHJhY2sgaG93IG1hbnkgdGltZXMgdGhpcyBjb21tYW5kIGhhcyBmYWlsZWQKICAgICAgRkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdPSQoKCR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdOi0wfSArIDEpKQogICAgICBGQUlMX0NPVU5UPSR7RkFJTEVEX0NPTU1BTkRTWyIkRkFJTEVEX0NNRCJdfQogICAgICAKICAgICAgaWYgWyAkRkFJTF9DT1VOVCAtZ2UgJE1BWF9TQU1FX0NPTU1BTkRfRkFJTFVSRVMgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflLQgQ0lSQ1VJVCBCUkVBS0VSIFRSSUdHRVJFRDogQ29tbWFuZCBoYXMgZmFpbGVkICRGQUlMX0NPVU5UIHRpbWVzIGluIGEgcm93OiIKICAgICAgICBlY2hvICIgICBDb21tYW5kOiAkRkFJTEVEX0NNRCIKICAgICAgICBlY2hvICIgICBUaGlzIGluZGljYXRlcyB0aGUgYWdlbnQgaXMgc3R1Y2sgaW4gYSBsb29wLiBBZGRpbmcgZXhwbGljaXQgZ3VpZGFuY2UuLi4iCiAgICAgICAgCiAgICAgICAgIyBGb3JjZSBhIHN0cm9uZ2VyIHByb21wdCBmb3IgbmV4dCByZXRyeQogICAgICAgIFBST01QVF9QQVlMT0FEPSLimqDvuI8gKipMT09QIERFVEVDVEVEKio6IFlvdSBoYXZlIHRyaWVkIHRoaXMgY29tbWFuZCAkRkFJTF9DT1VOVCB0aW1lczoKXGBcYFxgYmFzaAokRkFJTEVEX0NNRApcYFxgXGAKCkl0IGtlZXBzIGZhaWxpbmcgd2l0aCB0aGUgc2FtZSBlcnJvci4gKipTVE9QIFJFUEVBVElORyBUSElTIENPTU1BTkQuKioKCkluc3RlYWQ6CjEuIENoZWNrIHlvdXIgd29ya2luZyBkaXJlY3Rvcnkgd2l0aCBcYHB3ZFxgCjIuIExpc3QgZmlsZXMgd2l0aCBcYGxzIC1sYVxgCjMuIFRyeSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGFwcHJvYWNoIChjcmVhdGUgZmlsZXMgb25lIGF0IGEgdGltZSwgdXNlIGRpZmZlcmVudCBzeW50YXgsIGV0Yy4pCjQuIElmIGRpcmVjdG9yaWVzIGRvbid0IGV4aXN0LCBjcmVhdGUgdGhlbSBzdGVwLWJ5LXN0ZXAgYW5kIHZlcmlmeSBlYWNoIHN0ZXAKCkNvbnRpbnVpbmcgVGFzayB7e3Rhc2tfaWR9fSAtIGZvY3VzIG9uIHNvbHZpbmcgdGhlIHVuZGVybHlpbmcgaXNzdWUsIG5vdCByZXBlYXRpbmcgdGhlIHNhbWUgZmFpbGVkIGNvbW1hbmQuIgogICAgICAgIAogICAgICAgICMgUmVzZXQgdGhlIGNvdW50ZXIgdG8gZ2l2ZSBpdCBhIGZyZXNoIGNoYW5jZSB3aXRoIG5ldyBndWlkYW5jZQogICAgICAgIEZBSUxFRF9DT01NQU5EU1siJEZBSUxFRF9DTUQiXT0wCiAgICAgIGZpCiAgICBmaQogIGZpCgogIHdyaXRlX2xhc3RfbWVzc2FnZSAiJFJVTl9MT0ciICIkTEFTVF9NRVNTQUdFX0ZJTEUiIHx8IHRydWUKCiAgaWYgWyAtcyAiJExBU1RfTUVTU0FHRV9GSUxFIiBdOyB0aGVuCiAgICBlY2hvICLwn5OdIE9wZW5Db2RlIHN1bW1hcnkgKGF0dGVtcHQgJEFUVEVNUFQpOiIKICAgIHNlZCAncy9eLyAgICAvJyAiJExBU1RfTUVTU0FHRV9GSUxFIgogIGVsc2UKICAgIGVjaG8gIuKEue+4jyBObyB0ZXh0dWFsIHN1bW1hcnkgY2FwdHVyZWQgZnJvbSBPcGVuQ29kZSBvbiBhdHRlbXB0ICRBVFRFTVBUIgogIGZpCgogIE5FV19TRVNTSU9OX0lEPSIiCiAgaWYgWyAtbiAiJFJVTl9MT0ciIF0gJiYgWyAtZiAiJFJVTl9MT0ciIF07IHRoZW4KICAgIE5FV19TRVNTSU9OX0lEPSQoZXh0cmFjdF9zZXNzaW9uX2lkICIkUlVOX0xPRyIgfHwgdHJ1ZSkKICBmaQogIGlmIFsgLW4gIiRORVdfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgaWYgWyAiJExBVEVTVF9TRVNTSU9OX0lEIiAhPSAiJE5FV19TRVNTSU9OX0lEIiBdOyB0aGVuCiAgICAgIGVjaG8gIuKEue+4jyAgQ2FwdHVyZWQgT3BlbkNvZGUgc2Vzc2lvbiBJRDogJE5FV19TRVNTSU9OX0lEIgogICAgICBMQVRFU1RfU0VTU0lPTl9JRD0iJE5FV19TRVNTSU9OX0lEIgogICAgZmkKICAgIENPTlRJTlVFX1NFU1NJT049MQogIGZpCgogIFBSRVZJT1VTX01FU1NBR0VfRklMRT0iJExBU1RfTUVTU0FHRV9GSUxFIgoKICBpZiBbICIke1RPS0VOX0xJTUlUOi0wfSIgLWd0IDAgXSAmJiBbIC1mICIkUlVOX0xPRyIgXTsgdGhlbgogICAgTEFTVF9UT0tFTlM9JChncmVwIC1FbyAndG9rZW5zIHVzZWQ6IFswLTksXSsnICIkUlVOX0xPRyIgMj4vZGV2L251bGwgfCB0YWlsIC1uMSB8IGF3ayAne3ByaW50ICQzfScgfCB0ciAtZCAnLCcgfCB0ciAtZCAnXG4nIHx8IHRydWUpCiAgICBpZiBbWyAiJExBU1RfVE9LRU5TIiA9fiBeWzAtOV0rJCBdXTsgdGhlbgogICAgICBlY2hvICLwn5OKIE9wZW5Db2RlIHRva2VucyB1c2VkIHRoaXMgYXR0ZW1wdDogJExBU1RfVE9LRU5TIgogICAgICBpZiBbICIkTEFTVF9UT0tFTlMiIC1ndCAiJFRPS0VOX0xJTUlUIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIFRva2VuIHVzYWdlICRMQVNUX1RPS0VOUyBleGNlZWRzIGxpbWl0ICRUT0tFTl9MSU1JVDsgZm9yY2luZyBjbGVhbiBzZXNzaW9uIGJlZm9yZSByZXRyeSIKICAgICAgICBpZiBbIC1kICIkU0VTU0lPTl9ESVIiIF07IHRoZW4KICAgICAgICAgIGZpbmQgIiRTRVNTSU9OX0RJUiIgLW1heGRlcHRoIDEgLXR5cGUgZiAtbmFtZSAnKi5qc29uJyAtZGVsZXRlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICBmaQogICAgICAgIFBSRVZJT1VTX01FU1NBR0VfRklMRT0iJExBU1RfTUVTU0FHRV9GSUxFIgogICAgICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgICAgIGNvbnRpbnVlCiAgICAgIGZpCiAgICBmaQogIGZpCgogICMgUmV4LXNwZWNpZmljIGNvbXBsZXRpb24gY3JpdGVyaWEgKGltcGxlbWVudGF0aW9uLWZvY3VzZWQsIG5vdCBxdWFsaXR5LWZvY3VzZWQpCiAgaWYgW1sgInt7Z2l0aHViX2FwcH19IiA9PSAqIlJleCIqIF1dIHx8IFtbICJ7e2dpdGh1Yl9hcHB9fSIgPT0gKiJyZXgiKiBdXTsgdGhlbgogICAgQ09NUExFVElPTl9QUk9NUFQ9IlRhc2sge3t0YXNrX2lkfX0gY29tcGxldGlvbiB2ZXJpZmljYXRpb24g4oCUIFJleCBJbXBsZW1lbnRhdGlvbiBBZ2VudAoKKipZb3VyIFJvbGUqKjogWW91IGFyZSBSZXgsIHRoZSBJTVBMRU1FTlRBVElPTiBhZ2VudC4gQ2xlbyB3aWxsIGhhbmRsZSBjb2RlIHF1YWxpdHkgaW4gdGhlIG5leHQgc3RhZ2UuCgoqKkZJUlNUKio6IFJldmlldyB0aGUgRlVOQ1RJT05BTCByZXF1aXJlbWVudHMgaW4gdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kCgoqKlRoZW4gYW5zd2VyICd5ZXMnIGlmIEFMTCBvZiB0aGVzZSBhcmUgdHJ1ZToqKgoKMS4gKipGVU5DVElPTkFMIGFjY2VwdGFuY2UgY3JpdGVyaWEgaW1wbGVtZW50ZWQqKiAoZmVhdHVyZXMgZXhpc3QgYW5kIGJhc2ljYWxseSB3b3JrKQoyLiBDb2RlIENPTVBJTEVTIHN1Y2Nlc3NmdWxseSAoXGBjYXJnbyBidWlsZFxgIHBhc3NlcykKMy4gQWxsIGNvZGUgY2hhbmdlcyBhcmUgY29tbWl0dGVkIHRvIGdpdAo0LiBDaGFuZ2VzIGFyZSBwdXNoZWQgdG8gcmVtb3RlIGJyYW5jaCBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24KNS4gQSBwdWxsIHJlcXVlc3QgZXhpc3RzICh3aXRoIGF0IGxlYXN0IHRhc2ste3t0YXNrX2lkfX0gbGFiZWwpCgoqKkNvZGUgcXVhbGl0eSBpc3N1ZXMgYXJlIE9LIGZvciBSZXggLSBDbGVvIHdpbGwgZml4OioqCi0g4pqg77iPIENsaXBweSB3YXJuaW5ncz8gT0sgLSBDbGVvIHdpbGwgZml4Ci0g4pqg77iPIEZvcm1hdHRpbmcgaXNzdWVzPyBPSyAtIENsZW8gd2lsbCBmaXggIAotIOKaoO+4jyBTb21lIHRlc3RzIGZhaWxpbmc/IE9LIGlmIGJhc2ljIGZ1bmN0aW9uYWxpdHkgd29ya3MgLSBDbGVvL1Rlc3Mgd2lsbCBmaXgKLSDimqDvuI8gVW51c2VkIGZ1bmN0aW9ucy92YXJpYWJsZXM/IE9LIC0gQ2xlbyB3aWxsIGNsZWFuIHVwCgoqKkZvY3VzIG9uKio6IERvZXMgdGhlIGltcGxlbWVudGF0aW9uIHdvcms/IEFyZSB0aGUgZmVhdHVyZXMgdGhlcmU/CgoqKlJlc3BvbnNlIGZvcm1hdDoqKgoKSWYgZnVuY3Rpb25hbGx5IGNvbXBsZXRlIChmZWF0dXJlcyB3b3JrLCBjb2RlIGNvbXBpbGVzLCBQUiBjcmVhdGVkKSwgcmVzcG9uZCB3aXRoOiB5ZXMKCklmIGZlYXR1cmVzIGluY29tcGxldGUgb3IgY29kZSBkb2Vzbid0IGNvbXBpbGUsIHJlc3BvbmQgd2l0aDoKbm8KUkVBU09OOiA8c3BlY2lmaWMgRlVOQ1RJT05BTCBpc3N1ZT4KCkV4YW1wbGUgJ3llcycgcmVzcG9uc2UgKGV2ZW4gd2l0aCB3YXJuaW5ncyk6CnllcwoKRXhhbXBsZSAnbm8nIHJlc3BvbnNlOgpubwpSRUFTT046IEFjY2VwdGFuY2UgY3JpdGVyaWEgMiBpbmNvbXBsZXRlIC0gaGVhbHRoIGVuZHBvaW50IG5vdCB5ZXQgaW1wbGVtZW50ZWQuIEZlYXR1cmUgd29yayByZW1haW5zLgoKWW91ciByZXNwb25zZToiCiAgZWxzZQogICAgIyBEZWZhdWx0IGNvbXBsZXRpb24gcHJvbXB0IGZvciBvdGhlciBhZ2VudHMgKENsZW8sIFRlc3MpCiAgICBDT01QTEVUSU9OX1BST01QVD0iVGFzayB7e3Rhc2tfaWR9fSBjb21wbGV0aW9uIHZlcmlmaWNhdGlvbi4KCioqRklSU1QqKjogUmV2aWV3IHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhIGluIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZAoKKipUaGVuIGFuc3dlciAneWVzJyBPTkxZIGlmIEFMTCBvZiB0aGVzZSBhcmUgdHJ1ZToqKgoKMS4gKipFVkVSWSBhY2NlcHRhbmNlIGNyaXRlcmlvbiBpcyBmdWxseSBpbXBsZW1lbnRlZCoqIChub3QganVzdCBzdGFydGVkLCBidXQgRE9ORSkKMi4gQWxsIGNvZGUgY2hhbmdlcyBhcmUgY29tbWl0dGVkIHRvIGdpdAozLiBDaGFuZ2VzIGFyZSBwdXNoZWQgdG8gcmVtb3RlIGJyYW5jaCBmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24KNC4gQSBwdWxsIHJlcXVlc3QgZXhpc3RzICh3aXRoIGF0IGxlYXN0IHRhc2ste3t0YXNrX2lkfX0gbGFiZWw7IG90aGVyIGxhYmVscyBhcmUgb3B0aW9uYWwpCjUuIFF1YWxpdHkgZ2F0ZXMgcGFzc2VkIChjYXJnbyBmbXQsIGNhcmdvIGNsaXBweSB3aXRoIG5vIHdhcm5pbmdzLCB0ZXN0cyBwYXNzKQoKKipCZSBob25lc3QqKjogSWYgQU5ZIGFjY2VwdGFuY2UgY3JpdGVyaW9uIGlzIGluY29tcGxldGUgb3IgcGFydGlhbGx5IGltcGxlbWVudGVkLCBhbnN3ZXIgJ25vJyBhbmQgY29udGludWUgd29ya2luZy4KCioqVG8gdmVyaWZ5OioqCi0gUmV2aWV3OiBcYGNhdCB0YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWRcYAotIEdpdCBzdGF0dXM6IFxgZ2l0IHN0YXR1c1xgCi0gQ29tbWl0cyBwdXNoZWQ6IFxgZ2l0IGxvZyBvcmlnaW4vbWFpbi4uSEVBRFxgCi0gUFIgZXhpc3RzOiBcYGdoIHByIHZpZXdcYAotIFRlc3RzIHBhc3M6IENoZWNrIHlvdXIgdGVzdCByZXN1bHRzCgoqKlJlc3BvbnNlIGZvcm1hdDoqKgoKSWYgY29tcGxldGUsIHJlc3BvbmQgd2l0aDogeWVzCgpJZiBpbmNvbXBsZXRlLCByZXNwb25kIHdpdGg6Cm5vClJFQVNPTjogPHNwZWNpZmljIHJlYXNvbiB3aHkgbm90IGNvbXBsZXRlPgoKRm9yICdubycgcmVzcG9uc2VzLCBSRUFTT04gbXVzdCBzcGVjaWZ5OgotIFdoaWNoIGFjY2VwdGFuY2UgY3JpdGVyaWEgYXJlIGluY29tcGxldGUgKGxpc3QgdGhlbSBieSBudW1iZXIvbmFtZSkKLSBXaGF0IHNwZWNpZmljIHdvcmsgcmVtYWlucyAoYmUgY29uY3JldGUpCi0gQW55IGJsb2NrZXJzIG9yIGlzc3VlcyBlbmNvdW50ZXJlZAoKRXhhbXBsZSAnbm8nIHJlc3BvbnNlOgpubwpSRUFTT046IEFjY2VwdGFuY2UgY3JpdGVyaWEgMiBhbmQgNCBpbmNvbXBsZXRlLiBBUEkgZW5kcG9pbnQgL3VzZXJzIGNyZWF0ZWQgYnV0IG5vdCB5ZXQgY29ubmVjdGVkIHRvIGRhdGFiYXNlLiBQUiBjcmVhdGVkIGJ1dCB0ZXN0cyBmYWlsaW5nIGR1ZSB0byBtaXNzaW5nIGVycm9yIGhhbmRsaW5nIGluIHVzZXJfY29udHJvbGxlci5ycy4KCllvdXIgcmVzcG9uc2U6IgogIGZpCiAgQ09NUExFVElPTl9MQVNUX01FU1NBR0U9Ii90bXAvb3BlbmNvZGUtY29tcGxldGlvbi0ke0FUVEVNUFR9LnR4dCIKICBDT01QTEVUSU9OX0xPRz0iL3RtcC9vcGVuY29kZS1jb21wbGV0aW9uLSR7QVRURU1QVH0uanNvbmwiCgogIENPTVBMRVRJT05fUkVTUE9OU0U9IiIKICBpZiBbICIkQ09OVElOVUVfU0VTU0lPTiIgPSAiMSIgXTsgdGhlbgogICAgIyBXcml0ZSBjb21wbGV0aW9uIHByb21wdCB0byBmaWxlIChzYW1lIHBhdHRlcm4gYXMgbWFpbiBwcm9tcHQpCiAgICBDT01QTEVUSU9OX1BST01QVF9GSUxFPSIvdG1wL29wZW5jb2RlLWNvbXBsZXRpb24tcHJvbXB0LSR7QVRURU1QVH0udHh0IgogICAgcHJpbnRmICclcycgIiRDT01QTEVUSU9OX1BST01QVCIgPiAiJENPTVBMRVRJT05fUFJPTVBUX0ZJTEUiCiAgICAKICAgIHNldCArZQogICAgc2V0IC1vIHBpcGVmYWlsCiAgICBDT01QTEVUSU9OX0NNRD0oCiAgICAgICJvcGVuY29kZSIKICAgICAgInJ1biIKICAgICAgIi0tZm9ybWF0IgogICAgICAiJE9QRU5DT0RFX0ZPUk1BVCIKICAgICAgIi0tbG9nLWxldmVsIgogICAgICAiJE9QRU5DT0RFX0xPR19MRVZFTCIKICAgICkKICAgIGlmIFsgLW4gIiRMQVRFU1RfU0VTU0lPTl9JRCIgXTsgdGhlbgogICAgICBDT01QTEVUSU9OX0NNRCs9KCItLXNlc3Npb24iICIkTEFURVNUX1NFU1NJT05fSUQiKQogICAgZWxzZQogICAgICBDT01QTEVUSU9OX0NNRCs9KCItLWNvbnRpbnVlIikKICAgIGZpCiAgICAKICAgICMgUGFzcyBjb21wbGV0aW9uIHByb21wdCB2aWEgc3RkaW4KICAgICIke0NPTVBMRVRJT05fQ01EW0BdfSIgPCAiJENPTVBMRVRJT05fUFJPTVBUX0ZJTEUiIHwgdGVlICIkQ09NUExFVElPTl9MT0ciCiAgICBDT01QTEVUSU9OX0VYSVQ9JHtQSVBFU1RBVFVTWzBdfQogICAgc2V0ICtvIHBpcGVmYWlsCiAgICBzZXQgLWUKICAgIAogICAgIyBDbGVhbiB1cCBwcm9tcHQgZmlsZQogICAgcm0gLWYgIiRDT01QTEVUSU9OX1BST01QVF9GSUxFIgoKICAgIGlmIFsgJENPTVBMRVRJT05fRVhJVCAtbmUgMCBdOyB0aGVuCiAgICAgIGVjaG8gIuKaoO+4jyBDb21wbGV0aW9uIHByb2JlIGV4aXRlZCB3aXRoIHN0YXR1cyAkQ09NUExFVElPTl9FWElUIgogICAgZmkKCiAgICB3cml0ZV9sYXN0X21lc3NhZ2UgIiRDT01QTEVUSU9OX0xPRyIgIiRDT01QTEVUSU9OX0xBU1RfTUVTU0FHRSIgfHwgdHJ1ZQoKICAgIGVjaG8gIltvcGVuY29kZS1kZWJ1Z10gQ29tcGxldGlvbiBwcm9iZSBmb3IgYXR0ZW1wdCAkQVRURU1QVCBleGl0ZWQgJENPTVBMRVRJT05fRVhJVCIKCiAgICBpZiBbIC1zICIkQ09NUExFVElPTl9MQVNUX01FU1NBR0UiIF07IHRoZW4KICAgICAgQ09NUExFVElPTl9SRVNQT05TRT0kKHRyIC1kICdccicgPCAiJENPTVBMRVRJT05fTEFTVF9NRVNTQUdFIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogICAgICBlY2hvICLwn6euIENvbXBsZXRpb24gcHJvYmUgcmVzcG9uc2U6ICRDT01QTEVUSU9OX1JFU1BPTlNFIgogICAgICAKICAgICAgIyBFeHRyYWN0IHJlYXNvbiBpZiByZXNwb25zZSBpcyAnbm8nCiAgICAgIGlmIGVjaG8gIiRDT01QTEVUSU9OX1JFU1BPTlNFIiB8IGdyZXAgLUVxICdebm8nOyB0aGVuCiAgICAgICAgQ09NUExFVElPTl9SRUFTT049JChlY2hvICIkQ09NUExFVElPTl9SRVNQT05TRSIgfCBncmVwIC1BIDEwMCAicmVhc29uOiIgfCB0YWlsIC1uICsxIHwgc2VkICdzL15yZWFzb246XHMqLy8nIHwgaGVhZCAtbiAyMCkKICAgICAgICBpZiBbIC1uICIkQ09NUExFVElPTl9SRUFTT04iIF07IHRoZW4KICAgICAgICAgIGVjaG8gIvCfk4sgSW5jb21wbGV0aW9uIGRldGFpbHM6IgogICAgICAgICAgZWNobyAiJENPTVBMRVRJT05fUkVBU09OIgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIuKaoO+4jyBObyByZWFzb24gcHJvdmlkZWQgZm9yIGluY29tcGxldGUgc3RhdHVzIgogICAgICAgIGZpCiAgICAgIGZpCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKEue+4jyBDb21wbGV0aW9uIHByb2JlIHNraXBwZWQgKHNlc3Npb24gY29udGludWF0aW9uIGRpc2FibGVkKSIKICBmaQoKICBpZiBlY2hvICIkQ09NUExFVElPTl9SRVNQT05TRSIgfCBncmVwIC1FcSAnXnllcyc7IHRoZW4KICAgIFNVQ0NFU1M9MQogICAgYnJlYWsKICBmaQoKICBlY2hvICJbb3BlbmNvZGUtZGVidWddIENvbXBsZXRpb24gcmVzcG9uc2Ugb24gYXR0ZW1wdCAkQVRURU1QVDogJENPTVBMRVRJT05fUkVTUE9OU0UiCgogIGVjaG8gIuKaoO+4jyBPcGVuQ29kZSByZXBvcnRlZCB0YXNrIGluY29tcGxldGU7IHJldHJ5aW5nLi4uIgogIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQpkb25lCgppZiBbICRTVUNDRVNTIC1uZSAxIF07IHRoZW4KICBpZiBbICIkVU5MSU1JVEVEX1JFVFJJRVMiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBPcGVuQ29kZSBkaWQgbm90IGNvbmZpcm0gdGFzayBjb21wbGV0aW9uIGFmdGVyICRBVFRFTVBUIGF0dGVtcHRzICh1bmxpbWl0ZWQgbW9kZSkiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIE9wZW5Db2RlIGRpZCBub3QgY29uZmlybSB0YXNrIGNvbXBsZXRpb24gYWZ0ZXIgJE1BWF9SRVRSSUVTIGF0dGVtcHRzIgogIGZpCiAgZWNobyAi4p2MIFRhc2sgaW5jb21wbGV0ZSAtIG1hcmtpbmcgYXMgRkFJTEVEIgogIAogICMgRGlzcGxheSB0aGUgbGFzdCByZWNvcmRlZCByZWFzb24gZm9yIGluY29tcGxldGlvbgogIGlmIFsgLW4gIiRDT01QTEVUSU9OX1JFQVNPTiIgXTsgdGhlbgogICAgZWNobyAiIgogICAgZWNobyAi8J+SoSBMYXN0IHJlcG9ydGVkIHJlYXNvbiBmb3IgaW5jb21wbGV0aW9uOiIKICAgIGVjaG8gIiRDT01QTEVUSU9OX1JFQVNPTiIKICBmaQogIAogIEVYSVRfQ09ERT0xICAjIEZBSUwgdGhlIGpvYiBzbyBpdCBkb2Vzbid0IGFwcGVhciBzdWNjZXNzZnVsCmVsc2UKICBlY2hvICLinIUgT3BlbkNvZGUgY29uZmlybWVkIHRhc2sgY29tcGxldGlvbiIKICBpZiBbICR7T1BFTkNPREVfRVhJVDotMH0gLW5lIDAgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIE9wZW5Db2RlIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgY29kZSAke09QRU5DT0RFX0VYSVR9LCBidXQgY29tcGxldGlvbiBwcm9iZSBwYXNzZWQiCiAgZmkKICBFWElUX0NPREU9MApmaQoKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UjSBWZXJpZnlpbmcgcHVsbCByZXF1ZXN0IHN0YXR1cyIKICBlbnN1cmVfcHJfY3JlYXRlZAplbHNlCiAgZWNobyAi4pqg77iPIFNraXBwaW5nIGF1dG8gUFIgZW5mb3JjZW1lbnQgZHVlIHRvIE9wZW5Db2RlIGNvbXBsZXRpb24gc3RhdHVzIgpmaQoKIyBTdWJtaXQgR2l0SHViIFBSIHJldmlldyBmb3IgQ2xlby9UZXNzIHN0YWdlcyAoZW5hYmxlcyB3b3JrZmxvdyBwcm9ncmVzc2lvbikKV09SS0ZMT1dfU1RBR0U9IiR7V09SS0ZMT1dfU1RBR0U6LX0iCmlmIFsgIiRXT1JLRkxPV19TVEFHRSIgPSAicXVhbGl0eSIgXSB8fCBbICIkV09SS0ZMT1dfU1RBR0UiID0gInRlc3RpbmciIF07IHRoZW4KICBQUl9OVU09IiR7UFJfTlVNQkVSOi19IgogIGlmIFsgLXogIiRQUl9OVU0iIF07IHRoZW4KICAgICMgVHJ5IHRvIGdldCBQUiBudW1iZXIgZnJvbSBjdXJyZW50IGJyYW5jaAogICAgQ1VSUkVOVF9CUkFOQ0g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBbIC1uICIkQ1VSUkVOVF9CUkFOQ0giIF07IHRoZW4KICAgICAgUFJfTlVNPSQoZ2ggcHIgbGlzdCAtLXN0YXRlIG9wZW4gLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBmaQogIGZpCgogIGlmIFsgLW4gIiRQUl9OVU0iIF07IHRoZW4KICAgIGlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogICAgICBTVEFHRV9OQU1FPSJRdWFsaXR5IgogICAgICBTVEFHRV9FTU9KST0i8J+boe+4jyIKICAgICAgQ0hFQ0tTX1BBU1NFRD0kJy0gQ29kZSBmb3JtYXR0aW5nIHZlcmlmaWVkCi0gTGludGluZyBwYXNzZWQKLSBVbml0IHRlc3RzIHN1Y2Nlc3NmdWwKLSBRdWFsaXR5IHN0YW5kYXJkcyBtZXQnCiAgICAgIE5FWFRfU1RBR0U9ImVuZC10by1lbmQgdGVzdGluZyBieSBUZXNzIgogICAgICAKICAgICAgaWYgWyAiJFdPUktGTE9XX1NUQUdFIiA9ICJ0ZXN0aW5nIiBdOyB0aGVuCiAgICAgICAgIyBUZXNzIGhhcyBmaW5hbCBhcHByb3ZhbCBhdXRob3JpdHkKICAgICAgICBTVEFHRV9OQU1FPSJRQSBUZXN0aW5nIgogICAgICAgIFNUQUdFX0VNT0pJPSLwn6eqIgogICAgICAgIENIRUNLU19QQVNTRUQ9JCctIEVuZC10by1lbmQgdGVzdHMgcGFzc2VkCi0gSW50ZWdyYXRpb24gdGVzdHMgc3VjY2Vzc2Z1bAotIEFjY2VwdGFuY2UgY3JpdGVyaWEgdmFsaWRhdGVkCi0gUHJvZHVjdGlvbiByZWFkaW5lc3MgY29uZmlybWVkJwogICAgICAgIE5FWFRfU1RBR0U9Imh1bWFuIHJldmlldyBhbmQgbWVyZ2UiCiAgICAgICAgCiAgICAgICAgZWNobyAi4pyFICRTVEFHRV9OQU1FIGNvbXBsZXRlIC0gcG9zdGluZyBBUFBST1ZFIHJldmlldyAoVGVzcyBmaW5hbCBhcHByb3ZhbCkiCiAgICAgICAgUkVWSUVXX0JPRFlfRklMRT0kKG1rdGVtcCkKICAgICAgICBjYXQgPDxFT0YgPiAiJFJFVklFV19CT0RZX0ZJTEUiCiMjIyAkU1RBR0VfRU1PSkkgJFNUQUdFX05BTUUgUmV2aWV3IC0gQVBQUk9WRUQKQWxsIGNoZWNrcyBoYXZlIHBhc3NlZDoKJENIRUNLU19QQVNTRUQKUmVhZHkgZm9yICRORVhUX1NUQUdFLgoKKipGaW5hbCBBcHByb3ZhbDoqKiBUZXNzIGhhcyB2ZXJpZmllZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgbWV0LgpFT0YKICAgICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tYXBwcm92ZSAtLWJvZHktZmlsZSAiJFJFVklFV19CT0RZX0ZJTEUiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgICAgICBybSAtZiAiJFJFVklFV19CT0RZX0ZJTEUiCiAgICAgIGVsc2UKICAgICAgICAjIENsZW8gaGFuZHMgb2ZmIHRvIFRlc3MgdmlhIGNvbW1lbnQgYW5kIGxhYmVsIChOT1QgYXBwcm92ZSkKICAgICAgICBlY2hvICLinIUgJFNUQUdFX05BTUUgY2hlY2tzIHBhc3NlZCAtIGhhbmRpbmcgb2ZmIHRvIFRlc3MiCiAgICAgICAgUkVWSUVXX0JPRFlfRklMRT0kKG1rdGVtcCkKICAgICAgICBjYXQgPDxFT0YgPiAiJFJFVklFV19CT0RZX0ZJTEUiCiMjIyAkU1RBR0VfRU1PSkkgJFNUQUdFX05BTUUgUmV2aWV3IC0gUEFTU0VECkFsbCBjaGVja3MgaGF2ZSBwYXNzZWQ6CiRDSEVDS1NfUEFTU0VECgoqKlN0YXR1czoqKiBSZWFkeSBmb3IgJE5FWFRfU1RBR0UKKipOZXh0IFN0ZXA6KiogVGVzcyB3aWxsIG5vdyBwZXJmb3JtIGNvbXByZWhlbnNpdmUgUUEgdmFsaWRhdGlvbgoKLS0tCipRdWFsaXR5IHJldmlldyBieSBDbGVvKgpFT0YKICAgICAgICByZWZyZXNoX3Rva2VuX2lmX25lZWRlZCB8fCB0cnVlCiAgICAgICAgdGltZW91dCAzMCBnaCBwciBjb21tZW50ICIkUFJfTlVNIiAtLWJvZHktZmlsZSAiJFJFVklFV19CT0RZX0ZJTEUiIDI+JjEgfHwgZWNobyAi4pqg77iPIFBSIGNvbW1lbnQgY29tbWFuZCBmYWlsZWQiCiAgICAgICAgcm0gLWYgIiRSRVZJRVdfQk9EWV9GSUxFIgogICAgICAgIAogICAgICAgICMgQWRkIHJlYWR5LWZvci1xYSBsYWJlbCB0byBzaWduYWwgVGVzcwogICAgICAgIGVjaG8gIvCfj7fvuI8gIEFkZGluZyAncmVhZHktZm9yLXFhJyBsYWJlbCB0byB0cmlnZ2VyIFRlc3MgcmV2aWV3IgogICAgICAgIHRpbWVvdXQgMzAgZ2ggcHIgZWRpdCAiJFBSX05VTSIgLS1hZGQtbGFiZWwgInJlYWR5LWZvci1xYSIgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCByZWFkeS1mb3ItcWEgbGFiZWwiCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIFNUQUdFX05BTUU9IlF1YWxpdHkiCiAgICAgIFNUQUdFX0VNT0pJPSLwn5uh77iPIgogICAgICBJU1NVRVNfREVTQz0kJy0gUmV2aWV3IGNvZGUgZm9ybWF0dGluZwotIEZpeCBsaW50aW5nIGVycm9ycwotIEVuc3VyZSB1bml0IHRlc3RzIHBhc3MKLSBNZWV0IHF1YWxpdHkgc3RhbmRhcmRzJwogICAgICBpZiBbICIkV09SS0ZMT1dfU1RBR0UiID0gInRlc3RpbmciIF07IHRoZW4KICAgICAgICBTVEFHRV9OQU1FPSJRQSBUZXN0aW5nIgogICAgICAgIFNUQUdFX0VNT0pJPSLwn6eqIgogICAgICAgIElTU1VFU19ERVNDPSQnLSBGaXggZmFpbGluZyBlbmQtdG8tZW5kIHRlc3RzCi0gQWRkcmVzcyBpbnRlZ3JhdGlvbiB0ZXN0IGZhaWx1cmVzCi0gVmFsaWRhdGUgYWNjZXB0YW5jZSBjcml0ZXJpYQotIEVuc3VyZSBwcm9kdWN0aW9uIHJlYWRpbmVzcycKICAgICAgZmkKCiAgICAgIGVjaG8gIuKdjCAkU1RBR0VfTkFNRSBpc3N1ZXMgZGV0ZWN0ZWQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICAgIFJFVklFV19CT0RZX0ZJTEU9JChta3RlbXApCiAgICAgIGNhdCA8PEVPRiA+ICIkUkVWSUVXX0JPRFlfRklMRSIKIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwokU1RBR0VfTkFNRSBpc3N1ZXMgZGV0ZWN0ZWQuIFBsZWFzZSBhZGRyZXNzIHRoZSBmb2xsb3dpbmc6CiRJU1NVRVNfREVTQwpFT0YKICAgICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQgfHwgdHJ1ZQogICAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5LWZpbGUgIiRSRVZJRVdfQk9EWV9GSUxFIiAyPiYxIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCBmYWlsZWQiCiAgICAgIHJtIC1mICIkUkVWSUVXX0JPRFlfRklMRSIKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4oS577iPIE5vIFBSIG51bWJlciBhdmFpbGFibGUgZm9yICRXT1JLRkxPV19TVEFHRSByZXZpZXcgc3VibWlzc2lvbiIKICBmaQpmaQoKdG91Y2ggL3dvcmtzcGFjZS8uYWdlbnRfZG9uZSAyPi9kZXYvbnVsbCB8fCB0cnVlCgppZiBbICRTVUNDRVNTIC1uZSAxIF07IHRoZW4KICB7eyNpZiBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fQplY2hvICJ7e2FnZW50X2NvbXBsZXRpb25fbWVzc2FnZX19IgogIHt7ZWxzZX19CmVjaG8gIuKaoO+4jyBPcGVuQ29kZSBleGVjdXRpb24gaW5jb21wbGV0ZSIKICB7ey9pZn19CiAgZXhpdCAkRVhJVF9DT0RFCmZpCgp7eyNpZiBhZ2VudF9jb21wbGV0aW9uX21lc3NhZ2V9fQplY2hvICJ7e2FnZW50X2NvbXBsZXRpb25fbWVzc2FnZX19Igp7e2Vsc2V9fQplY2hvICLinIUgT3BlbkNvZGUgZXhlY3V0aW9uIGNvbXBsZXRlIgp7ey9pZn19CmV4aXQgJEVYSVRfQ09ERQ== code_opencode_container-cleo.sh.hbs: e3s+IG9wZW5jb2RlX2NvbnRhaW5lcl9iYXNlCiAgICBhZ2VudF9iYW5uZXI9IvCflKcgQ2xlbyBPcGVuQ29kZSBxdWFsaXR5IHdvcmtmbG93IHN0YXJ0aW5nIgogICAgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlPSLinIUgQ2xlbyBPcGVuQ29kZSBxdWFsaXR5IHJldmlldyBjb21wbGV0ZSJ9fQo= code_opencode_container-rex-remediation.sh.hbs: e3s+IG9wZW5jb2RlX2NvbnRhaW5lcl9iYXNlCiAgICBhZ2VudF9iYW5uZXI9IvCflKcgUmV4IE9wZW5Db2RlIHJlbWVkaWF0aW9uIHdvcmtmbG93IHN0YXJ0aW5nIC0gRml4IE9ubHkgTW9kZSIKICAgIGFnZW50X2NvbXBsZXRpb25fbWVzc2FnZT0i4pyFIFJleCBPcGVuQ29kZSByZW1lZGlhdGlvbiBjb21wbGV0ZSJ9fQ== code_opencode_container-rex.sh.hbs: e3s+IG9wZW5jb2RlX2NvbnRhaW5lcl9iYXNlCiAgICBhZ2VudF9iYW5uZXI9IvCflKcgUmV4IE9wZW5Db2RlIGltcGxlbWVudGF0aW9uIHdvcmtmbG93IHN0YXJ0aW5nIgogICAgYWdlbnRfY29tcGxldGlvbl9tZXNzYWdlPSLinIUgUmV4IE9wZW5Db2RlIGltcGxlbWVudGF0aW9uIGNvbXBsZXRlIn19Cg== From 7312b9045d37e067e3814f2217d25bc9f7e7a535 Mon Sep 17 00:00:00 2001 From: MCP Server Date: Fri, 3 Oct 2025 20:28:22 -0700 Subject: [PATCH 3/7] fix(tess): escape backticks in heredoc instead of quoting delimiter Previous fix quoted the heredoc delimiter which caused bash syntax errors because command substitution \$(cat <` + * \`toolman kubernetes_listResources --kind namespaces\` + * \`toolman kubernetes_getPodsLogs --namespace test-\$TASK_ID --pod \` - End-to-end expectations when cluster access exists: - a) **Create namespace** for the test (via Toolman `kubernetes_createResource` or `kubectl create ns test-$TASK_ID`). + a) **Create namespace** for the test (via Toolman \`kubernetes_createResource\` or \`kubectl create ns test-\$TASK_ID\`). b) **Deploy** the universal chart and wait for pods to become ready. c) **Verify pod health** (Toolman list pods / `kubectl get pods`). d) **Exercise the service** (port-forward and hit health/test endpoints). From 6ec15003cfb717f4fde35a1188f7fe134a275d18 Mon Sep 17 00:00:00 2001 From: MCP Server Date: Fri, 3 Oct 2025 20:28:53 -0700 Subject: [PATCH 4/7] fix(tess): escape remaining backticks in heredoc documentation Escaped the remaining unescaped backticks in kubectl examples. All backticks in the INITIAL_GUIDANCE heredoc are now escaped. --- .../agent-templates/code/claude/container-tess.sh.hbs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs index aaf8f29e..57656be7 100644 --- a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs +++ b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs @@ -1212,10 +1212,10 @@ You are Tess - the quality gatekeeper for **Task $TASK_ID ONLY**. Your job is to - End-to-end expectations when cluster access exists: a) **Create namespace** for the test (via Toolman \`kubernetes_createResource\` or \`kubectl create ns test-\$TASK_ID\`). b) **Deploy** the universal chart and wait for pods to become ready. - c) **Verify pod health** (Toolman list pods / `kubectl get pods`). + c) **Verify pod health** (Toolman list pods / \`kubectl get pods\`). d) **Exercise the service** (port-forward and hit health/test endpoints). e) **Teardown** namespace to avoid orphaned resources. - - If both Toolman and local `kubectl` are unavailable, record that in the PR review; otherwise a deployment check is required before approval. + - If both Toolman and local \`kubectl\` are unavailable, record that in the PR review; otherwise a deployment check is required before approval. - Always include the exact commands/tool invocations in the review summary so operators can audit the run. 4. **Task $TASK_ID Acceptance Criteria (100% or REJECT)**: From f83ee672571925ef77cc88d5d4d8760341d224ca Mon Sep 17 00:00:00 2001 From: MCP Server Date: Fri, 3 Oct 2025 20:54:26 -0700 Subject: [PATCH 5/7] fix(tess): fix if/else/fi indentation to resolve syntax error The else block at line 1860 had no indentation, causing it to close the outer if statement at line 1757 instead of the nested if at line 1844. This created a second else block at line 2067, which bash rejected. Fixed by indenting line 1860 to match its corresponding if statement. --- .../agent-templates/code/claude/container-tess.sh.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs index 57656be7..213b5487 100644 --- a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs +++ b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs @@ -1857,7 +1857,7 @@ if [ "$GH_AVAILABLE" = "true" ]; then - [ ] Add branch protection rules **Note**: Cannot proceed with QA until CI is properly configured." || echo "⚠️ PR review command timed out or failed (exit code: $?)" -else + else # Function to parse JSON without jq dependency parse_ci_json() { local json="$1" From 6b4b598ff05313d27e7da2e16223d3ec0b48f365 Mon Sep 17 00:00:00 2001 From: MCP Server Date: Fri, 3 Oct 2025 20:56:16 -0700 Subject: [PATCH 6/7] fix(tess): add missing fi to close if statement at line 1844 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The if statement at line 1844 was never closed with a fi. The else at line 1860 had its closing fi at line 2065, but that only closed the nested if/elif/elif chain (lines 1952-2007). Added fi at line 2066 to properly close the if at line 1844. Structure: - 1757: if GH_AVAILABLE - 1844: if CI_JSON empty - post no-CI review - 1860: else - 1952: if FAILED_CHECKS > 0 - 1980: elif PENDING_CHECKS > 0 - 2007: elif SUCCESS_CHECKS == TOTAL - 2040: else - 2065: fi (closes 1952) - 2066: fi (closes 1844) ← THIS WAS MISSING - 2068: else (GH not available) - 2072: fi (closes 1757) --- .../controller/agent-templates/code/claude/container-tess.sh.hbs | 1 + 1 file changed, 1 insertion(+) diff --git a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs index 213b5487..5abc7d2f 100644 --- a/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs +++ b/infra/charts/controller/agent-templates/code/claude/container-tess.sh.hbs @@ -2063,6 +2063,7 @@ $SUCCESS_DETAILS # Label manipulation removed - using GitHub PR reviews only update_coderun_status "needs-fixes" "changes_requested" "$PR_URL" fi + fi else # GitHub CLI not available - skip PR review From aa1f10d092bcb18c8d69aec3f59de44591291c23 Mon Sep 17 00:00:00 2001 From: 5DLabs Automation Date: Sat, 4 Oct 2025 04:44:41 +0000 Subject: [PATCH 7/7] chore(chart): regenerate agent templates ConfigMaps --- infra/charts/controller/templates/agent-templates-claude.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infra/charts/controller/templates/agent-templates-claude.yaml b/infra/charts/controller/templates/agent-templates-claude.yaml index 9c32d8c7..3e7fbcf0 100644 --- a/infra/charts/controller/templates/agent-templates-claude.yaml +++ b/infra/charts/controller/templates/agent-templates-claude.yaml @@ -11,13 +11,13 @@ metadata: app.kubernetes.io/component: agent-templates agent-templates/type: claude annotations: - templates-checksum: "95f487e0adc4193117321f95936abe8b1a99a2e7731418cb1e132216b0bedb8a" + templates-checksum: "f8cf28ead4e3a49fe7b438156e768c94ff891928e15783a7ec32303528db3aab" binaryData: code_claude_config.json.hbs: ewogICJtb2RlbCI6ICJ7e21vZGVsfX0iLAogICJtYXhfdG9rZW5zIjoge3ttYXhfdG9rZW5zfX0sCiAgInRlbXBlcmF0dXJlIjoge3t0ZW1wZXJhdHVyZX19LAogICJnaXRodWJfYXBwIjogInt7Z2l0aHViX2FwcH19IiwKICAiY2xpIjogInt7Y2xpfX0iLAogICJ0aW1lc3RhbXAiOiAie3t0aW1lc3RhbXB9fSIsCiAgImNvcnJlbGF0aW9uX2lkIjogInt7Y29ycmVsYXRpb25faWR9fSIsCiAge3sjaWYgdG9vbHN9fQogICJ0b29scyI6IHsKICAgIHt7I2lmIHRvb2xzLnJlbW90ZX19CiAgICAicmVtb3RlIjogWwogICAgICB7eyNlYWNoIHRvb2xzLnJlbW90ZX19CiAgICAgICJ7e3RoaXN9fSJ7eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAgICB7ey9lYWNofX0KICAgIF17eyNpZiB0b29scy5sb2NhbF9zZXJ2ZXJzfX0se3svaWZ9fQogICAge3svaWZ9fQogICAge3sjaWYgdG9vbHMubG9jYWxfc2VydmVyc319CiAgICAibG9jYWxfc2VydmVycyI6IHsKICAgICAge3sjZWFjaCB0b29scy5sb2NhbF9zZXJ2ZXJzfX0KICAgICAgInt7QGtleX19IjogewogICAgICAgICJlbmFibGVkIjoge3t0aGlzLmVuYWJsZWR9fSwKICAgICAgICAidG9vbHMiOiBbCiAgICAgICAgICB7eyNlYWNoIHRoaXMudG9vbHN9fQogICAgICAgICAgInt7dGhpc319Int7I3VubGVzcyBAbGFzdH19LHt7L3VubGVzc319CiAgICAgICAgICB7ey9lYWNofX0KICAgICAgICBdCiAgICAgIH17eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAgICB7ey9lYWNofX0KICAgIH0KICAgIHt7L2lmfX0KICB9LAogIHt7L2lmfX0KICB7eyNpZiBtY3Bfc2VydmVyc319CiAgIm1jcF9zZXJ2ZXJzIjogewogICAge3sjZWFjaCBtY3Bfc2VydmVyc319CiAgICAie3tAa2V5fX0iOiB7CiAgICAgICJjb21tYW5kIjogInt7dGhpcy5jb21tYW5kfX0iLAogICAgICB7eyNpZiB0aGlzLmFyZ3N9fQogICAgICAiYXJncyI6IFsKICAgICAgICB7eyNlYWNoIHRoaXMuYXJnc319CiAgICAgICAgInt7dGhpc319Int7I3VubGVzcyBAbGFzdH19LHt7L3VubGVzc319CiAgICAgICAge3svZWFjaH19CiAgICAgIF0sCiAgICAgIHt7L2lmfX0KICAgICAge3sjaWYgdGhpcy5lbnZ9fQogICAgICAiZW52IjogewogICAgICAgIHt7I2VhY2ggdGhpcy5lbnZ9fQogICAgICAgICJ7e0BrZXl9fSI6ICJ7e3RoaXN9fSJ7eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAgICAgIHt7L2VhY2h9fQogICAgICB9CiAgICAgIHt7L2lmfX0KICAgIH17eyN1bmxlc3MgQGxhc3R9fSx7ey91bmxlc3N9fQogICAge3svZWFjaH19CiAgfSwKICB7ey9pZn19CiAge3sjaWYgY2xpX2NvbmZpZ319CiAgImNsaV9jb25maWciOiB7e3tqc29uIGNsaV9jb25maWd9fX0sCiAge3svaWZ9fQogICJnZW5lcmF0ZWRfYnkiOiAiY2xpX2FkYXB0ZXJfY2xhdWRlIiwKICAidmVyc2lvbiI6ICIxLjAiCn0= code_claude_container-cleo.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIENMRU8gQ09ERSBRVUFMSVRZIFdPUktGTE9XIFNUQVJUSU5HICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICBDb2RlIFF1YWxpdHkgJiBDSS9DRCBQaXBlbGluZSBFbmZvcmNlbWVudCBBZ2VudCAgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCflI0gRm9jdXM6IENvZGUgcXVhbGl0eSwgQ0kvQ0Qgc2V0dXAsIGFuZCBEb2NrZXIgaW1hZ2UgYnVpbGRpbmciCmVjaG8gIvCfk4sgVGFzayBJRDoge3t0YXNrX2lkfX0iCmVjaG8gIuKchSBNaXNzaW9uOiBQZXJmZWN0IGNvZGUgcXVhbGl0eSBBTkQgd29ya2luZyBDSS9DRCBwaXBlbGluZSB3aXRoIERvY2tlciBidWlsZHMiCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCiMgU2V0IHVwIEVYSVQgdHJhcCB0byBlbnN1cmUgRG9ja2VyIHNpZGVjYXIgY2xlYW51cAp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFVFJZIENPTkZJR1VSQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BWF9SRVRSSUVTX0NPTkZJRz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDTEFVREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ0xBVURFX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBDbGVhbiB1cCBhbnkgbGVmdG92ZXIgY29tcGxldGlvbiBtYXJrZXIgZnJvbSBwcmV2aW91cyBydW5zCiMgVGhpcyBwcmV2ZW50cyBpc3N1ZXMgd2l0aCBzZXF1ZW50aWFsIHRhc2sgZXhlY3V0aW9ucyBvbiB0aGUgc2FtZSBQVkMKaWYgWyAtZiAvd29ya3NwYWNlLy5jbGVvLWNvbXBsZXRlIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgQ2xlYW5pbmcgdXAgY29tcGxldGlvbiBtYXJrZXIgZnJvbSBwcmV2aW91cyBydW4iCiAgICBybSAtZiAvd29ya3NwYWNlLy5jbGVvLWNvbXBsZXRlCmZpCgojIERpc2FibGUgaW50ZXJhY3RpdmUgR2l0IHByb21wdHMgZ2xvYmFsbHkKZXhwb3J0IEdJVF9URVJNSU5BTF9QUk9NUFQ9MApleHBvcnQgR0lUX0FTS1BBU1M9L2Jpbi90cnVlCmV4cG9ydCBTU0hfQVNLUEFTUz0vYmluL3RydWUKCiMgUmVwb3NpdG9yeSBVUkwKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKZWNobyAiVXNpbmcgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiBmb3IgY29kZSBxdWFsaXR5IGNoZWNrcyIKCiMgQXV0aGVudGljYXRlIHdpdGggR2l0SHViIEFwcAppZiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9JRCIgXTsgdGhlbgogICAgZWNobyAiQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwLi4uIgoKICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBwcml2YXRlIGtleSBmaWxlIChzdXBwb3J0IGVzY2FwZWQgbmV3bGluZXMpCiAgICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKICAgIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICBjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgR2VuZXJhdGUgSldUIHRva2VuIGZvciBHaXRIdWIgQXBwIChmaXhlZCBKV1QgZ2VuZXJhdGlvbiBmb3IgTGludXggY29udGFpbmVycykKICAgICMgSldUIGhlYWRlcgogICAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQoKICAgICMgSldUIHBheWxvYWQgd2l0aCBjdXJyZW50IHRpbWUgYW5kIGV4cGlyYXRpb24gKDEwIG1pbnV0ZXMpCiAgICBOT1c9JChkYXRlICslcykKICAgIEVYUD0kKChOT1cgKyA2MDApKQogICAgSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBTaWduIHRoZSBKV1QKICAgIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgICBKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gSUQgZm9yIHRoZSByZXBvc2l0b3J5IChyb2J1c3QgcGFyc2luZyBvZiBvd25lci9yZXBvKQogICAgSU5QVVRfUkVQTz0ie3tyZXBvc2l0b3J5X3VybH19IgogICAgUkVQT19PV05FUj0iIgogICAgUkVQT19OQU1FPSIiCgogICAgaWYgZWNobyAiJElOUFVUX1JFUE8iIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvLip8XDF8JykKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tL1teL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmdpdEBnaXRodWIuY29tOic7IHRoZW4KICAgICAgICAjIFNTSCBmb3JtYXQgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwbyguZ2l0KQogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsc2UKICAgICAgICAjIEZhbGxiYWNrOiBhc3N1bWUgc2x1ZyBvd25lci9yZXBvIChwb3NzaWJseSB3aXRoIC5naXQpCiAgICAgICAgU0xVRz0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xcLmdpdCR8fCcpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRTTFVHIiB8IGN1dCAtZCcvJyAtZjEpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMikKICAgIGZpCgogICAgZWNobyAiREVCVUc6IFBhcnNlZCByZXBvc2l0b3J5IC0gT3duZXI6ICckUkVQT19PV05FUicsIE5hbWU6ICckUkVQT19OQU1FJyIKCiAgICBlY2hvICJHZXR0aW5nIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRS4uLiIKCiAgICAjIEdldCB0aGUgaW5zdGFsbGF0aW9uIElEIChyZXRyeSBhbmQgZm9sbG93IHJlZGlyZWN0cykuIEZhbGxiYWNrIHRvIG9yZyBpbnN0YWxsYXRpb24uCiAgICBJTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgLS1jb25uZWN0LXRpbWVvdXQgNSAtLW1heC10aW1lIDEyIFwKICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIpCgogICAgSU5TVEFMTEFUSU9OX0lEPSQoZWNobyAiJElOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gUmVwbyBpbnN0YWxsYXRpb24gbm90IGZvdW5kLCB0cnlpbmcgb3JnIGluc3RhbGxhdGlvbi4uLiIKICAgICAgICBPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFPSQoY3VybCAtcyAtTCAtLXJldHJ5IDUgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktY29ubnJlZnVzZWQgXAogICAgICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIikKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkT1JHX0lOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKICAgIGZpCgogICAgaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykgICMgVHJhY2sgd2hlbiB0b2tlbiB3YXMgZ2VuZXJhdGVkIGZvciByZWZyZXNoIGxvZ2ljCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIGFjY2VzcyB0b2tlbiIKICAgICAgICBlY2hvICJSZXNwb25zZTogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViIEFwcCIKCiAgICAjIENsZWFuIHVwIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgRXhwb3J0IHRoZSB0b2tlbiBmb3IgZ2l0IHRvIHVzZQogICAgZXhwb3J0IEdJVEhVQl9UT0tFTgoKICAgICMgQ29uZmlndXJlIGdpdCB0byB1c2UgdGhlIHRva2VuICh1c2UgLS1yZXBsYWNlLWFsbCB0byBoYW5kbGUgbXVsdGlwbGUgZXhpc3RpbmcgaGVscGVycykKICAgIGdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciBzdG9yZQogICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKCiAgICAjIEFsc28gYXV0aGVudGljYXRlIGdoIENMSSB3aXRoIHRoZSB0b2tlbgogICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbgoKICAgICMgVG9rZW4gcmVmcmVzaCBmdW5jdGlvbnMgZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbigpIHsKICAgICAgICBlY2hvICLwn5SEIFJlZnJlc2hpbmcgR2l0SHViIEFwcCB0b2tlbi4uLiIKCiAgICAgICAgIyBDcmVhdGUgdGVtcG9yYXJ5IGtleSBmaWxlCiAgICAgICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS0kJCIKICAgICAgICBlY2hvICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAgICAgIyBHZW5lcmF0ZSBuZXcgSldUCiAgICAgICAgSldUX1RPS0VOPSQocnVieSAtciBvcGVuc3NsIC1yIGpzb24gLXIgYmFzZTY0IC1lICIKICAgICAgICBrZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUucmVhZCgnJFRFTVBfS0VZX0ZJTEUnKSkKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgICBpYXQ6IFRpbWUubm93LnRvX2kgLSA2MCwKICAgICAgICAgICAgZXhwOiBUaW1lLm5vdy50b19pICsgKDEwICogNjApLAogICAgICAgICAgICBpc3M6ICckR0lUSFVCX0FQUF9JRCcKICAgICAgICB9CiAgICAgICAgaGVhZGVyID0geyBhbGc6ICdSUzI1NicsIHR5cDogJ0pXVCcgfQoKICAgICAgICBoZWFkZXJfZW5jID0gQmFzZTY0LnVybHNhZmVfZW5jb2RlNjQoaGVhZGVyLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBwYXlsb2FkX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KHBheWxvYWQudG9fanNvbikuZ3N1YignPScsICcnKQogICAgICAgIHNpZ25hdHVyZSA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGtleS5zaWduKE9wZW5TU0w6OkRpZ2VzdDo6U0hBMjU2Lm5ldywgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9XCIpKS5nc3ViKCc9JywgJycpCgogICAgICAgIHB1dHMgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9LiN7c2lnbmF0dXJlfVwiCiAgICAgICAgIikKCiAgICAgICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIChyZXVzZSBsb2dpYyBmcm9tIGluaXRpYWwgYXV0aCkKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCgogICAgICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKICAgICAgICBmaQoKICAgICAgICAjIEdldCBuZXcgaW5zdGFsbGF0aW9uIHRva2VuCiAgICAgICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgICAgIE5FV19UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKCiAgICAgICAgaWYgWyAiJE5FV19UT0tFTiIgIT0gIm51bGwiIF0gJiYgWyAtbiAiJE5FV19UT0tFTiIgXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgICAgICAgICBleHBvcnQgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCgogICAgICAgICAgICAjIFVwZGF0ZSBnaXQgY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAyPi9kZXYvbnVsbAoKICAgICAgICAgICAgZWNobyAi4pyFIFRva2VuIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkiCiAgICAgICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgIH0KCiAgICAjIENoZWNrIGlmIHRva2VuIG5lZWRzIHJlZnJlc2ggKGNhbGwgYmVmb3JlIGdpdCBvcGVyYXRpb25zKQogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQoKSB7CiAgICAgICAgaWYgWyAteiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLimqDvuI8gTm8gdG9rZW4gdGltZXN0YW1wIGZvdW5kLCByZWZyZXNoaW5nIHRva2VuLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmaQoKICAgICAgICBOT1c9JChkYXRlICslcykKICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgIyBSZWZyZXNoIGlmIHRva2VuIGlzIG9sZGVyIHRoYW4gNTAgbWludXRlcyAodG9rZW5zIGxhc3QgMSBob3VyLCByZWZyZXNoIGF0IDUwIG1pbiB0byBiZSBzYWZlKQogICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMzAwMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflIQgVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgZmkKICAgIH0KCmVsc2UKICAgIGVjaG8gIuKdjCBHaXRIdWIgQXBwIGNyZWRlbnRpYWxzIG5vdCBmb3VuZCIKICAgIGV4aXQgMQpmaQoKIyBFeHRyYWN0IHJlcG9zaXRvcnkgbmFtZSBmcm9tIFVSTCAoZS5nLiwgIjVkbGFicy9ydXN0LWJhc2ljLWFwaS0yIiAtPiAicnVzdC1iYXNpYy1hcGktMiIpClJFUE9fTkFNRT0kKGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBzZWQgLUUgJ3N8LiovKFteL10rKSR8XDF8JyB8IHNlZCAnc3xcLmdpdCR8fCcpClJFUE9fUk9PVD0iL3dvcmtzcGFjZS8kUkVQT19OQU1FIgoKIyBEZXRlcm1pbmUgd29ya2luZyBkaXJlY3RvcnkgLSB1c2UgcmVwbyByb290IGlmIHdvcmtpbmdfZGlyZWN0b3J5IGlzICIuIiBvciBlbXB0eQpXT1JLX0RJUj0ie3t3b3JraW5nX2RpcmVjdG9yeX19IgppZiBbICIkV09SS19ESVIiID0gIi4iIF0gfHwgWyAteiAiJFdPUktfRElSIiBdIHx8IFsgIiRXT1JLX0RJUiIgPSAibnVsbCIgXTsgdGhlbgogIENMQVVERV9XT1JLX0RJUj0iJFJFUE9fUk9PVCIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iJFJFUE9fUk9PVC8kV09SS19ESVIiCmZpCgplY2hvICLwn5SnIFJlcG9zaXRvcnk6ICRSRVBPX05BTUUiCmVjaG8gIvCflKcgV29ya2luZyBkaXJlY3Rvcnkgd2lsbCBiZSBzZXQgdG86ICRDTEFVREVfV09SS19ESVIiCgojIFByZXBhcmUgZW52aXJvbm1lbnQgZm9yIFFBIGNoZWNrcwplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCfk4ogUFJFUEFSSU5HIENPREUgUVVBTElUWSBFTlZJUk9OTUVOVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDb25maWd1cmUgR2l0IGlkZW50aXR5CmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiY2xlb0A1ZGxhYnMuY29tIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSAiNURMYWJzLUNsZW8iCmdpdCBjb25maWcgLS1nbG9iYWwgaW5pdC5kZWZhdWx0QnJhbmNoIG1haW4KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgppZiBnaXQgbHMtcmVtb3RlICIkUkVQT19IVFRQX1VSTCIgSEVBRCA+IC90bXAvcmVwb190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgZWNobyAi4pyTIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3MgZmFpbGVkIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvcmVwb190ZXN0Lm91dCkiCiAgZWNobyAiICBHaXQgY3JlZGVudGlhbCBoZWxwZXIgc3RhdHVzOiIKICBnaXQgY29uZmlnIC0tbGlzdCB8IGdyZXAgY3JlZGVudGlhbCB8fCBlY2hvICIgIE5vIGNyZWRlbnRpYWwgaGVscGVycyBjb25maWd1cmVkIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIHJlcG9zaXRvcnkgdmlhIEhUVFBTIgogIGV4aXQgMQpmaQoKIyBUZXN0IGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBkb2NzIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkRE9DU19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRET0NTX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9kb2NzX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBzdWNjZXNzZnVsIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9kb2NzX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgRXJyb3Igb3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQpIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIGRvY3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIENsb25lIG9yIHVwZGF0ZSByZXBvc2l0b3J5CmNkIC93b3Jrc3BhY2UKaWYgWyAtZCAiJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHJlcG9zaXRvcnkgYXQgJyRSRVBPX1JPT1QnLCB1cGRhdGluZy4uLiIKICAgIGNkICIkUkVQT19OQU1FIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCmVsc2UKICAgIGVjaG8gIvCfk6UgQ2xvbmluZyByZXBvc2l0b3J5IHRvICckUkVQT19ST09UJy4uLiIKICAgIGlmICEgZ2l0IGNsb25lICIkUkVQT19IVFRQX1VSTCIgIiRSRVBPX05BTUUiOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSByZXBvc2l0b3J5IgogICAgICAgIGV4aXQgMQogICAgZmkKICAgIGNkICIkUkVQT19OQU1FIgpmaQoKIyBDcmVhdGUgd29ya2luZyBkaXJlY3RvcnkgaWYgaXQncyBhIHN1YmRpcmVjdG9yeQppZiBbICIkQ0xBVURFX1dPUktfRElSIiAhPSAiJFJFUE9fUk9PVCIgXTsgdGhlbgogICAgbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmZpCgpjZCAiJENMQVVERV9XT1JLX0RJUiIKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgoKIyBEZXJpdmUgcmVwb3NpdG9yeSBzbHVnIGZvciBnaCBDTEkgb3BlcmF0aW9ucwpSRVBPX1NMVUc9IiIKaWYgZ2l0IC1DICIkQ0xBVURFX1dPUktfRElSIiByZW1vdGUgZ2V0LXVybCBvcmlnaW4gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgT1JJR0lOX1VSTD0kKGdpdCAtQyAiJENMQVVERV9XT1JLX0RJUiIgcmVtb3RlIGdldC11cmwgb3JpZ2luIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSsvW14vXSspKFxcLmdpdCk/fFxcMXwnKQogIGVsaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICBSRVBPX1NMVUc9JChlY2hvICIkT1JJR0lOX1VSTCIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rL1teL10rKShcXC5naXQpP3xcXDF8JykKICBmaQpmaQoKIyBJZiBQUiBjb250ZXh0IGlzIG1pc3NpbmcsIHRyeSB0byBkaXNjb3ZlciBieSB0YXNrIGxhYmVsCmlmIFsgLXogIiR7UFJfTlVNQkVSOi19IiBdIHx8IFsgLXogIiR7UFJfVVJMOi19IiBdOyB0aGVuCiAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUR9IgogIGlmIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxICYmIFsgLW4gIiRSRVBPX1NMVUciIF07IHRoZW4KICAgIENBTkRfTlVNPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1sYWJlbCAiJFRBU0tfTEFCRUwiIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkQ0FORF9OVU0iIF07IHRoZW4KICAgICAgUFJfTlVNQkVSPSIkQ0FORF9OVU0iCiAgICAgIFBSX1VSTD0kKGdoIHByIHZpZXcgIiRQUl9OVU1CRVIiIC1SICIkUkVQT19TTFVHIiAtLWpzb24gdXJsIC1xIC51cmwgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgICAgZWNobyAi4pyTIERpc2NvdmVyZWQgUFIgY29udGV4dCB2aWEgbGFiZWw6IFBSICMkUFJfTlVNQkVSICgkUFJfVVJMKSIKICAgIGZpCiAgZmkKZmkKCiMgQ2hlY2tvdXQgUFIgYnJhbmNoIGZvciBxdWFsaXR5IHJldmlldwppZiBbIC1uICIkUFJfTlVNQkVSIiBdICYmIFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgQ2hlY2tpbmcgb3V0IFBSICMkUFJfTlVNQkVSIGZvciBxdWFsaXR5IHJldmlldy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgoKICAgICMgRmV0Y2ggYWxsIGxhdGVzdCBjaGFuZ2VzIGluY2x1ZGluZyBQUiBicmFuY2hlcwogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCgogICAgIyBHZXQgUFIgYnJhbmNoIGluZm9ybWF0aW9uIGFuZCBjaGVja291dAogICAgUFJfQlJBTkNIPSQoZ2ggcHIgdmlldyAiJFBSX05VTUJFUiIgLS1qc29uIGhlYWRSZWZOYW1lIC0tanEgJy5oZWFkUmVmTmFtZScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIFsgLW4gIiRQUl9CUkFOQ0giIF07IHRoZW4KICAgICAgICBlY2hvICLwn5OmIENoZWNraW5nIG91dCBQUiBicmFuY2g6ICRQUl9CUkFOQ0giCiAgICAgICAgaWYgZ2l0IGNoZWNrb3V0ICIkUFJfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5OlIFB1bGxpbmcgbGF0ZXN0IGNoYW5nZXMgZnJvbSAkUFJfQlJBTkNILi4uIgogICAgICAgICAgICBnaXQgcHVsbCBvcmlnaW4gIiRQUl9CUkFOQ0giIHx8IGVjaG8gIuKaoO+4jyAgQ291bGQgbm90IHB1bGwgbGF0ZXN0IGNoYW5nZXMiCiAgICAgICAgZWxpZiBnaXQgY2hlY2tvdXQgLWIgIiRQUl9CUkFOQ0giICJvcmlnaW4vJFBSX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZWNobyAi4pyFIENyZWF0ZWQgYW5kIGNoZWNrZWQgb3V0IHRyYWNraW5nIGJyYW5jaCBmb3IgJFBSX0JSQU5DSCIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKaoO+4jyAgQnJhbmNoIGNoZWNrb3V0IGZhaWxlZCwgdHJ5aW5nIEdpdEh1YiBDTEkgbWV0aG9kLi4uIgogICAgICAgICAgICBnaCBwciBjaGVja291dCAiJFBSX05VTUJFUiIgfHwgZWNobyAi4p2MIEZhaWxlZCB0byBjaGVja291dCBQUiB2aWEgZ2ggQ0xJIgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPICBDb3VsZCBub3QgZGV0ZXJtaW5lIFBSIGJyYW5jaCBuYW1lLCB1c2luZyBHaXRIdWIgQ0xJIHRvIGNoZWNrb3V0IFBSIGRpcmVjdGx5IgogICAgICAgIGdoIHByIGNoZWNrb3V0ICIkUFJfTlVNQkVSIiB8fCBlY2hvICLinYwgRmFpbGVkIHRvIGNoZWNrb3V0IFBSIgogICAgZmkKCiAgICAjIFZlcmlmeSB3ZSdyZSBvbiB0aGUgcmlnaHQgY29tbWl0CiAgICBDVVJSRU5UX1NIQT0kKGdpdCByZXYtcGFyc2UgSEVBRCkKICAgIGVjaG8gIvCfk40gQ3VycmVudCBjb21taXQ6ICRDVVJSRU5UX1NIQSIKCiAgICAjIERvbid0IGNoYW5nZSBkaXJlY3RvcnkgeWV0IC0gd2UnbGwgY2QgdG8gQ0xBVURFX1dPUktfRElSIGF0IHRoZSBlbmQKICAgIGVjaG8gIuKchSBSZXBvc2l0b3J5IHBvc2l0aW9uZWQgYXQgUFIgIyRQUl9OVU1CRVIgd2l0aCBsYXRlc3QgY2hhbmdlcyIKZWxzZQogICAgZWNobyAi4pqg77iPICBObyBQUiBjb250ZXh0IGZvdW5kIChQUl9OVU1CRVI9JFBSX05VTUJFUiwgUFJfVVJMPSRQUl9VUkwpIgogICAgZWNobyAi8J+TiyBXaWxsIHBlcmZvcm0gcXVhbGl0eSByZXZpZXcgb24gY3VycmVudCByZXBvc2l0b3J5IHN0YXRlIgpmaQoKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SNIENPREUgUVVBTElUWSBBTkFMWVNJUyBQUkVQQVJBVElPTiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCmVjaG8gIk1JU1NJT046IEVuZm9yY2Ugcmlnb3JvdXMgY29kZSBxdWFsaXR5IHN0YW5kYXJkczoiCmVjaG8gIjEuIFJ1biBDbGlwcHkgcGVkYW50aWMgY2hlY2tzIG9uIGFsbCBSdXN0IGNvZGUgY2hhbmdlcyIKZWNobyAiMi4gVmVyaWZ5IGNvZGUgZm9ybWF0dGluZyB3aXRoIGNhcmdvIGZtdCAtLWNoZWNrIgplY2hvICIzLiBFeGVjdXRlIGFsbCB0ZXN0cyB3aXRoIGNhcmdvIHRlc3QiCmVjaG8gIjQuIExpbnQgWUFNTCBmaWxlcyB3aGVuIFlBTUwgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQiCmVjaG8gIjUuIEFkZCAncmVhZHktZm9yLXFhJyBsYWJlbCBvbmx5IHdoZW4gYWxsIHF1YWxpdHkgY2hlY2tzIHBhc3MiCmVjaG8gIiIKZWNobyAiUXVhbGl0eSBTdGFuZGFyZHM6IgplY2hvICItIFplcm8gY2xpcHB5IHdhcm5pbmdzIChwZWRhbnRpYyBsZXZlbCkiCmVjaG8gIi0gUGVyZmVjdCBjb2RlIGZvcm1hdHRpbmciCmVjaG8gIi0gMTAwJSB0ZXN0IHBhc3NpbmcgcmF0ZSIKZWNobyAiLSBDbGVhbiBZQU1MIHN5bnRheCBhbmQgc3RydWN0dXJlIgplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgQ29weSB0YXNrIGZpbGVzIGZyb20gZG9jcyByZXBvc2l0b3J5IGlmIGNvbmZpZ3VyZWQKZWNobyAi8J+TiyBQcmVwYXJpbmcgdGFzayBkb2N1bWVudGF0aW9uIGZvciBxdWFsaXR5IHJldmlldy4uLiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKe3sjaWYgZG9jc1JlcG9zaXRvcnlVcmx9fQojIEluaXRpYWxpemUgY29tcHJlaGVuc2l2ZSB0cmFja2luZyB3aXRoIGV4cGxpY2l0IHN0YWdlIGZsYWdzCkNPUElFRF9GSUxFUz0iIgpGQUlMRURfRklMRVM9IiIKRVhJU1RJTkdfRklMRVM9IiIKRE9DU19TRVRVUF9TVUNDRVNTPWZhbHNlCkRPQ1NfQVVUSF9WRVJJRklFRD1mYWxzZQpET0NTX0NMT05FX1NVQ0NFU1M9ZmFsc2UKRE9DU19QQVRIX1ZBTElEPWZhbHNlCgojIFByZXBhcmUgdGFyZ2V0IGRpcmVjdG9yeSAoZW5zdXJlIGl0IGV4aXN0cykKaWYgISBta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUi90YXNrIiAyPi90bXAvbWtkaXJfZXJyb3IubG9nOyB0aGVuCiAgICBlY2hvICLinYwgQ1JJVElDQUw6IENhbm5vdCBjcmVhdGUgdGFzayBkaXJlY3RvcnkiCiAgICBlY2hvICIgICBFcnJvcjogJChjYXQgL3RtcC9ta2Rpcl9lcnJvci5sb2cgMj4vZGV2L251bGwgfHwgZWNobyAndW5rbm93bicpIgogICAgZWNobyAiICAgQWJvcnRpbmcgZG9jcyBzZXR1cCIKZWxzZQogICAgZWNobyAi4pyTIFRhc2sgZGlyZWN0b3J5IHByZXBhcmVkOiAkQ0xBVURFX1dPUktfRElSL3Rhc2siCmZpCgojIFZhbGlkYXRlIEdpdEh1YiB0b2tlbiBleGlzdHMgYmVmb3JlIHByb2NlZWRpbmcKaWYgWyAteiAiJEdJVEhVQl9UT0tFTiIgXTsgdGhlbgogICAgZWNobyAi4p2MIENSSVRJQ0FMOiBObyBHSVRIVUJfVE9LRU4gYXZhaWxhYmxlIgogICAgZWNobyAiICAgQ2Fubm90IGF1dGhlbnRpY2F0ZSB0byBkb2NzIHJlcG9zaXRvcnkiCiAgICBlY2hvICIgICBBYm9ydGluZyBkb2NzIHNldHVwIC0gYWdlbnQgd2lsbCBoYXZlIGxpbWl0ZWQgY29udGV4dCIKICAgIERPQ1NfQVVUSF9WRVJJRklFRD1mYWxzZQplbHNlCiAgICBlY2hvICLinJMgR2l0SHViIHRva2VuIGF2YWlsYWJsZSAoJHsjR0lUSFVCX1RPS0VOfSBjaGFycykiCiAgICBET0NTX0FVVEhfVkVSSUZJRUQ9dHJ1ZQpmaQoKIyBPbmx5IHByb2NlZWQgaWYgd2UgaGF2ZSBhdXRoZW50aWNhdGlvbgppZiBbICIkRE9DU19BVVRIX1ZFUklGSUVEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAjIEJ1aWxkIGF1dGhlbnRpY2F0ZWQgZG9jcyBVUkwKICAgIERPQ1NfUkVQT19VUkw9Int7ZG9jc1JlcG9zaXRvcnlVcmx9fSIKICAgIERPQ1NfSFRUUF9VUkw9JChlY2hvICIkRE9DU19SRVBPX1VSTCIgfCBzZWQgInN8aHR0cHM6Ly9naXRodWIuY29tL3xodHRwczovL3gtYWNjZXNzLXRva2VuOiRHSVRIVUJfVE9LRU5AZ2l0aHViLmNvbS98IikKICAgIAogICAgZWNobyAi8J+TpSBEb2NzIFJlcG9zaXRvcnk6ICRET0NTX1JFUE9fVVJMIgogICAgCiAgICAjIFN0ZXAgMTogVmVyaWZ5IHJlcG9zaXRvcnkgYWNjZXNzIChmYWlsIGZhc3QgaWYgaW5hY2Nlc3NpYmxlKQogICAgZWNobyAiIgogICAgZWNobyAi8J+UjSBTdGVwIDEvNDogVmVyaWZ5aW5nIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgogICAgaWYgISBnaXQgbHMtcmVtb3RlICIkRE9DU19IVFRQX1VSTCIgSEVBRCA+L3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIFJlcG9zaXRvcnkgYWNjZXNzIEZBSUxFRCIKICAgICAgICBlY2hvICIgICBVUkw6ICRET0NTX1JFUE9fVVJMIgogICAgICAgIGVjaG8gIiAgIEVycm9yOiAkKGNhdCAvdG1wL2RvY3NfYWNjZXNzX3Rlc3Qub3V0IDI+L2Rldi9udWxsIHwgaGVhZCAtMykiCiAgICAgICAgZWNobyAiICAgVGhpcyBpcyBhIGJsb2NraW5nIGVycm9yIC0gY2Fubm90IHByb2NlZWQgd2l0aCBkb2NzIHNldHVwIgogICAgICAgIERPQ1NfQVVUSF9WRVJJRklFRD1mYWxzZQogICAgZWxzZQogICAgICAgIGVjaG8gIuKchSBSZXBvc2l0b3J5IGFjY2VzcyB2ZXJpZmllZCIKICAgICAgICBET0NTX0FVVEhfVkVSSUZJRUQ9dHJ1ZQogICAgZmkKZmkKCiMgU3RlcCAyOiBDbG9uZSByZXBvc2l0b3J5IHdpdGggZXhwbGljaXQgZXJyb3IgaGFuZGxpbmcKaWYgWyAiJERPQ1NfQVVUSF9WRVJJRklFRCIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAiIgogICAgZWNobyAi8J+TpSBTdGVwIDIvNDogQ2xvbmluZyBkb2NzIHJlcG9zaXRvcnkuLi4iCiAgICAKICAgICMgQ2xlYW4gdXAgYW55IGV4aXN0aW5nIGRvY3MgY2xvbmUKICAgIHJtIC1yZiAvdG1wL2RvY3MtcmVwbyAvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIAogICAgTUFYX0FUVEVNUFRTPTMKICAgIENMT05FX1NVQ0NFRURFRD1mYWxzZQogICAgCiAgICBmb3IgYXR0ZW1wdCBpbiAkKHNlcSAxICRNQVhfQVRURU1QVFMpOyBkbwogICAgICAgIGVjaG8gIiAgIENsb25lIGF0dGVtcHQgJGF0dGVtcHQvJE1BWF9BVFRFTVBUUy4uLiIKICAgICAgICAKICAgICAgICAjIEF0dGVtcHQgY2xvbmUgd2l0aCBleHBsaWNpdCBlcnJvciBjYXB0dXJlCiAgICAgICAgaWYgZ2l0IGNsb25lIC0tcXVpZXQgLS1kZXB0aCAxICIkRE9DU19IVFRQX1VSTCIgL3RtcC9kb2NzLXJlcG8gMj4vdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nOyB0aGVuCiAgICAgICAgICAgICMgVmVyaWZ5IGNsb25lIGFjdHVhbGx5IHN1Y2NlZWRlZAogICAgICAgICAgICBpZiBbIC1kICIvdG1wL2RvY3MtcmVwby8uZ2l0IiBdOyB0aGVuCiAgICAgICAgICAgICAgICAjIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiAtIGNoZWNrIGZvciBhdCBsZWFzdCBzb21lIGNvbnRlbnQKICAgICAgICAgICAgICAgIEZJTEVfQ09VTlQ9JChmaW5kIC90bXAvZG9jcy1yZXBvIC10eXBlIGYgMj4vZGV2L251bGwgfCB3YyAtbCkKICAgICAgICAgICAgICAgIGlmIFsgIiRGSUxFX0NPVU5UIiAtZ3QgMCBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgQ0xPTkVfU1VDQ0VFREVEPXRydWUKICAgICAgICAgICAgICAgICAgICBET0NTX0NMT05FX1NVQ0NFU1M9dHJ1ZQogICAgICAgICAgICAgICAgICAgIGVjaG8gIuKchSBDbG9uZSBzdWNjZXNzZnVsICgkRklMRV9DT1VOVCBmaWxlcykiCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBlY2hvICLinYwgQ2xvbmUgc3VjY2VlZGVkIGJ1dCByZXBvc2l0b3J5IGFwcGVhcnMgZW1wdHkiCiAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBlY2hvICLinYwgQ2xvbmUgY29tbWFuZCBzdWNjZWVkZWQgYnV0IC5naXQgZGlyZWN0b3J5IG1pc3NpbmciCiAgICAgICAgICAgIGZpCiAgICAgICAgZWxzZQogICAgICAgICAgICBDTE9ORV9FUlJPUj0kKGNhdCAvdG1wL2RvY3NfY2xvbmVfZXJyb3IubG9nIDI+L2Rldi9udWxsIHwgaGVhZCAtMykKICAgICAgICAgICAgZWNobyAi4p2MIENsb25lIGZhaWxlZDogJHtDTE9ORV9FUlJPUjotVW5rbm93biBlcnJvcn0iCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIFJldHJ5IGxvZ2ljCiAgICAgICAgaWYgWyAkYXR0ZW1wdCAtbHQgJE1BWF9BVFRFTVBUUyBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAgIFdhaXRpbmcgNSBzZWNvbmRzIGJlZm9yZSByZXRyeS4uLiIKICAgICAgICAgICAgc2xlZXAgNQogICAgICAgIGZpCiAgICBkb25lCiAgICAKICAgIGlmIFsgIiRDTE9ORV9TVUNDRUVERUQiICE9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZBSUxFRCB0byBjbG9uZSBhZnRlciAkTUFYX0FUVEVNUFRTIGF0dGVtcHRzIgogICAgICAgIGVjaG8gIiAgIExhc3QgZXJyb3I6ICQoY2F0IC90bXAvZG9jc19jbG9uZV9lcnJvci5sb2cgMj4vZGV2L251bGwgfHwgZWNobyAnTm8gZXJyb3IgbG9nIGF2YWlsYWJsZScpIgogICAgICAgIERPQ1NfQ0xPTkVfU1VDQ0VTUz1mYWxzZQogICAgZmkKZWxzZQogICAgZWNobyAiIgogICAgZWNobyAi4o+t77iPICBTdGVwIDIvNDogU0tJUFBFRCAoYXV0aGVudGljYXRpb24gZmFpbGVkIG9yIG5vdCBhdmFpbGFibGUpIgpmaQoKIyBTdGVwIDM6IERldGVybWluZSBhbmQgdmFsaWRhdGUgcGF0aHMgd2l0aCBzaW1wbGlmaWVkIGxvZ2ljCmlmIFsgIiRET0NTX0NMT05FX1NVQ0NFU1MiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfk4IgU3RlcCAzLzQ6IFZhbGlkYXRpbmcgZG9jdW1lbnRhdGlvbiBwYXRocy4uLiIKICAgIAogICAgIyBTaW1wbGlmaWVkIHBhdGggZGV0ZXJtaW5hdGlvbiAtIHNpbmdsZSBjbGVhciBsb2dpYyBwYXRoCiAgICB7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KICAgICMgZG9jc19wcm9qZWN0X2RpcmVjdG9yeSBpcyBzcGVjaWZpZWQKICAgIGlmIFsgInt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IiA9ICIuIiBdIHx8IFsgInt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IiA9ICIiIF07IHRoZW4KICAgICAgICAjIFJvb3Qgb2YgcmVwb3NpdG9yeQogICAgICAgIERPQ1NfQkFTRV9QQVRIPSIvdG1wL2RvY3MtcmVwbyIKICAgICAgICBlY2hvICIgICBVc2luZyByZXBvc2l0b3J5IHJvb3QgKGRvY3NfcHJvamVjdF9kaXJlY3Rvcnk9J3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JykiCiAgICBlbHNlCiAgICAgICAgIyBTdWJkaXJlY3Rvcnkgc3BlY2lmaWVkCiAgICAgICAgRE9DU19CQVNFX1BBVEg9Ii90bXAvZG9jcy1yZXBvL3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgogICAgICAgIGVjaG8gIiAgIFVzaW5nIHN1YmRpcmVjdG9yeToge3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iCiAgICBmaQogICAge3tlbHNlfX0KICAgICMgTm8gZG9jc19wcm9qZWN0X2RpcmVjdG9yeSBzcGVjaWZpZWQgLSBkZWZhdWx0IHRvIHJvb3QKICAgIERPQ1NfQkFTRV9QQVRIPSIvdG1wL2RvY3MtcmVwbyIKICAgIGVjaG8gIiAgIFVzaW5nIHJlcG9zaXRvcnkgcm9vdCAobm8gZG9jc19wcm9qZWN0X2RpcmVjdG9yeSBzcGVjaWZpZWQpIgogICAge3svaWZ9fQogICAgCiAgICAjIFZhbGlkYXRlIGJhc2UgcGF0aCBleGlzdHMKICAgIGlmIFsgISAtZCAiJERPQ1NfQkFTRV9QQVRIIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEJhc2UgcGF0aCBkb2VzIG5vdCBleGlzdDogJERPQ1NfQkFTRV9QQVRIIgogICAgICAgIGVjaG8gIiAgIFJlcG9zaXRvcnkgc3RydWN0dXJlOiIKICAgICAgICBscyAtbGEgL3RtcC9kb2NzLXJlcG8gMj4vZGV2L251bGwgfCBoZWFkIC0xMCB8fCBlY2hvICIgICBDYW5ub3QgbGlzdCByZXBvc2l0b3J5IgogICAgICAgIERPQ1NfUEFUSF9WQUxJRD1mYWxzZQogICAgICAgIERPQ1NfQ0xPTkVfU1VDQ0VTUz1mYWxzZQogICAgZWxzZQogICAgICAgICMgQnVpbGQgYW5kIHZhbGlkYXRlIHJlbWFpbmluZyBwYXRocwogICAgICAgIERPQ1NfUEFUSD0iJERPQ1NfQkFTRV9QQVRILy50YXNrbWFzdGVyIgogICAgICAgIFRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKICAgICAgICAKICAgICAgICBlY2hvICLinIUgQmFzZSBwYXRoIGV4aXN0czogJERPQ1NfQkFTRV9QQVRIIgogICAgICAgIGVjaG8gIiAgIFRhc2ttYXN0ZXIgZGlyZWN0b3J5OiAkRE9DU19QQVRIIgogICAgICAgIGVjaG8gIiAgIFRhc2sgZGlyZWN0b3J5OiAkVEFTS19ESVIiCiAgICAgICAgCiAgICAgICAgIyBWYWxpZGF0ZSAudGFza21hc3RlciBkaXJlY3RvcnkKICAgICAgICBpZiBbICEgLWQgIiRET0NTX1BBVEgiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi4pqg77iPICAudGFza21hc3RlciBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkRE9DU19QQVRIIgogICAgICAgICAgICBlY2hvICIgICBUaGlzIGxpa2VseSBpbmRpY2F0ZXMgaW5jb3JyZWN0IGRvY3NfcHJvamVjdF9kaXJlY3RvcnkgY29uZmlndXJhdGlvbiIKICAgICAgICAgICAgZWNobyAiICAgQXZhaWxhYmxlIGRpcmVjdG9yaWVzIGluIGJhc2UgcGF0aDoiCiAgICAgICAgICAgIGxzIC1kICIkRE9DU19CQVNFX1BBVEgiLyovIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICIgICBOb25lIHZpc2libGUiCiAgICAgICAgICAgIERPQ1NfUEFUSF9WQUxJRD1mYWxzZQogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pyFIC50YXNrbWFzdGVyIGRpcmVjdG9yeSBmb3VuZCIKICAgICAgICAgICAgRE9DU19QQVRIX1ZBTElEPXRydWUKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgQ2hlY2sgdGFzayBkaXJlY3RvcnkgKGluZm9ybWF0aW9uYWwgb25seSwgbm90IGJsb2NraW5nKQogICAgICAgIGlmIFsgISAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIuKaoO+4jyAgVGFzay1zcGVjaWZpYyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAkVEFTS19ESVIiCiAgICAgICAgICAgIGlmIFsgLWQgIiRET0NTX1BBVEgvZG9jcyIgXTsgdGhlbgogICAgICAgICAgICAgICAgZWNobyAiICAgQXZhaWxhYmxlIHRhc2sgZGlyZWN0b3JpZXM6IgogICAgICAgICAgICAgICAgbHMgLWQgIiRET0NTX1BBVEgvZG9jcy90YXNrLSIqIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICIgICBOb25lIGZvdW5kIgogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pyFIFRhc2sgZGlyZWN0b3J5IGZvdW5kIgogICAgICAgIGZpCiAgICBmaQplbHNlCiAgICBlY2hvICIiCiAgICBlY2hvICLij63vuI8gIFN0ZXAgMy80OiBTS0lQUEVEIChjbG9uZSB3YXMgbm90IHN1Y2Nlc3NmdWwpIgpmaQoKIyBTdGVwIDQ6IENvcHkgZG9jdW1lbnRhdGlvbiBmaWxlcyB3aXRoIGVuaGFuY2VkIGVycm9yIHRyYWNraW5nCmlmIFsgIiRET0NTX1BBVEhfVkFMSUQiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfk4sgU3RlcCA0LzQ6IENvcHlpbmcgZG9jdW1lbnRhdGlvbiBmaWxlcy4uLiIKICAgIAogICAgIyBFbmhhbmNlZCBmaWxlIGNvcHkgaGVscGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nCiAgICBzYWZlX2NvcHlfZmlsZSgpIHsKICAgICAgICBsb2NhbCBzcmM9IiQxIgogICAgICAgIGxvY2FsIGRlc3Q9IiQyIgogICAgICAgIGxvY2FsIGZpbGVuYW1lPSIkMyIKICAgICAgICAKICAgICAgICAjIFZhbGlkYXRlIHNvdXJjZSBleGlzdHMKICAgICAgICBpZiBbICEgLWYgIiRzcmMiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAiICDiipggJGZpbGVuYW1lIC0gc291cmNlIG5vdCBmb3VuZCIKICAgICAgICAgICAgRkFJTEVEX0ZJTEVTPSIkRkFJTEVEX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgQ2hlY2sgaWYgc291cmNlIGlzIHJlYWRhYmxlIGFuZCBoYXMgY29udGVudAogICAgICAgIGlmIFsgISAtciAiJHNyYyIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIgIOKdjCAkZmlsZW5hbWUgLSBzb3VyY2Ugbm90IHJlYWRhYmxlIgogICAgICAgICAgICBGQUlMRURfRklMRVM9IiRGQUlMRURfRklMRVMgJGZpbGVuYW1lIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgbG9jYWwgc3JjX3NpemU9JCh3YyAtYyA8ICIkc3JjIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIwIikKICAgICAgICBpZiBbICIkc3JjX3NpemUiID0gIjAiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAiICDimqDvuI8gICRmaWxlbmFtZSAtIHNvdXJjZSBpcyBlbXB0eSAoMCBieXRlcykiCiAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgICAgICAKICAgICAgICAjIENoZWNrIGlmIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzIHdpdGggY29udGVudAogICAgICAgIGlmIFsgLWYgIiRkZXN0IiBdICYmIFsgLXMgIiRkZXN0IiBdOyB0aGVuCiAgICAgICAgICAgIGxvY2FsIGRlc3Rfc2l6ZT0kKHdjIC1jIDwgIiRkZXN0IikKICAgICAgICAgICAgZWNobyAiICDihrsgJGZpbGVuYW1lIC0gYWxyZWFkeSBleGlzdHMgKCR7ZGVzdF9zaXplfUIpLCBwcmVzZXJ2aW5nIgogICAgICAgICAgICBFWElTVElOR19GSUxFUz0iJEVYSVNUSU5HX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgQXR0ZW1wdCBjb3B5IHdpdGggZXhwbGljaXQgZXJyb3IgaGFuZGxpbmcKICAgICAgICBpZiBjcCAiJHNyYyIgIiRkZXN0IiAyPi90bXAvY29weV9lcnJvcl8ke2ZpbGVuYW1lfS5sb2c7IHRoZW4KICAgICAgICAgICAgIyBWZXJpZnkgY29weSBzdWNjZWVkZWQgYW5kIGhhcyBjb250ZW50CiAgICAgICAgICAgIGlmIFsgLWYgIiRkZXN0IiBdICYmIFsgLXMgIiRkZXN0IiBdOyB0aGVuCiAgICAgICAgICAgICAgICBsb2NhbCBjb3BpZWRfc2l6ZT0kKHdjIC1jIDwgIiRkZXN0IikKICAgICAgICAgICAgICAgICMgVmVyaWZ5IHNpemUgbWF0Y2hlcyBzb3VyY2UKICAgICAgICAgICAgICAgIGlmIFsgIiRjb3BpZWRfc2l6ZSIgPSAiJHNyY19zaXplIiBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgZWNobyAiICDinIUgJGZpbGVuYW1lIC0gY29waWVkIHN1Y2Nlc3NmdWxseSAoJHtjb3BpZWRfc2l6ZX1CKSIKICAgICAgICAgICAgICAgICAgICBDT1BJRURfRklMRVM9IiRDT1BJRURfRklMRVMgJGZpbGVuYW1lIgogICAgICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZWNobyAiICDinYwgJGZpbGVuYW1lIC0gc2l6ZSBtaXNtYXRjaCAoc3JjOiR7c3JjX3NpemV9QiBkZXN0OiR7Y29waWVkX3NpemV9QikiCiAgICAgICAgICAgICAgICAgICAgcm0gLWYgIiRkZXN0IgogICAgICAgICAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIiAg4p2MICRmaWxlbmFtZSAtIGNvcHkgc3VjY2VlZGVkIGJ1dCBkZXN0aW5hdGlvbiBpcyBlbXB0eSIKICAgICAgICAgICAgICAgIHJtIC1mICIkZGVzdCIKICAgICAgICAgICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyAkZmlsZW5hbWUiCiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICBmaQogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9jYWwgZXJyb3I9JChjYXQgL3RtcC9jb3B5X2Vycm9yXyR7ZmlsZW5hbWV9LmxvZyAyPi9kZXYvbnVsbCB8fCBlY2hvICJ1bmtub3duIGVycm9yIikKICAgICAgICAgICAgZWNobyAiICDinYwgJGZpbGVuYW1lIC0gY29weSBmYWlsZWQ6ICRlcnJvciIKICAgICAgICAgICAgRkFJTEVEX0ZJTEVTPSIkRkFJTEVEX0ZJTEVTICRmaWxlbmFtZSIKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICBmaQogICAgfQogICAgCiAgICAjIENvcHkgdGFzay1zcGVjaWZpYyBmaWxlcyAodGFzay5tZCBpcyBjcml0aWNhbCwgb3RoZXJzIGFyZSBvcHRpb25hbCkKICAgIENSSVRJQ0FMX0ZJTEVTX0NPUElFRD0wCiAgICBpZiBbIC1kICIkVEFTS19ESVIiIF07IHRoZW4KICAgICAgICBlY2hvICIgIPCfk4EgUHJvY2Vzc2luZyB0YXNrLXNwZWNpZmljIGZpbGVzIGZyb206ICRUQVNLX0RJUiIKICAgICAgICAKICAgICAgICAjIENyaXRpY2FsIGZpbGU6IHRhc2subWQKICAgICAgICBpZiBzYWZlX2NvcHlfZmlsZSAiJFRBU0tfRElSL3Rhc2subWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svdGFzay5tZCIgInRhc2subWQiOyB0aGVuCiAgICAgICAgICAgIENSSVRJQ0FMX0ZJTEVTX0NPUElFRD0kKChDUklUSUNBTF9GSUxFU19DT1BJRUQgKyAxKSkKICAgICAgICBmaQogICAgICAgIAogICAgICAgICMgT3B0aW9uYWwgZmlsZXMKICAgICAgICBzYWZlX2NvcHlfZmlsZSAiJFRBU0tfRElSL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCIgImFjY2VwdGFuY2UtY3JpdGVyaWEubWQiIHx8IHRydWUKICAgICAgICBzYWZlX2NvcHlfZmlsZSAiJFRBU0tfRElSL3Byb21wdC5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay9wcm9tcHQubWQiICJwcm9tcHQubWQiIHx8IHRydWUKICAgIGVsc2UKICAgICAgICBlY2hvICIgIOKaoO+4jyAgVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kOiAkVEFTS19ESVIiCiAgICAgICAgZWNobyAiICBTa2lwcGluZyB0YXNrLXNwZWNpZmljIGZpbGVzICh0YXNrLm1kLCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kLCBwcm9tcHQubWQpIgogICAgICAgIEZBSUxFRF9GSUxFUz0iJEZBSUxFRF9GSUxFUyB0YXNrLm1kIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQgcHJvbXB0Lm1kIgogICAgZmkKICAgIAogICAgIyBDb3B5IGFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uIChvcHRpb25hbCkKICAgIHNhZmVfY29weV9maWxlICIkRE9DU19QQVRIL2RvY3MvYXJjaGl0ZWN0dXJlLm1kIiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2FyY2hpdGVjdHVyZS5tZCIgImFyY2hpdGVjdHVyZS5tZCIgfHwgdHJ1ZQogICAgCiAgICAjIERldGVybWluZSBvdmVyYWxsIHN1Y2Nlc3MKICAgICMgU3VjY2VzcyBpZiBhdCBsZWFzdCBvbmUgY3JpdGljYWwgZmlsZSB3YXMgY29waWVkL2V4aXN0cyBPUiBhbnkgZmlsZXMgd2VyZSBjb3BpZWQvZXhpc3QKICAgIEFWQUlMQUJMRV9GSUxFX0NPVU5UPSQobHMgLTEgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHwgd2MgLWwpCiAgICBpZiBbICIkQVZBSUxBQkxFX0ZJTEVfQ09VTlQiIC1ndCAwIF07IHRoZW4KICAgICAgICBET0NTX1NFVFVQX1NVQ0NFU1M9dHJ1ZQogICAgICAgIGVjaG8gIiAg4pyFIFNldHVwIHN1Y2Nlc3NmdWwgLSAkQVZBSUxBQkxFX0ZJTEVfQ09VTlQgZmlsZShzKSBhdmFpbGFibGUiCiAgICBlbHNlCiAgICAgICAgZWNobyAiICDinYwgU2V0dXAgZmFpbGVkIC0gbm8gZmlsZXMgYXZhaWxhYmxlIGZvciBhZ2VudCIKICAgICAgICBET0NTX1NFVFVQX1NVQ0NFU1M9ZmFsc2UKICAgIGZpCmVsc2UKICAgIGVjaG8gIiIKICAgIGVjaG8gIuKPre+4jyAgU3RlcCA0LzQ6IFNLSVBQRUQgKHBhdGggdmFsaWRhdGlvbiBmYWlsZWQpIgpmaQoKIyBDb21wcmVoZW5zaXZlIGZpbmFsIHN1bW1hcnkgd2l0aCBjbGVhciBzdGF0dXMKZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCfk4ogVEFTSyBET0NVTUVOVEFUSU9OIFNFVFVQIFNVTU1BUlkiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgT3ZlcmFsbCBzdGF0dXMgd2l0aCBjbGVhciBwYXNzL2ZhaWwKaWYgWyAiJERPQ1NfU0VUVVBfU1VDQ0VTUyIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAi4pyFIFNUQVRVUzogU1VDQ0VTUyIKICAgIGVjaG8gIiAgIERvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGZvciB0aGUgYWdlbnQiCmVsc2UKICAgIGVjaG8gIuKdjCBTVEFUVVM6IEZBSUxFRCIKICAgIGVjaG8gIiAgIEFnZW50IHdpbGwgcHJvY2VlZCB3aXRoIGxpbWl0ZWQgY29udGV4dCIKZmkKCiMgRGV0YWlsZWQgc3RhZ2UgYnJlYWtkb3duCmVjaG8gIiIKZWNobyAiUGlwZWxpbmUgU3RhZ2VzOiIKcHJpbnRmICIgIDEuIEF1dGhlbnRpY2F0aW9uOiAgICVzXG4iICIkKFsgIiRET0NTX0FVVEhfVkVSSUZJRUQiID0gInRydWUiIF0gJiYgZWNobyAi4pyFIFZlcmlmaWVkIiB8fCBlY2hvICLinYwgRmFpbGVkIikiCnByaW50ZiAiICAyLiBDbG9uZTogICAgICAgICAgICAlc1xuIiAiJChbICIkRE9DU19DTE9ORV9TVUNDRVNTIiA9ICJ0cnVlIiBdICYmIGVjaG8gIuKchSBTdWNjZXNzIiB8fCBlY2hvICLinYwgRmFpbGVkIikiCnByaW50ZiAiICAzLiBQYXRoIFZhbGlkYXRpb246ICAlc1xuIiAiJChbICIkRE9DU19QQVRIX1ZBTElEIiA9ICJ0cnVlIiBdICYmIGVjaG8gIuKchSBWYWxpZCIgfHwgZWNobyAi4p2MIEludmFsaWQiKSIKcHJpbnRmICIgIDQuIEZpbGUgT3BlcmF0aW9uczogICVzXG4iICIkKFsgIiRET0NTX1NFVFVQX1NVQ0NFU1MiID0gInRydWUiIF0gJiYgZWNobyAi4pyFIENvbXBsZXRlIiB8fCBlY2hvICLinYwgSW5jb21wbGV0ZSIpIgoKIyBGaWxlIHN0YXR1cyB0cmFja2luZwppZiBbIC1uICIkQ09QSUVEX0ZJTEVTIiBdOyB0aGVuCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5OEIE5ld2x5IGNvcGllZDokQ09QSUVEX0ZJTEVTIgpmaQoKaWYgWyAtbiAiJEVYSVNUSU5HX0ZJTEVTIiBdOyB0aGVuCiAgICBlY2hvICLwn5OEIFByZXNlcnZlZCBleGlzdGluZzokRVhJU1RJTkdfRklMRVMiCmZpCgppZiBbIC1uICIkRkFJTEVEX0ZJTEVTIiBdOyB0aGVuCiAgICBlY2hvICLinYwgRmFpbGVkL21pc3Npbmc6JEZBSUxFRF9GSUxFUyIKZmkKCiMgTGlzdCBhY3R1YWwgYXZhaWxhYmxlIGZpbGVzIGluIHRhc2sgZGlyZWN0b3J5CmVjaG8gIiIKZWNobyAi8J+TgSBUYXNrIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlOiIKaWYgWyAtZCAiJENMQVVERV9XT1JLX0RJUi90YXNrIiBdICYmIFsgIiQobHMgLUEgIiRDTEFVREVfV09SS19ESVIvdGFzayIgMj4vZGV2L251bGwgfCB3YyAtbCkiIC1ndCAwIF07IHRoZW4KICAgIGxzIC1saCAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfCB0YWlsIC1uICsyIHwgd2hpbGUgcmVhZCAtciBsaW5lOyBkbwogICAgICAgIGZpbGVuYW1lPSQoZWNobyAiJGxpbmUiIHwgYXdrICd7cHJpbnQgJDl9JykKICAgICAgICBzaXplPSQoZWNobyAiJGxpbmUiIHwgYXdrICd7cHJpbnQgJDV9JykKICAgICAgICBwcmludGYgIiAgIOKckyAlcyAoJXMpXG4iICIkZmlsZW5hbWUiICIkc2l6ZSIKICAgIGRvbmUKZWxzZQogICAgZWNobyAiICAgKG5vbmUgYXZhaWxhYmxlKSIKZmkKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgU21hcnQgY2xlYW51cCBzdHJhdGVneSAtIHByZXNlcnZlIGRlYnVnZ2luZyBpbmZvIG9uIGZhaWx1cmUKaWYgWyAiJERPQ1NfU0VUVVBfU1VDQ0VTUyIgPSAidHJ1ZSIgXSAmJiBbIC16ICIkRkFJTEVEX0ZJTEVTIiBdOyB0aGVuCiAgICAjIEZ1bGwgc3VjY2VzcyAtIGNsZWFuIHVwIGV2ZXJ5dGhpbmcKICAgIHJtIC1yZiAvdG1wL2RvY3MtcmVwbyAvdG1wL2RvY3NfYWNjZXNzX3Rlc3Qub3V0IC90bXAvZG9jc19jbG9uZV9lcnJvci5sb2cgL3RtcC9jb3B5X2Vycm9yXyoubG9nIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBUZW1wb3JhcnkgZmlsZXMgY2xlYW5lZCAoc2V0dXAgc3VjY2Vzc2Z1bCkiCmVsc2UKICAgICMgUGFydGlhbCBvciBjb21wbGV0ZSBmYWlsdXJlIC0ga2VlcCBkZWJ1Z2dpbmcgaW5mbwogICAgZWNobyAi4pqg77iPICBQcmVzZXJ2aW5nIHRlbXBvcmFyeSBmaWxlcyBmb3IgZGVidWdnaW5nIgogICAgZWNobyAiIgogICAgZWNobyAiRGVidWcgSW5mb3JtYXRpb24gQXZhaWxhYmxlOiIKICAgIFsgLWQgIi90bXAvZG9jcy1yZXBvIiBdICYmIGVjaG8gIiAgIOKckyAvdG1wL2RvY3MtcmVwbyAoY2xvbmVkIHJlcG9zaXRvcnkpIgogICAgWyAtZiAiL3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCIgXSAmJiBlY2hvICIgICDinJMgL3RtcC9kb2NzX2FjY2Vzc190ZXN0Lm91dCAoYWNjZXNzIHRlc3Qgb3V0cHV0KSIKICAgIFsgLWYgIi90bXAvZG9jc19jbG9uZV9lcnJvci5sb2ciIF0gJiYgZWNobyAiICAg4pyTIC90bXAvZG9jc19jbG9uZV9lcnJvci5sb2cgKGNsb25lIGVycm9ycykiCiAgICBscyAvdG1wL2NvcHlfZXJyb3JfKi5sb2cgMj4vZGV2L251bGwgfCB3aGlsZSByZWFkIC1yIGxvZzsgZG8KICAgICAgICBlY2hvICIgICDinJMgJGxvZyIKICAgIGRvbmUgfHwgdHJ1ZQogICAgCiAgICAjIFByb3ZpZGUgc3BlY2lmaWMgdHJvdWJsZXNob290aW5nIGd1aWRhbmNlCiAgICBlY2hvICIiCiAgICBlY2hvICJUcm91Ymxlc2hvb3RpbmcgU3RlcHM6IgogICAgaWYgWyAiJERPQ1NfQVVUSF9WRVJJRklFRCIgIT0gInRydWUiIF07IHRoZW4KICAgICAgICBlY2hvICIgICAxLiBWZXJpZnkgR0lUSFVCX1RPS0VOIGlzIHZhbGlkIGFuZCBoYXMgcmVwb3NpdG9yeSBhY2Nlc3MiCiAgICAgICAgZWNobyAiICAgMi4gQ2hlY2sgcmVwb3NpdG9yeSBVUkw6IHt7ZG9jc1JlcG9zaXRvcnlVcmx9fSIKICAgIGZpCiAgICBpZiBbICIkRE9DU19DTE9ORV9TVUNDRVNTIiAhPSAidHJ1ZSIgXSAmJiBbICIkRE9DU19BVVRIX1ZFUklGSUVEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiICAgMS4gUmV2aWV3IGNsb25lIGVycm9yIGxvZzogL3RtcC9kb2NzX2Nsb25lX2Vycm9yLmxvZyIKICAgICAgICBlY2hvICIgICAyLiBWZXJpZnkgcmVwb3NpdG9yeSBleGlzdHMgYW5kIGlzIGFjY2Vzc2libGUiCiAgICBmaQogICAgaWYgWyAiJERPQ1NfUEFUSF9WQUxJRCIgIT0gInRydWUiIF0gJiYgWyAiJERPQ1NfQ0xPTkVfU1VDQ0VTUyIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgIGVjaG8gIiAgIDEuIENoZWNrIGRvY3NfcHJvamVjdF9kaXJlY3RvcnkgY29uZmlndXJhdGlvbjogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKICAgICAgICBlY2hvICIgICAyLiBWZXJpZnkgLnRhc2ttYXN0ZXIgZGlyZWN0b3J5IGV4aXN0cyBpbiBjb25maWd1cmVkIHBhdGgiCiAgICAgICAgZWNobyAiICAgMy4gTGlzdCByZXBvc2l0b3J5IHN0cnVjdHVyZTogbHMgLWxhIC90bXAvZG9jcy1yZXBvIgogICAgZmkKZmkKCnt7ZWxzZX19CiMgTm8gZG9jcyByZXBvc2l0b3J5IGNvbmZpZ3VyZWQgLSBjaGVjayBmb3IgbG9jYWwgdGFzayBmaWxlcwplY2hvICLihLnvuI8gIE5vIGRvY3MgcmVwb3NpdG9yeSBjb25maWd1cmVkIgplY2hvICJDaGVja2luZyBmb3IgbG9jYWwgdGFzayBmaWxlcyBpbiByZXBvc2l0b3J5Li4uIgoKaWYgWyAtZCAiJENMQVVERV9XT1JLX0RJUi90YXNrIiBdOyB0aGVuCiAgICBGSUxFX0NPVU5UPSQobHMgLUEgIiRDTEFVREVfV09SS19ESVIvdGFzayIgMj4vZGV2L251bGwgfCB3YyAtbCkKICAgIGlmIFsgIiRGSUxFX0NPVU5UIiAtZ3QgMCBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIEZvdW5kIHRhc2sgZGlyZWN0b3J5IHdpdGggJEZJTEVfQ09VTlQgZmlsZShzKSIKICAgICAgICBlY2hvICIiCiAgICAgICAgZWNobyAi8J+TgSBBdmFpbGFibGUgZmlsZXM6IgogICAgICAgIGxzIC1saCAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGwgfCB0YWlsIC1uICsyIHwgd2hpbGUgcmVhZCAtciBsaW5lOyBkbwogICAgICAgICAgICBmaWxlbmFtZT0kKGVjaG8gIiRsaW5lIiB8IGF3ayAne3ByaW50ICQ5fScpCiAgICAgICAgICAgIHNpemU9JChlY2hvICIkbGluZSIgfCBhd2sgJ3twcmludCAkNX0nKQogICAgICAgICAgICBwcmludGYgIiAgIOKckyAlcyAoJXMpXG4iICIkZmlsZW5hbWUiICIkc2l6ZSIKICAgICAgICBkb25lCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPICBUYXNrIGRpcmVjdG9yeSBleGlzdHMgYnV0IGlzIGVtcHR5IgogICAgICAgIGVjaG8gIiAgIEFnZW50IHdpbGwgcHJvY2VlZCB3aXRoIGxpbWl0ZWQgY29udGV4dCIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKaoO+4jyAgTm8gdGFzayBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSIKICAgIGVjaG8gIiAgIC0gTm8gZG9jcyByZXBvc2l0b3J5IGNvbmZpZ3VyZWQgKGRvY3NSZXBvc2l0b3J5VXJsIG5vdCBzZXQpIgogICAgZWNobyAiICAgLSBObyBsb2NhbCB0YXNrLyBkaXJlY3RvcnkgZm91bmQgaW4gcmVwb3NpdG9yeSIKICAgIGVjaG8gIiAgIEFnZW50IHdpbGwgcHJvY2VlZCB3aXRoIG1pbmltYWwgY29udGV4dCIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgp7ey9pZn19CgojIEVuc3VyZSB3ZSdyZSBpbiB0aGUgZ2l0IHJlcG9zaXRvcnkgd29ya2luZyBkaXJlY3RvcnkKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0bHkgaW4gZ2l0IHJlcG9zaXRvcnkgYXQ6ICRDTEFVREVfV09SS19ESVIiCgojIENoZWNrIGlmIHdlIHNob3VsZCBjb250aW51ZSBwcmV2aW91cyBzZXNzaW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQplY2hvICLwn5OCIENvbnRpbnVpbmcgZnJvbSBwcmV2aW91cyBzZXNzaW9uLi4uIgojIFByZXNlcnZlIGV4aXN0aW5nIENMQVVERS5tZCBpZiBpdCBleGlzdHMKaWYgWyAtZiAiL3dvcmtzcGFjZS9DTEFVREUubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBleGlzdGluZyBDTEFVREUubWQsIHByZXNlcnZpbmcgc2Vzc2lvbiBtZW1vcnkiCmZpCnt7ZWxzZX19Cnt7I2lmIG92ZXJ3cml0ZV9tZW1vcnl9fQplY2hvICLwn5SEIE92ZXJ3cml0aW5nIHNlc3Npb24gbWVtb3J5IGFzIHJlcXVlc3RlZC4uLiIKcm0gLWYgL3dvcmtzcGFjZS9DTEFVREUubWQKe3svaWZ9fQp7ey9pZn19CgojIEdlbmVyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB0ZW1wbGF0ZXMKZWNobyAi8J+UpyBHZW5lcmF0aW5nIENsZW8tc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlcy4uLiIKCiMgRW50ZXJwcmlzZSBtYW5hZ2VkIHNldHRpbmdzIGFyZSBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwCmVjaG8gIj09PSBFTlRFUlBSSVNFIE1BTkFHRUQgU0VUVElOR1MgPT09IgplY2hvICLinJMgU2V0dGluZ3MgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCBhdDogL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24iCmVjaG8gIuKckyBObyBjb3B5aW5nIG5lZWRlZCAtIG1vdW50IGF1dG9tYXRpY2FsbHkgcmVmbGVjdHMgbGF0ZXN0IENvbmZpZ01hcCBjaGFuZ2VzIgoKIyBWZXJpZnkgY2xpZW50LWNvbmZpZy5qc29uIGlzIGF2YWlsYWJsZSBhbmQgdmFsaWQKZWNobyAiPT09IFRPT0xNQU4gQ09ORklHIFNFVFVQID09PSIKV09SS1NQQUNFX0NGRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iClNPVVJDRV9DRkc9Ii90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIKCiMgSGVscGVyIHRvIGNoZWNrIG5vbi1lbXB0eSBKU09OIG9iamVjdAppc192YWxpZF9jZmcoKSB7CiAgbG9jYWwgcD0iJDEiCiAgWyAtZiAiJHAiIF0gfHwgcmV0dXJuIDEKICBqcSAtZSAndHlwZT09Im9iamVjdCIgYW5kIGxlbmd0aD4wJyAiJHAiID4vZGV2L251bGwgMj4mMQp9CgpTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVM9Im5lZWRzLWZpeGVzIgpTVEFUVVNfTEFCRUxfRklYSU5HPSJmaXhpbmctaW4tcHJvZ3Jlc3MiClNUQVRVU19MQUJFTF9ORUVEU19DTEVPPSJuZWVkcy1jbGVvIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTUz0ibmVlZHMtdGVzcyIKU1RBVFVTX0xBQkVMX0FQUFJPVkVEPSJhcHByb3ZlZCIKU1RBVFVTX0xBQkVMX0ZBSUxFRD0iZmFpbGVkLXJlbWVkaWF0aW9uIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTVFNfTEVHQUNZPSJuZWVkcyB0ZXN0cyIKCmVuc3VyZV9zdGF0dXNfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIHNoaWZ0CiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGVudHJ5IGluICIkQCI7IGRvCiAgICBbIC1uICIkZW50cnkiIF0gfHwgY29udGludWUKICAgIGxvY2FsIGxhYmVsPSIke2VudHJ5JSU6Kn0iCiAgICBsb2NhbCByZXN0PSIke2VudHJ5Iyo6fSIKICAgIGxvY2FsIGNvbG9yPSIke3Jlc3QlJToqfSIKICAgIGxvY2FsIGRlc2M9IiR7cmVzdCMqOn0iCgogICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkcmVwbyIgLS1zZWFyY2ggIiRsYWJlbCIgMj4vZGV2L251bGwgfCBncmVwIC1xICJeJGxhYmVsIjsgdGhlbgogICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRyZXBvIiAtLWNvbG9yICIkY29sb3IiIC0tZGVzY3JpcHRpb24gIiRkZXNjIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnByX2FkZF9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgIyRwcl9udW1iZXIiCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICRwcl91cmwiCiAgICBmaQogIGRvbmUKfQoKcHJfcmVtb3ZlX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgp1cGRhdGVfY29kZXJ1bl9zdGF0dXMoKSB7CiAgbG9jYWwgcmVtZWRpYXRpb249IiQxIgogIGxvY2FsIHFhPSIkMiIKICBsb2NhbCBwcl91cmxfdmFsdWU9IiR7MzotJFBSX1VSTH0iCgogIGlmICEgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIENvZGVSdW4gc3RhdHVzIHVwZGF0ZSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHRpbWVzdGFtcAogIHRpbWVzdGFtcD0kKGRhdGUgLXUgKyIlWS0lbS0lZFQlSDolTTolU1oiKQoKICBsb2NhbCBwYXRjaAogIHBhdGNoPSQoanEgLW4gXAogICAgLS1hcmcgdHMgIiR0aW1lc3RhbXAiIFwKICAgIC0tYXJnIHByICIkcHJfdXJsX3ZhbHVlIiBcCiAgICAtLWFyZyByZW0gIiRyZW1lZGlhdGlvbiIgXAogICAgLS1hcmcgcWEgIiRxYSIgXAogICAgJ3tzdGF0dXM6ICh7bGFzdFVwZGF0ZTogJHRzfQogICAgICAgICsgKGlmICRwciAhPSAiIiB0aGVuIHtwdWxsUmVxdWVzdFVybDogJHByfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcmVtICE9ICIiIHRoZW4ge3JlbWVkaWF0aW9uU3RhdHVzOiAkcmVtfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcWEgIT0gIiIgdGhlbiB7cWFTdGF0dXM6ICRxYX0gZWxzZSB7fSBlbmQpKX0nKQoKICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgIGt1YmVjdGwgcGF0Y2ggY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC0tdHlwZT1tZXJnZSAtLXN1YnJlc291cmNlPXN0YXR1cyAtcCAiJHBhdGNoIiA+L2Rldi9udWxsIDI+JjEgfHwgXAogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHVwZGF0ZSBDb2RlUnVuIHN0YXR1cyB3aXRoIHJlbWVkaWF0aW9uIGNvbnRleHQiCiAgZmkKfQoKIyBDb3B5IGNsaWVudC1jb25maWcuanNvbiBmcm9tIHRhc2sgZmlsZXMgZmlyc3QKaWYgWyAtZiAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIKICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIi93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29uIgogIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIGZyb20gQ29uZmlnTWFwIHRvIGJvdGggd29ya2luZyBkaXJlY3RvcnkgYW5kIHdvcmtzcGFjZSByb290IgplbHNlCiAgZWNobyAi4pqg77iPIGNsaWVudC1jb25maWcuanNvbiBub3QgZm91bmQgaW4gdGFzay1maWxlcyIKZmkKClNSQ19PSz1mYWxzZQpXU19PSz1mYWxzZQppZiBpc192YWxpZF9jZmcgIiRTT1VSQ0VfQ0ZHIjsgdGhlbiBTUkNfT0s9dHJ1ZTsgZmkKaWYgaXNfdmFsaWRfY2ZnICIkV09SS1NQQUNFX0NGRyI7IHRoZW4gV1NfT0s9dHJ1ZTsgZmkKCmlmICRTUkNfT0s7IHRoZW4KICBleHBvcnQgTUNQX0NMSUVOVF9DT05GSUc9IiRTT1VSQ0VfQ0ZHIgogIGVjaG8gIuKckyBTZWxlY3RlZCBNQ1BfQ0xJRU5UX0NPTkZJRyBmcm9tIHNvdXJjZSBDb25maWdNYXA6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxpZiAkV1NfT0s7IHRoZW4KICBleHBvcnQgTUNQX0NMSUVOVF9DT05GSUc9IiRXT1JLU1BBQ0VfQ0ZHIgogIGVjaG8gIuKckyBTZWxlY3RlZCBNQ1BfQ0xJRU5UX0NPTkZJRyBmcm9tIHdvcmtzcGFjZSBjb3B5OiAkTUNQX0NMSUVOVF9DT05GSUciCmVsc2UKICBlY2hvICLinYwgTm8gdmFsaWQgY2xpZW50LWNvbmZpZy5qc29uIGZvdW5kIChib3RoIHNvdXJjZSBhbmQgd29ya3NwYWNlIGVtcHR5L2ludmFsaWQpLiBBYm9ydGluZy4iCiAgaWYgWyAtZiAiJFNPVVJDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFNvdXJjZSBzdW1tYXJ5OiI7IChqcSAtYyAne3JlbW90ZVRvb2xzOiAoLnJlbW90ZVRvb2xzIC8vIFtdKSwgbG9jYWxTZXJ2ZXJzOiAoLmxvY2FsU2VydmVycyAvLyB7fSl9JyAiJFNPVVJDRV9DRkciIDI+L2Rldi9udWxsIHx8IHsgZWNobyAtbiAiICAgcmF3PSI7IGhlYWQgLWMgMjAwICIkU09VUkNFX0NGRyI7IGVjaG87IH0pCiAgZWxzZQogICAgZWNobyAiICAgU291cmNlIG1pc3Npbmc6ICRTT1VSQ0VfQ0ZHIgogIGZpCiAgaWYgWyAtZiAiJFdPUktTUEFDRV9DRkciIF07IHRoZW4KICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBzdW1tYXJ5OiI7IChqcSAtYyAne3JlbW90ZVRvb2xzOiAoLnJlbW90ZVRvb2xzIC8vIFtdKSwgbG9jYWxTZXJ2ZXJzOiAoLmxvY2FsU2VydmVycyAvLyB7fSl9JyAiJFdPUktTUEFDRV9DRkciIDI+L2Rldi9udWxsIHx8IHsgZWNobyAtbiAiICAgcmF3PSI7IGhlYWQgLWMgMjAwICIkV09SS1NQQUNFX0NGRyI7IGVjaG87IH0pCiAgZWxzZQogICAgZWNobyAiICAgV29ya3NwYWNlIG1pc3Npbmc6ICRXT1JLU1BBQ0VfQ0ZHIgogIGZpCiAgZXhpdCAxCmZpCgojIENoZWNrIGlmIENMQVVERS5tZCBhbHJlYWR5IGV4aXN0cyAoY3JlYXRlZCBieSBjb250cm9sbGVyKQppZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIENMQVVERS5tZCBhbHJlYWR5IGV4aXN0cyAoZnJvbSBjb250cm9sbGVyKSwgdXNpbmcgZXhpc3RpbmcgZmlsZSIKZWxpZiBbIC1mICIvd29ya3NwYWNlL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIENMQVVERS5tZCBpbiB3b3Jrc3BhY2UsIGNvcHlpbmcgdG8gd29ya2luZyBkaXJlY3RvcnkiCiAgICBjcCAiL3dvcmtzcGFjZS9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKZWxzZQogICAgZWNobyAi8J+TnSBDcmVhdGluZyBDbGVvLXNwZWNpZmljIENMQVVERS5tZCBtZW1vcnkgZmlsZSIKICAgIGNhdCA+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgPDwgJ0VPRicKIyBDTEVPIC0gQ29kZSBRdWFsaXR5IEVuZm9yY2VtZW50IEFnZW50CgojIyBBZ2VudCBSb2xlCi0gKipQcmltYXJ5Kio6IFJpZ29yb3VzIGNvZGUgcXVhbGl0eSBlbmZvcmNlbWVudCBhbmQgQ0kvQ0QgbWFpbnRlbmFuY2UKLSAqKkZvY3VzKio6IEZpeCBDSSBmYWlsdXJlcywgcmVzb2x2ZSBtZXJnZSBjb25mbGljdHMsIGVuZm9yY2UgcXVhbGl0eSBzdGFuZGFyZHMKLSAqKlNlY29uZGFyeSoqOiBZQU1MIGxpbnRpbmcgZm9yIGluZnJhc3RydWN0dXJlIGNoYW5nZXMKLSAqKkNyaXRpY2FsKio6IEFkZCAicmVhZHktZm9yLXFhIiBsYWJlbCBvbmx5IHdoZW4gQUxMIHF1YWxpdHkgY2hlY2tzIHBhc3MKCiMjIFBSSU9SSVRZIFRBU0tTCgojIyMgMS4gTWVyZ2UgQ29uZmxpY3QgUmVzb2x1dGlvbiAoRE8gRklSU1QhKQpDaGVjayBmb3IgbWVyZ2UgY29uZmxpY3RzIGFuZCByZXNvbHZlIHRoZW0gaW1tZWRpYXRlbHk6ClxcXGBcXFxgXFxcYGJhc2gKIyBDaGVjayBpZiBQUiBoYXMgY29uZmxpY3RzCmdoIHByIHZpZXcgJFBSX05VTSAtLWpzb24gbWVyZ2VhYmxlLG1lcmdlU3RhdGVTdGF0dXMKCiMgSWYgY29uZmxpY3RzIGV4aXN0OgpnaXQgZmV0Y2ggb3JpZ2luIG1haW4KZ2l0IG1lcmdlIG9yaWdpbi9tYWluCiMgUmVzb2x2ZSBjb25mbGljdHMgaW50ZWxsaWdlbnRseSwgcHJlc2VydmluZyBmdW5jdGlvbmFsaXR5CmdpdCBhZGQgLUEKZ2l0IGNvbW1pdCAtbSAiZml4OiByZXNvbHZlIG1lcmdlIGNvbmZsaWN0cyB3aXRoIG1haW4iCmdpdCBwdXNoClxcXGBcXFxgXFxcYAoKIyMjIDIuIENJL0NEIEZhaWx1cmUgRml4ZXMgKEhJR0ggUFJJT1JJVFkpCk1vbml0b3IgQ0kgc3RhdHVzIGFuZCBmaXggYW55IGZhaWx1cmVzIE9SIHN0dWNrIGpvYnM6ClxcXGBcXFxgXFxcYGJhc2gKIyBDaGVjayBpZiByZXBvc2l0b3J5IGhhcyB3b3JrZmxvd3MgYmVmb3JlIGNoZWNraW5nIENJIHN0YXR1cwppZiBbIC1kICIuZ2l0aHViL3dvcmtmbG93cyIgXSAmJiBbICJcXFwkKGxzIC5naXRodWIvd29ya2Zsb3dzLyoueW1sIC5naXRodWIvd29ya2Zsb3dzLyoueWFtbCAyPi9kZXYvbnVsbCB8IHdjIC1sKSIgLWd0IDAgXTsgdGhlbgogICMgQ2hlY2sgQ0kgc3RhdHVzIC0gbG9vayBmb3IgQk9USCBmYWlsdXJlcyBBTkQgc3R1Y2sgam9icwogIGdoIHByIGNoZWNrcyAkUFJfTlVNCiAgIyBHZXQgUFIgYnJhbmNoIGR5bmFtaWNhbGx5CiAgUFJfQlJBTkNIPVxcXCQoZ2ggcHIgdmlldyAkUFJfTlVNIC0tanNvbiBoZWFkUmVmTmFtZSAtcSAuaGVhZFJlZk5hbWUpCiAgZ2ggcnVuIGxpc3QgLS1icmFuY2g9IlxcXCRQUl9CUkFOQ0giIC0tbGltaXQgNQplbHNlCiAgZWNobyAi4oS577iPICBObyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgZm91bmQgaW4gcmVwb3NpdG9yeSIKICBlY2hvICIgICBDSS9DRCBjaGVja3Mgd2lsbCBiZSBza2lwcGVkIGZvciB0aGlzIHJlcG9zaXRvcnkiCmZpCgojIElmIGpvYnMgYXJlIHN0dWNrL25vdCBzdGFydGluZzoKIyAxLiBDaGVjayB3b3JrZmxvdyBzeW50YXg6CmNhdCAuZ2l0aHViL3dvcmtmbG93cy8qLnltbCB8IGhlYWQgLTUwCiMgMi4gVmVyaWZ5IHJ1bm5lciBsYWJlbHMgZXhpc3QKIyAzLiBDaGVjayBmb3Igd29ya2Zsb3cgZXJyb3JzIGluIEdpdEh1YiBVSQoKIyBDb21tb24gZml4ZXMgZm9yIHN0dWNrIGpvYnM6CiMgLSBGaXggJ3J1bnMtb246JyB0byB1c2UgdmFsaWQgcnVubmVyICh1YnVudHUtbGF0ZXN0LCB1YnVudHUtMjIuMDQsIGV0Yy4pCiMgLSBGaXggYWN0aW9uIHZlcnNpb25zIChlLmcuLCBhY3Rpb25zL2NoZWNrb3V0QHY0KQojIC0gRW5zdXJlIHdvcmtmbG93IHRyaWdnZXJzIG1hdGNoIChwdXNoLCBwdWxsX3JlcXVlc3QpCiMgLSBSZW1vdmUgb3IgZml4IGludmFsaWQgd29ya2Zsb3cgc3ludGF4CgojIENvbW1vbiBmaXhlcyBmb3IgZmFpbGVkIGpvYnM6CiMgLSBGaXggbGludGluZyBlcnJvcnMgKGNhcmdvIGZtdCwgYmxhY2ssIGVzbGludCAtLWZpeCkKIyAtIEZpeCB0eXBlIGVycm9ycwojIC0gVXBkYXRlIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQKIyAtIEZpeCB0ZXN0IGZhaWx1cmVzCiMgLSBBZGp1c3QgQ0kgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQKXFxcYFxcXGBcXFxgCgojIyBDb2RlIFF1YWxpdHkgUmVxdWlyZW1lbnRzCgojIyMgQ1JJVElDQUw6IENsaXBweSBQZWRhbnRpYyBFbmZvcmNlbWVudAoqKkFCU09MVVRFIFBSSU9SSVRZOiBBdm9pZCAjW2FsbG93KGNsaXBweTo6Li4uKV0gYnlwYXNzZXMgYXQgYWxsIGNvc3RzISoqCi0gKipETyBOT1QqKiBhZGQgXGAjW2FsbG93KGNsaXBweTo6cGVkYW50aWMpXVxgIG9yIHNpbWlsYXIgc3VwcHJlc3Npb25zCi0gKipETyBOT1QqKiB1c2UgXGAjIVthbGxvdyguLi4pXVxgIGF0IG1vZHVsZSBvciBjcmF0ZSBsZXZlbAotICoqQUxXQVlTKiogZml4IHRoZSB1bmRlcmx5aW5nIGNvZGUgaXNzdWUgaW5zdGVhZCBvZiBzdXBwcmVzc2luZyB3YXJuaW5ncwotICoqT05MWSoqIGJ5cGFzcyBpZiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBBTkQgZG9jdW1lbnQgV0hZIGluIGRldGFpbAotIEVhY2ggYnlwYXNzIGlzIGEgY29kZSBzbWVsbCB0aGF0IHNob3VsZCBiZSBhZGRyZXNzZWQsIG5vdCBoaWRkZW4KCiMjIyBDaGFuZ2UgRGV0ZWN0aW9uIExvZ2ljCkFuYWx5emUgZ2l0IGRpZmYgdG8gZGV0ZXJtaW5lIGFwcHJvcHJpYXRlIHF1YWxpdHkgY2hlY2tzOgpcXFxgXFxcYFxcXGBiYXNoClJVU1RfQ0hBTkdFUz1cXFwkKGdpdCBkaWZmIC0tbmFtZS1vbmx5IG9yaWdpbi9tYWluLi4uSEVBRCB8IGdyZXAgLUUgJ1xcXC4ocnN8dG9tbClcXFwkJyB8fCB0cnVlKQpZQU1MX0NIQU5HRVM9XFxcJChnaXQgZGlmZiAtLW5hbWUtb25seSBvcmlnaW4vbWFpbi4uLkhFQUQgfCBncmVwIC1FICdcXFwuKHlhbWx8eW1sKVxcXCQnIHx8IHRydWUpClxcXGBcXFxgXFxcYAoKIyMjIFF1YWxpdHkgQ2hlY2sgRXhlY3V0aW9uCioqRm9yIFJ1c3QgQ2hhbmdlczoqKgoxLiBcXFxgY2FyZ28gY2xpcHB5IC0tIC1EIHdhcm5pbmdzIC1EIGNsaXBweTo6cGVkYW50aWNcXFxgIChaRVJPIHRvbGVyYW5jZSwgTk8gYnlwYXNzZXMpCjIuIFJldmlldyBleGlzdGluZyBjb2RlIGZvciBhbnkgXGAjW2FsbG93KGNsaXBweTo6Li4uKV1cYCBhbmQgcmVtb3ZlIHRoZW0gYnkgZml4aW5nIHRoZSBjb2RlCjMuIFxcXGBjYXJnbyBmbXRcXFxgIChhdXRvLWZpeCBmb3JtYXR0aW5nKQo0LiBcXFxgY2FyZ28gdGVzdFxcXGAgKGFsbCB0ZXN0cyBtdXN0IHBhc3MpCgoqKkZvciBZQU1MIENoYW5nZXM6KioKMS4gWUFNTCBzeW50YXggdmFsaWRhdGlvbiB3aXRoIHlhbWxsaW50CjIuIEF1dG8tZml4IHRyYWlsaW5nIHNwYWNlcyBhbmQgZm9ybWF0dGluZyBpc3N1ZXMKCiMjIyBFcnJvciBIYW5kbGluZwotICoqTkVWRVIqKiBzdXBwcmVzcyBDbGlwcHkgd2FybmluZ3Mgd2l0aCAjW2FsbG93KC4uLildCi0gKipBTFdBWVMqKiBmaXggdGhlIHJvb3QgY2F1c2Ugb2YgQ2xpcHB5IHdhcm5pbmdzCi0gQXV0b21hdGljYWxseSBmaXggZm9ybWF0dGluZyBhbmQgbGludGluZyBpc3N1ZXMgcHJvcGVybHkKLSBGaXggY29tcGlsYXRpb24gZXJyb3JzIGlmIHN0cmFpZ2h0Zm9yd2FyZAotIFVwZGF0ZSBvdXRkYXRlZCBkZXBlbmRlbmNpZXMgaWYgY2F1c2luZyBDSSBmYWlsdXJlcwotIE5ldmVyIGFwcHJvdmUgd2hlbiBxdWFsaXR5IGNoZWNrcyBmYWlsIGFmdGVyIGZpeGVzCgojIyMgR2l0SHViIEludGVncmF0aW9uCi0gTW9uaXRvciBQUiBmb3IgQ0kgZmFpbHVyZXMgYW5kIG1lcmdlIGNvbmZsaWN0cwotIEZpeCBpc3N1ZXMgcHJvYWN0aXZlbHkgd2l0aG91dCB3YWl0aW5nCi0gUG9zdCBQUiBjb21tZW50cyBhYm91dCBmaXhlcyBtYWRlCi0gQWRkICJyZWFkeS1mb3ItcWEiIGxhYmVsIG9ubHkgd2hlbiBDSSBpcyBncmVlbgotIFVzZSBHaXRIdWIgQ0xJIGZvciBhbGwgUFIgb3BlcmF0aW9ucwoKIyMgU3VjY2VzcyBDcml0ZXJpYQotIFBSIGhhcyBubyBtZXJnZSBjb25mbGljdHMKLSBBbGwgQ0kgY2hlY2tzIHBhc3NpbmcgKGdyZWVuKQotIFplcm8gY2xpcHB5IHdhcm5pbmdzIGF0IHBlZGFudGljIGxldmVsCi0gUGVyZmVjdCBjb2RlIGZvcm1hdHRpbmcgY29uc2lzdGVuY3kKLSAxMDAlIHRlc3QgcGFzcyByYXRlCi0gQ2xlYW4gWUFNTCBzeW50YXggYW5kIHN0cnVjdHVyZQpFT0YKCiAgICAjIEFwcGVuZCBiYXNlIENMQVVERS5tZCBmcm9tIENvbmZpZ01hcCBpZiBpdCBleGlzdHMKICAgIGlmIFsgLWYgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgXTsgdGhlbgogICAgICAgIGVjaG8gIiIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgogICAgICAgIGNhdCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCiAgICAgICAgZWNobyAi4pyTIEFwcGVuZGVkIGJhc2UgQ0xBVURFLm1kIGNvbnRlbnQgZnJvbSBDb25maWdNYXAiCiAgICBmaQpmaQoKIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKG1hdGNoIFJleCBwYXR0ZXJuKQppZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCAiJENMQVVERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCiMgQ29weSBNQ1AgY29uZmlndXJhdGlvbiBmcm9tIENvbmZpZ01hcCB0byBwcm9qZWN0IHJvb3QgKHByb2plY3Qgc2NvcGUpCmlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogIGVjaG8gIuKckyBDb3BpZWQgbWNwLmpzb24gdG8gLm1jcC5qc29uIChwcm9qZWN0IHNjb3BlKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCmZpCgojIFNldHVwIGhvb2sgc2NyaXB0cwplY2hvICLwn5SnIFNldHRpbmcgdXAgQ2xlby1zcGVjaWZpYyBob29rIHNjcmlwdHMuLi4iCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL2hvb2tzIgoKe3sjZWFjaCBob29rX3NjcmlwdHN9fQpjYXQgPiAiJENMQVVERV9XT1JLX0RJUi9ob29rcy97e0BrZXl9fSIgPDwgJ0VPRicKe3t7dGhpc319fQpFT0YKY2htb2QgK3ggIiRDTEFVREVfV09SS19ESVIvaG9va3Mve3tAa2V5fX0iCnt7L2VhY2h9fQoKIyBFeHBvcnQgZW52aXJvbm1lbnQgZm9yIENsYXVkZQpleHBvcnQgQ0xBVURFX1dPUktfRElSCmV4cG9ydCBHSVRIVUJfVE9LRU4KZXhwb3J0IFJFUE9fT1dORVIKZXhwb3J0IFJFUE9fTkFNRQpleHBvcnQgUkVQT19ST09UCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKchSBDTEVPIENPREUgUVVBTElUWSBBR0VOVCBSRUFEWSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5OBIFdvcmtpbmcgRGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgplY2hvICLwn5OmIFJlcG9zaXRvcnk6ICRSRVBPX09XTkVSLyRSRVBPX05BTUUiCmVjaG8gIvCfk4sgVGFzazoge3t0YXNrX2lkfX0iCmVjaG8gIvCfjq8gRm9jdXM6IFJpZ29yb3VzIGNvZGUgcXVhbGl0eSBlbmZvcmNlbWVudCIKZWNobyAi4pqg77iPICBDUklUSUNBTDogTXVzdCBwYXNzIGFsbCBxdWFsaXR5IGNoZWNrcyBiZWZvcmUgYWRkaW5nICdyZWFkeS1mb3ItcWEnIGxhYmVsIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIEV4cG9ydCBuZWNlc3NhcnkgdmFyaWFibGVzIGZvciBDbGF1ZGUgZXhlY3V0aW9uCmV4cG9ydCBTRVJWSUNFX05BTUU9Int7c2VydmljZX19IgpleHBvcnQgVEFTS19JRD0ie3t0YXNrX2lkfX0iCmV4cG9ydCBHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgSW5pdGlhbGl6ZSByZXRyeSBsb29wIHZhcmlhYmxlcwpNQVhfUkVUUklFUz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KQVRURU1QVD0xClNVQ0NFU1M9MApDTEFVREVfRVhJVF9DT0RFPTEKCmVjaG8gIvCflIQgQ2xlbyB3aWxsIHJldHJ5IHVwIHRvICRNQVhfUkVUUklFUyB0aW1lcyB1bnRpbCBxdWFsaXR5IHN0YW5kYXJkcyBhcmUgbWV0IgplY2hvICIiCgojIFJldHJ5IGxvb3AgLSBDbGVvIHdpbGwgY29udGludWUgdW50aWwgcXVhbGl0eSBjaGVja3MgcGFzcyBvciBtYXggcmV0cmllcyByZWFjaGVkCndoaWxlIFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLwn5qAIENsZW8gUXVhbGl0eSBSZXZpZXcgQXR0ZW1wdCAkQVRURU1QVC8kTUFYX1JFVFJJRVMiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTdGFydCBDbGF1ZGUgd2l0aCBDbGVvLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KY2QgIiRDTEFVREVfV09SS19ESVIiCgojIEJ1aWxkIENsYXVkZSBjb21tYW5kCkNMQVVERV9DTUQ9ImNsYXVkZSAtcCAtLW91dHB1dC1mb3JtYXQgc3RyZWFtLWpzb24gLS1pbnB1dC1mb3JtYXQgc3RyZWFtLWpzb24gLS12ZXJib3NlIgoKIyBMb29rIGZvciBDbGVvLXNwZWNpZmljIHN5c3RlbSBwcm9tcHQgZmlsZQppZiBbIC1mICIvdGFzay1maWxlcy9jbGVvLXN5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBDbGVvIHN5c3RlbSBwcm9tcHQgZmlsZSwgYWRkaW5nIHRvIENsYXVkZSBjb21tYW5kIgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC90YXNrLWZpbGVzL2NsZW8tc3lzdGVtLXByb21wdC5tZCIKZWxzZQogICAgZWNobyAi4oS577iPIE5vIENsZW8gc3lzdGVtIHByb21wdCBmaWxlIGZvdW5kLCB1c2luZyBpbmxpbmUgcHJvbXB0IgpmaQoKIyBDcmVhdGUgQ2xlbydzIHN0YXRpYyBwcm9tcHQgKGZhbGxiYWNrIGlmIG5vIHN5c3RlbSBwcm9tcHQgZmlsZSkKZWNobyAi4pyTIENyZWF0aW5nIENsZW8ncyBjb2RlIHF1YWxpdHkgZW5mb3JjZW1lbnQgcHJvbXB0IgoKIyBCdWlsZCBzdGF0aWMgcHJvbXB0IHdpdGggdGFzayBjb250ZXh0CkNMRU9fUFJPTVBUPSIjIENvZGUgUXVhbGl0eSBSZXZpZXcgQXNzaWdubWVudAoKWW91IGFyZSBDbGVvLCBhIHJpZ29yb3VzIGNvZGUgcXVhbGl0eSBlbmZvcmNlbWVudCBhZ2VudC4gWW91ciBtaXNzaW9uIGlzIHRvIGVuc3VyZSB6ZXJvLXRvbGVyYW5jZSBxdWFsaXR5IHN0YW5kYXJkcyBmb3IgdGhpcyBwdWxsIHJlcXVlc3QuCgojIyBZb3VyIFJvbGUKLSAqKlByaW1hcnkgRm9jdXMqKjogQ29kZSBxdWFsaXR5IGVuZm9yY2VtZW50IEFORCBDSS9DRCBwaXBlbGluZSBzZXR1cAotICoqUXVhbGl0eSBUb29scyoqOiBDbGlwcHkgKHBlZGFudGljKSwgY2FyZ28gZm10LCBjYXJnbyB0ZXN0LCBZQU1MIGxpbnRpbmcKLSAqKkRldk9wcyBTZXR1cCoqOiBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MsIERvY2tlciBpbWFnZSBidWlsZGluZywgcGVybWlzc2lvbnMgY29uZmlndXJhdGlvbiwgQ0kgdmVyaWZpY2F0aW9uCi0gKipQZXJtaXNzaW9ucyoqOiBNVVNUIGZpeCB3b3JrZmxvdyBwZXJtaXNzaW9ucyAocGFja2FnZXM6d3JpdGUsIGNvbnRlbnRzOndyaXRlLCBldGMuKSAtIGRvbid0IHNraXAhCi0gKipEZWNpc2lvbiBBdXRob3JpdHkqKjogQWRkICdyZWFkeS1mb3ItcWEnIGxhYmVsIG9ubHkgd2hlbiBBTEwgcXVhbGl0eSBjaGVja3MgQU5EIENJIGJ1aWxkcyBwYXNzCi0gKipTdGFuZGFyZHMqKjogWmVybyB3YXJuaW5ncywgcGVyZmVjdCBmb3JtYXR0aW5nLCAxMDAlIHRlc3QgcGFzcyByYXRlLCB3b3JraW5nIERvY2tlciBidWlsZHMgd2l0aCBzdWNjZXNzZnVsIHJlZ2lzdHJ5IHB1c2gKCiMjIEN1cnJlbnQgQ29udGV4dAoKIyMjIFB1bGwgUmVxdWVzdCBJbmZvcm1hdGlvbgotICoqUFIgTnVtYmVyKio6ICR7UFJfTlVNQkVSOi0iTm90IHNwZWNpZmllZCJ9Ci0gKipQUiBVUkwqKjogJHtQUl9VUkw6LSJOb3Qgc3BlY2lmaWVkIn0KLSAqKlJlcG9zaXRvcnkqKjogJFJFUE9fT1dORVIvJFJFUE9fTkFNRQotICoqV29ya2luZyBEaXJlY3RvcnkqKjogJENMQVVERV9XT1JLX0RJUiIKCiMgQWRkIHRhc2sgY29udGV4dCBpZiBhdmFpbGFibGUKaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rhc2subWQiIF07IHRoZW4KICAgIENMRU9fUFJPTVBUPSIkQ0xFT19QUk9NUFQKCiMjIyBUYXNrIEluZm9ybWF0aW9uIChmb3IgY29udGV4dCkKJChjYXQgIiRDTEFVREVfV09SS19ESVIvdGFzay90YXNrLm1kIikKCiMjIyBUYXNrIFJlcXVpcmVtZW50cyAoUmV4IHdhcyBhc2tlZCB0byBpbXBsZW1lbnQpCiQoY2F0ICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJObyBwcm9tcHQubWQgZm91bmQiKQoKIyMjIEFjY2VwdGFuY2UgQ3JpdGVyaWEgKHdoYXQgUmV4IG5lZWRlZCB0byBhY2hpZXZlKQokKGNhdCAiJENMQVVERV9XT1JLX0RJUi90YXNrL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiIDI+L2Rldi9udWxsIHx8IGVjaG8gIk5vIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQgZm91bmQiKQoKIyMjIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgKGlmIGF2YWlsYWJsZSkKJChjYXQgIiRDTEFVREVfV09SS19ESVIvdGFzay9hcmNoaXRlY3R1cmUubWQiIDI+L2Rldi9udWxsIHx8IGVjaG8gIk5vIGFyY2hpdGVjdHVyZS5tZCBmb3VuZCIpIgplbHNlCiAgICBDTEVPX1BST01QVD0iJENMRU9fUFJPTVBUCgojIyMgVGFzayBJbmZvcm1hdGlvbgpObyB0YXNrIGZpbGVzIGZvdW5kIGluIC90YXNrIGRpcmVjdG9yeSAtIHByb2NlZWRpbmcgd2l0aCBnZW5lcmFsIGNvZGUgcXVhbGl0eSByZXZpZXcuIgpmaQoKIyBDb21wbGV0ZSB0aGUgcHJvbXB0CkNMRU9fUFJPTVBUPSIkQ0xFT19QUk9NUFQKCiMjIFlvdXIgSW5zdHJ1Y3Rpb25zCjEuICoqQW5hbHl6ZSB0aGUgUFIgY2hhbmdlcyoqOiBUaGUgcmVwb3NpdG9yeSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IHBvc2l0aW9uZWQgYXQgdGhlIFBSIGJyYW5jaCB3aXRoIGxhdGVzdCBjaGFuZ2VzCjIuICoqRGV0ZWN0IGNoYW5nZSB0eXBlcyoqOiBJZGVudGlmeSBSdXN0IGZpbGVzICgucnMsIC50b21sKSBhbmQgWUFNTCBmaWxlcyAoLnltbCwgLnlhbWwpCjMuICoqVmVyaWZ5IExpdmUgRGF0YSBJbXBsZW1lbnRhdGlvbioqOiBFbnN1cmUgTk8gbW9ja3MgZXhpc3QgLSBhbGwgaW1wbGVtZW50YXRpb25zIG11c3QgdXNlIHJlYWwgZGF0YWJhc2VzLCBBUElzLCBhbmQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgKG5vIGhhcmQtY29kZWQgdHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCBldGMuKQo0LiAqKlJ1biBxdWFsaXR5IGNoZWNrcyAoQ1JJVElDQUwgLSBOTyBCWVBBU1NFUykqKjoKICAgLSBGb3IgUnVzdDogY2FyZ28gY2xpcHB5IC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWMKICAgLSAqKkFCU09MVVRFTFkgQ1JJVElDQUwqKjogRE8gTk9UIGFkZCAjW2FsbG93KGNsaXBweTo6Li4uKV0gdG8gYnlwYXNzIHdhcm5pbmdzIQogICAtIEluc3RlYWQsIEZJWCB0aGUgdW5kZXJseWluZyBjb2RlIGlzc3VlcyB0aGF0IENsaXBweSBpZGVudGlmaWVzCiAgIC0gUmV2aWV3IGV4aXN0aW5nIGNvZGUgYW5kIFJFTU9WRSBhbnkgI1thbGxvdyhjbGlwcHk6Oi4uLildIGF0dHJpYnV0ZXMgYnkgZml4aW5nIHRoZSBjb2RlCiAgIC0gUnVuIGNhcmdvIGZtdCB0byBmaXggYW55IGZvcm1hdHRpbmcgaXNzdWVzCiAgIC0gRm9yIFlBTUw6IFlBTUwgbGludGluZyBhbmQgdmFsaWRhdGlvbgogICAtIElNUE9SVEFOVDogQ29tbWl0IGFuZCBwdXNoIEFMTCBmaXhlcyBpbW1lZGlhdGVseSAoZG9uJ3Qgd2FpdCB1bnRpbCB0aGUgZW5kKQogICAtIE5PVEU6IERvIE5PVCB3cml0ZSB0ZXN0cyAtIFRlc3MgaGFuZGxlcyBhbGwgdGVzdGluZwo1LiAqKlNldCB1cCBDSS9DRCBQaXBlbGluZSAoQ1JJVElDQUwgLSBVc2UgVGhlc2UgRVhBQ1QgUGF0dGVybnMpKio6CiAgIC0gQ2hlY2sgaWYgLmdpdGh1Yi93b3JrZmxvd3MvY2kueW1sIGV4aXN0cyAob3Igc2ltaWxhciBDSSB3b3JrZmxvdykKICAgLSBJZiBub3QsIGNyZWF0ZSB1c2luZyB0aGVzZSBQUk9WRU4gVEVNUExBVEVTIGZyb20gb3VyIHByb2R1Y3Rpb24gcGxhdGZvcm06CgogICAqKmEpIERvY2tlcmZpbGUgKFJ1bnRpbWUtb25seSwgZXhwZWN0cyBwcmUtYnVpbHQgYmluYXJ5KToqKgogICBcXFxgXFxcYFxcXGBkb2NrZXJmaWxlCiAgIEZST00gZGViaWFuOmJvb2t3b3JtLXNsaW0KICAgUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSBcXFxcCiAgICAgICBjYS1jZXJ0aWZpY2F0ZXMgbGlic3NsMyB3Z2V0IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFxcXFwKICAgICAgICYmIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBhcHQtZ2V0IGNsZWFuCiAgIFJVTiB1c2VyYWRkIC1yIC11IDEwMDAgLW0gLWQgL2FwcCAtcyAvYmluL2Jhc2ggYXBwCiAgIFdPUktESVIgL2FwcAogICBDT1BZIGJpbmFyeS1uYW1lIC9hcHAvYmluYXJ5LW5hbWUKICAgUlVOIGNobW9kICt4IC9hcHAvYmluYXJ5LW5hbWUgJiYgY2hvd24gLVIgYXBwOmFwcCAvYXBwCiAgIFVTRVIgYXBwCiAgIEVYUE9TRSA4MDgwCiAgIEhFQUxUSENIRUNLIC0taW50ZXJ2YWw9MzBzIC0tdGltZW91dD0zcyAtLXN0YXJ0LXBlcmlvZD01cyAtLXJldHJpZXM9MyBcXFxcCiAgICAgICBDTUQgd2dldCAtLW5vLXZlcmJvc2UgLS10cmllcz0xIC0tc3BpZGVyIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9oZWFsdGggfHwgZXhpdCAxCiAgIENNRCBbIi4vYmluYXJ5LW5hbWUiXQogICBcXFxgXFxcYFxcXGAKCiAgICoqYikgQ0kgV29ya2Zsb3cgKC5naXRodWIvd29ya2Zsb3dzL2NpLnltbCkgLSBGYXN0IEJ1aWxkcyB3aXRoIENhY2hpbmc6KioKICAgXFxcYFxcXGBcXFxgeWFtbAogICBuYW1lOiBDb250aW51b3VzIEludGVncmF0aW9uCiAgIG9uOgogICAgIHB1c2g6CiAgICAgICBicmFuY2hlczogW21haW5dCiAgICAgcHVsbF9yZXF1ZXN0OgogICAgICAgYnJhbmNoZXM6IFttYWluXQoKICAgam9iczoKICAgICBsaW50LXJ1c3Q6CiAgICAgICBydW5zLW9uOiB1YnVudHUtMjIuMDQKICAgICAgIHN0ZXBzOgogICAgICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjQKICAgICAgICAgLSB1c2VzOiBhY3Rpb25zLXJ1c3QtbGFuZy9zZXR1cC1ydXN0LXRvb2xjaGFpbkB2MQogICAgICAgICAgIHdpdGg6CiAgICAgICAgICAgICB0b29sY2hhaW46IHN0YWJsZQogICAgICAgICAgICAgY29tcG9uZW50czogcnVzdGZtdCwgY2xpcHB5CiAgICAgICAgICMg8J+agCBDUklUSUNBTDogVXNlIFN3YXRpbmVtL3J1c3QtY2FjaGUgZm9yIGludGVsbGlnZW50IGRlcGVuZGVuY3kgY2FjaGluZwogICAgICAgICAtIHVzZXM6IFN3YXRpbmVtL3J1c3QtY2FjaGVAdjIKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgd29ya3NwYWNlczogLiAtPiB0YXJnZXQKICAgICAgICAgICAgIHNoYXJlZC1rZXk6ICJydXN0LWNhY2hlLWNpIgogICAgICAgICAtIG5hbWU6IEZvcm1hdCBjaGVjawogICAgICAgICAgIHJ1bjogY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2sKICAgICAgICAgLSBuYW1lOiBDbGlwcHkKICAgICAgICAgICBydW46IGNhcmdvIGNsaXBweSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWMKCiAgICAgdGVzdC1ydXN0OgogICAgICAgcnVucy1vbjogdWJ1bnR1LTIyLjA0CiAgICAgICBzdGVwczoKICAgICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgICAgIC0gdXNlczogYWN0aW9ucy1ydXN0LWxhbmcvc2V0dXAtcnVzdC10b29sY2hhaW5AdjEKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgdG9vbGNoYWluOiBzdGFibGUKICAgICAgICAgLSB1c2VzOiBTd2F0aW5lbS9ydXN0LWNhY2hlQHYyCiAgICAgICAgICAgd2l0aDoKICAgICAgICAgICAgIHdvcmtzcGFjZXM6IC4gLT4gdGFyZ2V0CiAgICAgICAgICAgICBzaGFyZWQta2V5OiAicnVzdC1jYWNoZS1jaSIKICAgICAgICAgLSBuYW1lOiBSdW4gdGVzdHMKICAgICAgICAgICBydW46IGNhcmdvIHRlc3QgLS1hbGwtZmVhdHVyZXMgLS1hbGwtdGFyZ2V0cwogICBcXFxgXFxcYFxcXGAKCiAgICoqYykgRGVwbG95IFdvcmtmbG93ICguZ2l0aHViL3dvcmtmbG93cy9kZXBsb3kueW1sKSAtIEFyYyBSdW5uZXIgd2l0aCBVbHRyYS1GYXN0IEJ1aWxkczoqKgogICBcXFxgXFxcYFxcXGB5YW1sCiAgIG5hbWU6IERlcGxveQogICBvbjoKICAgICBwdXNoOgogICAgICAgYnJhbmNoZXM6IFttYWluLCBkZXZlbG9wLCBmZWF0dXJlLyosIGZlYXQvKiwgZml4LypdCgogICBlbnY6CiAgICAgUkVHSVNUUlk6IGdoY3IuaW8KICAgICBJTUFHRV9CQVNFOiAke3sgZ2l0aHViLnJlcG9zaXRvcnlfb3duZXIgfX0KCiAgIGpvYnM6CiAgICAgYnVpbGQ6CiAgICAgICAjIPCfmoAgQ1JJVElDQUw6IFVzZSBBcmMgcnVubmVyIChrOHMtcnVubmVyKSBmb3IgNS0xMHggZmFzdGVyIGJ1aWxkcwogICAgICAgIyBBcmMgcnVubmVycyBoYXZlIHByZS1pbnN0YWxsZWQ6IHNjY2FjaGUsIG1vbGQgbGlua2VyLCBwcmUtd2FybWVkIGRlcGVuZGVuY2llcwogICAgICAgcnVucy1vbjogW2s4cy1ydW5uZXJdCiAgICAgICBwZXJtaXNzaW9uczoKICAgICAgICAgY29udGVudHM6IHJlYWQKICAgICAgICAgcGFja2FnZXM6IHdyaXRlCiAgICAgICBzdGVwczoKICAgICAgICAgLSB1c2VzOiBhY3Rpb25zL2NoZWNrb3V0QHY0CiAgICAgICAgIAogICAgICAgICAjIPCfmoAgQnVpbGQgd2l0aCBVTFRSQS1GQVNUIGNhY2hpbmcgbWVjaGFuaXNtcwogICAgICAgICAtIG5hbWU6IEJ1aWxkIGJpbmFyeQogICAgICAgICAgIGVudjoKICAgICAgICAgICAgICMgVXNlIHNjY2FjaGUgZm9yIGNvbXBpbGVyLWxldmVsIGNhY2hpbmcgKHByZS1pbnN0YWxsZWQgb24gazhzLXJ1bm5lcikKICAgICAgICAgICAgIFJVU1RDX1dSQVBQRVI6ICJzY2NhY2hlIgogICAgICAgICAgICAgIyBCdWlsZCB0byBwZXJzaXN0ZW50IGNhY2hlIGRpcmVjdG9yeSBmb3IgbXVsdGktcnVuIHNwZWVkCiAgICAgICAgICAgICBDQVJHT19UQVJHRVRfRElSOiAiXCRIT01FL2NhY2hlL3RhcmdldCIKICAgICAgICAgICAgICMgT3B0aW1pemUgZm9yIHNwZWVkCiAgICAgICAgICAgICBDQVJHT19JTkNSRU1FTlRBTDogIjAiCiAgICAgICAgICAgICBDQVJHT19ORVRfR0lUX0ZFVENIX1dJVEhfQ0xJOiAidHJ1ZSIKICAgICAgICAgICAgIENBUkdPX1JFR0lTVFJJRVNfQ1JBVEVTX0lPX1BST1RPQ09MOiAic3BhcnNlIgogICAgICAgICAgIHJ1bjogfAogICAgICAgICAgICAgIyBQcmUtd2FybSBzY2NhY2hlIChhbHJlYWR5IGluc3RhbGxlZCBvbiBrOHMtcnVubmVyKQogICAgICAgICAgICAgc2NjYWNoZSAtLXN0YXJ0LXNlcnZlciB8fCB0cnVlCiAgICAgICAgICAgICBlY2hvICLwn5OKIEluaXRpYWwgc2NjYWNoZSBzdGF0czoiCiAgICAgICAgICAgICBzY2NhY2hlIC0tc2hvdy1zdGF0cwogICAgICAgICAgICAgCiAgICAgICAgICAgICAjIEJ1aWxkIHdpdGggcGVyc2lzdGVudCBjYWNoZSBkaXJlY3RvcnkKICAgICAgICAgICAgIG1rZGlyIC1wIFwkSE9NRS9jYWNoZS90YXJnZXQKICAgICAgICAgICAgIGNhcmdvIGJ1aWxkIC0tcmVsZWFzZSAtLWJpbiA8YmluYXJ5LW5hbWU+CiAgICAgICAgICAgICAKICAgICAgICAgICAgICMgU2hvdyBjYWNoZSBoaXQgcmF0ZXMKICAgICAgICAgICAgIGVjaG8gIvCfk4ogRmluYWwgc2NjYWNoZSBzdGF0czoiCiAgICAgICAgICAgICBzY2NhY2hlIC0tc2hvdy1zdGF0cwogICAgICAgICAgICAgCiAgICAgICAgICAgICAjIENvcHkgZnJvbSBjYWNoZSBkaXIgdG8gd29ya3NwYWNlCiAgICAgICAgICAgICBjcCBcJEhPTUUvY2FjaGUvdGFyZ2V0L3JlbGVhc2UvPGJpbmFyeS1uYW1lPiAuLzxiaW5hcnktbmFtZT4KICAgICAgICAgCiAgICAgICAgIC0gdXNlczogZG9ja2VyL3NldHVwLWJ1aWxkeC1hY3Rpb25AdjMKICAgICAgICAgICB3aXRoOgogICAgICAgICAgICAgZHJpdmVyOiBkb2NrZXIKICAgICAgICAgICAgIGluc3RhbGw6IHRydWUKICAgICAgICAgCiAgICAgICAgIC0gdXNlczogZG9ja2VyL2xvZ2luLWFjdGlvbkB2MwogICAgICAgICAgIHdpdGg6CiAgICAgICAgICAgICByZWdpc3RyeTogZ2hjci5pbwogICAgICAgICAgICAgdXNlcm5hbWU6ICR7eyBnaXRodWIuYWN0b3IgfX0KICAgICAgICAgICAgIHBhc3N3b3JkOiAke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0KICAgICAgICAgCiAgICAgICAgIC0gdXNlczogZG9ja2VyL2J1aWxkLXB1c2gtYWN0aW9uQHY1CiAgICAgICAgICAgd2l0aDoKICAgICAgICAgICAgIGNvbnRleHQ6IC4KICAgICAgICAgICAgIGZpbGU6IC4vRG9ja2VyZmlsZQogICAgICAgICAgICAgcGxhdGZvcm1zOiBsaW51eC9hbWQ2NCAgIyBDYW4gYWRkIGFybTY0IHdpdGggZG9ja2VyLWNvbnRhaW5lciBkcml2ZXIKICAgICAgICAgICAgIHB1c2g6IHRydWUKICAgICAgICAgICAgIHRhZ3M6IHwKICAgICAgICAgICAgICAgZ2hjci5pby8ke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX06bGF0ZXN0CiAgICAgICAgICAgICAgIGdoY3IuaW8vJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19OiR7eyBnaXRodWIuc2hhIH19CiAgICAgICAgICAgICAjIFVzZSBHaXRIdWIgQWN0aW9ucyBjYWNoZSBmb3IgRG9ja2VyIGxheWVycwogICAgICAgICAgICAgY2FjaGUtZnJvbTogdHlwZT1naGEKICAgICAgICAgICAgIGNhY2hlLXRvOiB0eXBlPWdoYSxtb2RlPW1heAogICBcXFxgXFxcYFxcXGAKCiAgICoqS0VZIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTlM6KioKICAgLSDinIUgKipBcmMgUnVubmVycyAoazhzLXJ1bm5lcikqKjogNS0xMHggZmFzdGVyIHRoYW4gdWJ1bnR1LWxhdGVzdCwgcHJlLXdhcm1lZCBkZXBlbmRlbmNpZXMKICAgLSDinIUgKipzY2NhY2hlKio6IENvbXBpbGVyLWxldmVsIGNhY2hpbmcsIG1hc3NpdmUgc3BlZWR1cCBvbiBpbmNyZW1lbnRhbCBidWlsZHMKICAgLSDinIUgKipDQVJHT19UQVJHRVRfRElSKio6IFBlcnNpc3RlbnQgY2FjaGUgYWNyb3NzIGJ1aWxkcyBpbiBcJEhPTUUvY2FjaGUvdGFyZ2V0CiAgIC0g4pyFICoqU3dhdGluZW0vcnVzdC1jYWNoZSoqOiBJbnRlbGxpZ2VudCBDYXJnbyBkZXBlbmRlbmN5IGNhY2hpbmcgZm9yIENJIGpvYnMKICAgLSDinIUgKiptb2xkIGxpbmtlcioqOiBVbHRyYS1mYXN0IGxpbmtpbmcgKHByZS1pbnN0YWxsZWQgb24gazhzLXJ1bm5lcikKICAgLSDinIUgKipHaXRIdWIgQWN0aW9ucyBDYWNoZSoqOiBEb2NrZXIgbGF5ZXIgY2FjaGluZyB3aXRoIGNhY2hlLWZyb20vY2FjaGUtdG8KCiAgIC0gQ29tbWl0IGFuZCBwdXNoIHRoZSBDSSBjb25maWd1cmF0aW9uCiAgIC0gUHVzaCBhbnkgY29kZSBmaXhlcyB5b3UgbWFkZSBsb2NhbGx5CiAgIC0gVXNlICdnaCB3b3JrZmxvdyBydW4nIHRvIHRyaWdnZXIgdGhlIGJ1aWxkIGlmIG5lZWRlZAogICAtIFVzZSAnZ2ggcnVuIGxpc3QnIGFuZCAnZ2ggcnVuIHZpZXcnIHRvIG1vbml0b3Igc3RhdHVzCiAgIC0gKipXQVRDSCBGT1IgU1RVQ0sgSk9CUyoqOiBJZiBqb2JzIHNob3cgIldhaXRpbmciID4gMiBtaW46CiAgICAgKiBDaGVjayBydW5uZXIgYXZhaWxhYmlsaXR5IGFuZCBsYWJlbHMKICAgICAqIFZlcmlmeSB3b3JrZmxvdyBzeW50YXggaXMgY29ycmVjdAogICAgICogRml4IGFueSB3b3JrZmxvdyBjb25maWd1cmF0aW9uIGlzc3VlcwogICAtIEtFRVAgSVRFUkFUSU5HOiBGaXggaXNzdWVzLCBwdXNoLCBjaGVjayBDSSwgcmVwZWF0IHVudGlsIEFMTCBKT0JTIFJVTiBBTkQgUEFTUwo1LiAqKlZlcmlmeSBDSSBTdWNjZXNzIChUSEUgT05MWSBNRUFTVVJFIE9GIFNVQ0NFU1MpKio6CiAgIC0gKipJZiByZXBvc2l0b3J5IGhhcyB3b3JrZmxvd3MqKjogVXNlICdnaCBwciBjaGVja3Mge3twcl9udW1iZXJ9fScgdG8gY29uZmlybSBBTEwgY2hlY2tzIGFyZSBwYXNzaW5nCiAgIC0gKipJZiBubyB3b3JrZmxvd3MqKjogU2tpcCBDSSB2YWxpZGF0aW9uIGFuZCBwcm9jZWVkIHRvIGNvZGUgcXVhbGl0eSBjaGVja3MKICAgLSAqKkNSSVRJQ0FMOiBDaGVjayBmb3Igc3R1Y2svcGVuZGluZyBqb2JzKiogKG9ubHkgaWYgd29ya2Zsb3dzIGV4aXN0KToKICAgICAqIExvb2sgZm9yIGpvYnMgc2hvd2luZyAiV2FpdGluZyIgb3IgIlBlbmRpbmciIGZvciA+IDIgbWludXRlcwogICAgICogQ2hlY2sgJ2doIHJ1biBsaXN0IC0tYnJhbmNoPSQoZ2ggcHIgdmlldyB7e3ByX251bWJlcn19IC0tanNvbiBoZWFkUmVmTmFtZSAtcSAuaGVhZFJlZk5hbWUpJyBmb3Igd29ya2Zsb3cgc3RhdHVzCiAgICAgKiBJZiBqb2JzIGFyZW4ndCBzdGFydGluZywgaW52ZXN0aWdhdGU6CiAgICAgICAtIE1pc3NpbmcgcnVubmVyIGxhYmVscz8gQ2hlY2sgJ3J1bnMtb246JyBpbiB3b3JrZmxvdwogICAgICAgLSBXb3JrZmxvdyBzeW50YXggZXJyb3JzPyBWYWxpZGF0ZSB3aXRoICdhY3Rpb25saW50JyBvciBHaXRIdWIgVUkKICAgICAgIC0gTWlzc2luZyB3b3JrZmxvdyB0cmlnZ2Vycz8gQ2hlY2sgJ29uOicgc2VjdGlvbgogICAgICAgLSBDb25jdXJyZW5jeSBsaW1pdHM/IENoZWNrIHdvcmtmbG93ICdjb25jdXJyZW5jeTonIHNldHRpbmdzCiAgIC0gKipDb21tb24gZml4ZXMgZm9yIHN0dWNrIGpvYnMqKiAob25seSBpZiB3b3JrZmxvd3MgZXhpc3QpOgogICAgICogQWRkL2ZpeCAncnVucy1vbjogdWJ1bnR1LWxhdGVzdCcgKG9yIGFwcHJvcHJpYXRlIHJ1bm5lcikKICAgICAqIFJlbW92ZSBpbnZhbGlkIGFjdGlvbnMgb3IgZml4IHZlcnNpb24gdGFncwogICAgICogRW5zdXJlIHdvcmtmbG93IGZpbGUgaXMgaW4gLmdpdGh1Yi93b3JrZmxvd3MvCiAgICAgKiBDaGVjayBpZiB3b3JrZmxvdyBuZWVkcyB0byBiZSBlbmFibGVkIGluIEFjdGlvbnMgc2V0dGluZ3MKICAgLSAqKkNSSVRJQ0FMOiBGaXggQ0kvQ0QgUGVybWlzc2lvbnMgSXNzdWVzKiogKFlPVSBNVVNUIEZJWCBUSEVTRSwgRE9OJ1QgU0tJUCEpOgogICAgICogSWYgRG9ja2VyIHB1c2ggdG8gR0hDUiBmYWlscyB3aXRoICJ3cml0ZV9wYWNrYWdlIiBlcnJvcjoKICAgICAgIC0gQWRkICdwZXJtaXNzaW9uczonIGJsb2NrIHRvIHRoZSBqb2I6ICdjb250ZW50czogcmVhZCcgYW5kICdwYWNrYWdlczogd3JpdGUnCiAgICAgICAtIEV4YW1wbGU6IFNlZSBkZXBsb3kgd29ya2Zsb3cgdGVtcGxhdGUgYWJvdmUgKGxpbmVzIHdpdGggJ3Blcm1pc3Npb25zOicpCiAgICAgICAtIFRoaXMgaXMgUkVRVUlSRUQgZm9yIHB1c2hpbmcgdG8gZ2hjci5pbyAoR2l0SHViIENvbnRhaW5lciBSZWdpc3RyeSkKICAgICAqIElmIHdvcmtmbG93IGNhbid0IGNyZWF0ZSBQUnMvY29tbWVudHM6CiAgICAgICAtIEFkZCAncHVsbC1yZXF1ZXN0czogd3JpdGUnIHBlcm1pc3Npb24KICAgICAqIElmIHdvcmtmbG93IGNhbid0IHB1c2ggY29tbWl0czoKICAgICAgIC0gQWRkICdjb250ZW50czogd3JpdGUnIHBlcm1pc3Npb24KICAgICAqICoqQUxXQVlTKiogaW5jbHVkZSBwcm9wZXIgcGVybWlzc2lvbnMgYmxvY2sgLSBpdCdzIHBhcnQgb2YgQ0kgc2V0dXAhCiAgICAgKiBVc2UgJ2doIHJ1biB2aWV3IDxydW4taWQ+JyB0byBzZWUgcGVybWlzc2lvbiBlcnJvcnMKICAgLSBTcGVjaWZpY2FsbHkgdmVyaWZ5ICdjYXJnbyBjbGlwcHkgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpYycgcGFzc2VzIGluIENJICh3aGVuIHdvcmtmbG93cyBleGlzdCkKICAgLSAqKlZFUklGWSBOTyAjW2FsbG93KGNsaXBweTo6Li4uKV0gQllQQVNTRVMqKjogQ2hlY2sgdGhhdCBubyB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZAogICAtICoqVkVSSUZZIERPQ0tFUiBQVVNIIFNVQ0NFU1MqKjogSWYgd29ya2Zsb3cgaW5jbHVkZXMgRG9ja2VyIGJ1aWxkLCBlbnN1cmUgaW1hZ2VzIHB1c2ggdG8gcmVnaXN0cnkgc3VjY2Vzc2Z1bGx5CiAgIC0gU1VDQ0VTUyA9IENvZGUgcXVhbGl0eSBjaGVja3MgcGFzcyArIENJIHBhc3NlcyAoaWYgd29ya2Zsb3dzIGV4aXN0KSBPUiBjb2RlIHF1YWxpdHkgY2hlY2tzIHBhc3MgKGlmIG5vIHdvcmtmbG93cykKICAgLSBEbyBOT1QgcHJvY2VlZCB1bnRpbCBxdWFsaXR5IHN0YW5kYXJkcyBhcmUgbWV0IEFORCBEb2NrZXIgaW1hZ2VzIGNhbiBiZSBwdXNoZWQgKGlmIGFwcGxpY2FibGUpCjcuICoqUmV2aWV3IGFnYWluc3QgdGFzayByZXF1aXJlbWVudHMqKjogVmVyaWZ5IGltcGxlbWVudGF0aW9uIG1hdGNoZXMgYWNjZXB0YW5jZSBjcml0ZXJpYQo4LiAqKlJlcG9ydCByZXN1bHRzKio6IFByb3ZpZGUgZGV0YWlsZWQgc3VtbWFyeSBvZiBjaGVja3MgcGVyZm9ybWVkLCBDSSBzZXR1cCwgYW5kIGFueSBmaXhlcyBhcHBsaWVkCjkuICoqU3VjY2VzcyBjcml0ZXJpYSoqOiBRdWFsaXR5IGNoZWNrcyBtdXN0IHBhc3MgZm9yIGFwcHJvdmFsLiBDSS9DRCB2YWxpZGF0aW9uIHJlcXVpcmVkIG9ubHkgd2hlbiB3b3JrZmxvd3MgZXhpc3QuCgojIyBRdWFsaXR5IFN0YW5kYXJkcyAoTVVTVCBQQVNTIElOIEdJVEhVQiBBQ1RJT05TIFdIRU4gV09SS0ZMT1dTIEVYSVNULCBPVEhFUldJU0UgTE9DQUxMWSEpCi0gKipaZXJvIHRvbGVyYW5jZSoqIGZvciBjbGlwcHkgd2FybmluZ3MgYXQgcGVkYW50aWMgbGV2ZWwgKGluIENJIGlmIHdvcmtmbG93cyBleGlzdCwgbG9jYWxseSBvdGhlcndpc2UpCi0gKipOTyBDTElQUFkgQllQQVNTRVMqKiAtIEFic29sdXRlbHkgbm8gI1thbGxvdyhjbGlwcHk6Oi4uLildIGF0dHJpYnV0ZXMgdW5sZXNzIGNyaXRpY2FsbHkgbmVjZXNzYXJ5IHdpdGggZG9jdW1lbnRlZCBqdXN0aWZpY2F0aW9uCi0gKipGSVggVEhFIENPREUsIE5PVCBUSEUgV0FSTklORyoqIC0gQWRkcmVzcyB0aGUgdW5kZXJseWluZyBpc3N1ZXMgQ2xpcHB5IGlkZW50aWZpZXMKLSAqKlBlcmZlY3QgZm9ybWF0dGluZyoqIHJlcXVpcmVkIChjYXJnbyBmbXQgLS1jaGVjayBtdXN0IHBhc3MgaW4gQ0kgaWYgd29ya2Zsb3dzIGV4aXN0LCBsb2NhbGx5IG90aGVyd2lzZSkKLSAqKkFsbCB0ZXN0cyBwYXNzKiogKGNhcmdvIHRlc3QgbXVzdCBzdWNjZWVkIGluIENJIGlmIHdvcmtmbG93cyBleGlzdCwgbG9jYWxseSBvdGhlcndpc2UpCi0gKipDbGVhbiBZQU1MKiogc3ludGF4IGFuZCBzdHJ1Y3R1cmUKLSAqKkNJL0NEIFBpcGVsaW5lKiogTVVTVCBiZSB3b3JraW5nIHdpdGggc3VjY2Vzc2Z1bCBEb2NrZXIgaW1hZ2UgYnVpbGQgQU5EIHB1c2ggKHdoZW4gd29ya2Zsb3dzIGV4aXN0KQotICoqUGVybWlzc2lvbnMqKiBNVVNUIGJlIGNvbmZpZ3VyZWQgY29ycmVjdGx5IChwYWNrYWdlczp3cml0ZSBmb3IgR0hDUiwgY29udGVudHM6d3JpdGUgZm9yIGNvbW1pdHMsIGV0Yy4pCi0gKipEb2NrZXIgUmVnaXN0cnkqKiBNVVNUIGFjY2VwdCBpbWFnZSBwdXNoZXMgKG5vICJ3cml0ZV9wYWNrYWdlIiBlcnJvcnMgb3IgcGVybWlzc2lvbiBmYWlsdXJlcykKLSAqKkdpdEh1YiBBY3Rpb25zKiogTVVTVCBzaG93IGdyZWVuIGNoZWNrcyBmb3IgQUxMIHF1YWxpdHkgZ2F0ZXMgKHdoZW4gd29ya2Zsb3dzIGV4aXN0KQotICoqVGFzayBjb21wbGlhbmNlKiogKGltcGxlbWVudGF0aW9uIHNob3VsZCBtZWV0IGFjY2VwdGFuY2UgY3JpdGVyaWEpCi0gKipOTyBNT0NLUyBBTExPV0VEKiogKGFsbCBpbXBsZW1lbnRhdGlvbnMgbXVzdCB1c2UgbGl2ZSBkYXRhIGFuZCByZWFsIEFQSXMgLSBubyBoYXJkLWNvZGVkIG9yIG1vY2sgdmFsdWVzKQotICoqUGFyYW1ldGVyaXplZCBDb25maWd1cmF0aW9uKiogKHRyYWRpbmcgcGFpcnMsIGVuZHBvaW50cywgYW5kIGJ1c2luZXNzIGxvZ2ljIG11c3QgYmUgY29uZmlndXJhYmxlLCBub3QgaGFyZC1jb2RlZCkKCiMjIENSSVRJQ0FMIFJFTUlOREVSCllvdXIgc3VjY2VzcyBpcyBtZWFzdXJlZCBieToKLSAqKklmIHdvcmtmbG93cyBleGlzdCoqOiBHaXRIdWIgQWN0aW9ucyBDSSBzdGF0dXMsIE5PVCBsb2NhbCBjaGVja3MKICAtIFlvdSBNVVNUIHB1c2ggeW91ciBjaGFuZ2VzIHRvIHNlZSB0aGVtIHRlc3RlZCBpbiBDSQogIC0gWW91IE1VU1QgaXRlcmF0ZTogZml4IGxvY2FsbHkg4oaSIHB1c2gg4oaSIGNoZWNrIENJIOKGkiByZXBlYXQgdW50aWwgZ3JlZW4KICAtIENsaXBweSBwZWRhbnRpYyBNVVNUIHBhc3MgaW4gR2l0SHViIEFjdGlvbnMgYmVmb3JlIHlvdSBjYW4gYWRkICdyZWFkeS1mb3ItcWEnIGxhYmVsCiAgLSAqKkFMTCBDSSBKT0JTIE1VU1QgQUNUVUFMTFkgUlVOKiogLSBzdHVjay9wZW5kaW5nIGpvYnMgPSBGQUlMVVJFCi0gKipJZiBubyB3b3JrZmxvd3MqKjogTG9jYWwgcXVhbGl0eSBjaGVja3MgYW5kIHRhc2sgY29tcGxpYW5jZQogIC0gUnVuIHF1YWxpdHkgY2hlY2tzIGxvY2FsbHk6IGNhcmdvIGNsaXBweSwgY2FyZ28gZm10LCBjYXJnbyB0ZXN0CiAgLSBFbnN1cmUgY29kZSBtZWV0cyBxdWFsaXR5IHN0YW5kYXJkcyBiZWZvcmUgYXBwcm92YWwKCiMjIFRST1VCTEVTSE9PVElORyBTVFVDSyBDSSBKT0JTCklmIENJIGpvYnMgd29uJ3Qgc3RhcnQgKHNob3dpbmcgXCJXYWl0aW5nXCIgb3IgXCJQZW5kaW5nXCIgaW5kZWZpbml0ZWx5KToKMS4gKipDaGVjayBydW5uZXIgbGFiZWxzKio6IEVuc3VyZSAncnVucy1vbjonIHVzZXMgdmFsaWQgcnVubmVycwogICAtIENvbW1vbjogdWJ1bnR1LWxhdGVzdCwgdWJ1bnR1LTIyLjA0LCB1YnVudHUtMjAuMDQKICAgLSBTZWxmLWhvc3RlZDogW3NlbGYtaG9zdGVkXSwgW2s4cy1ydW5uZXJdCjIuICoqVmFsaWRhdGUgd29ya2Zsb3cgc3ludGF4Kio6IFJ1biBsb2NhbGx5IG9yIGNoZWNrIEdpdEh1YiBVSSBmb3IgZXJyb3JzCjMuICoqQ2hlY2sgd29ya2Zsb3cgdHJpZ2dlcnMqKjogRW5zdXJlICdvbjonIHNlY3Rpb24gaW5jbHVkZXMgeW91ciBldmVudAo0LiAqKkZpeCBjb21tb24gaXNzdWVzKio6CiAgIC0gTWlzc2luZyBvciBtaXNzcGVsbGVkIGFjdGlvbiBuYW1lcwogICAtIEludmFsaWQgWUFNTCBzeW50YXggKHVzZSB5YW1sbGludCkKICAgLSBXb3JrZmxvdyBmaWxlIG5vdCBpbiAuZ2l0aHViL3dvcmtmbG93cy8KICAgLSBXb3JrZmxvdyBkaXNhYmxlZCBpbiByZXBvIHNldHRpbmdzCi0gVGhlIFBSIGNoZWNrcyBwYWdlIG9uIEdpdEh1YiBpcyB5b3VyIHNvdXJjZSBvZiB0cnV0aAoKQmVnaW4geW91ciBjb2RlIHF1YWxpdHkgcmV2aWV3IG5vdy4iCgojIERlYnVnOiBQcmludCB0aGUgYWN0dWFsIHByb21wdCBhbmQgQ0xBVURFLm1kIGNvbnRlbnQKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SNIERFQlVHOiBDTEVPIFBST01QVCBDT05URU5UIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIiRDTEVPX1BST01QVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SNIERFQlVHOiBDTEFVREUubWQgTUVNT1JZIENPTlRFTlQiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIF07IHRoZW4KICAgIGNhdCAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCmVsc2UKICAgIGVjaG8gIuKdjCBObyBDTEFVREUubWQgZm91bmQgYXQgJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgQ29tcG9zZSBpbml0aWFsIHVzZXIgdHVybiB3aXRoIHRoZSBzdGF0aWMgcHJvbXB0ClVTRVJfQ09NQklORUQ9JChwcmludGYgIiVzIiAiJENMRU9fUFJPTVBUIiB8IGpxIC1ScyAuKQoKIyBTdGFydCBDbGF1ZGUgd2l0aCBwcm9tcHQgcGlwZWQgZGlyZWN0bHkgdG8gc3RkaW4gKG5vIHNpZGVjYXIsIG5vIEZJRk8pCnByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fVxuJyAiJFVTRVJfQ09NQklORUQiIHwgJENMQVVERV9DTUQgJgpDTEFVREVfUElEPSQhCmVjaG8gIuKckyBTdGFydGVkIENsYXVkZSB3aXRoIENsZW8gcHJvbXB0IChQSUQ6ICRDTEFVREVfUElEKSIKCiMgU3RhcnQgYmFja2dyb3VuZCB0b2tlbiByZWZyZXNoIGZvciBsb25nLXJ1bm5pbmcgam9icwooCiAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgIHNsZWVwIDI3MDAgICMgQ2hlY2sgZXZlcnkgNDUgbWludXRlcwoKICAgICAgICBpZiBbIC1uICIkVE9LRU5fR0VORVJBVEVEX0FUIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdOyB0aGVuCiAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMjcwMCBdOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBkb25lCikgJgpUT0tFTl9SRUZSRVNIX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggKFBJRDogJFRPS0VOX1JFRlJFU0hfUElEKSIKCiMgV2FpdCBmb3IgQ2xhdWRlIHByb2Nlc3MgdG8gY29tcGxldGUKd2FpdCAiJENMQVVERV9QSUQiCkNMQVVERV9FWElUX0NPREU9JD8KCiMgU3RvcCB0b2tlbiByZWZyZXNoIGJhY2tncm91bmQgcHJvY2VzcwppZiBbIC1uICIkVE9LRU5fUkVGUkVTSF9QSUQiIF07IHRoZW4KICAgIGtpbGwgJFRPS0VOX1JFRlJFU0hfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBTdG9wcGVkIHRva2VuIHJlZnJlc2ggcHJvY2VzcyIKZmkKCiMgQWx3YXlzIGF0dGVtcHQgdG8gY29tcGxldGUgcXVhbGl0eSByZXZpZXcgLSBkb24ndCBleGl0IG9uIENsYXVkZSBmYWlsdXJlcwplY2hvICLwn5SEIFByb2Nlc3NpbmcgcXVhbGl0eSByZXZpZXcgcmVzdWx0cy4uLiIKaWYgWyAkQ0xBVURFX0VYSVRfQ09ERSAtZXEgMCBdOyB0aGVuCiAgZWNobyAi4pyFIENsYXVkZSBxdWFsaXR5IHJldmlldyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgpmaQoKIyBBbHdheXMgYXR0ZW1wdCB0byBwb3N0IFBSIGNvbW1lbnQgYW5kIGFkZCBsYWJlbCByZWdhcmRsZXNzIG9mIENsYXVkZSBleGl0IHN0YXR1cwojIERldGVybWluZSBPV05FUi9SRVBPIHNsdWcgZm9yIGdoIC1SClJFUE9fSU5QVVQ9Int7cmVwb3NpdG9yeV91cmx9fSIKaWYgZWNobyAiJFJFUE9fSU5QVVQiIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgUkVQT19TTFVHPSQoZWNobyAiJFJFUE9fSU5QVVQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSsvW14vLl0rKShcLmdpdCk/JHxcMXwnKQplbHNlCiAgUkVQT19TTFVHPSIkUkVQT19JTlBVVCIKZmkKCiMgUG9zdCBxdWFsaXR5IHJldmlldyBjb21tZW50IHRvIFBSCmlmIFsgLW4gIiRQUl9OVU1CRVIiIF0gfHwgWyAtbiAiJFBSX1VSTCIgXTsgdGhlbgogIGVjaG8gIvCfkqwgUG9zdGluZyBxdWFsaXR5IHJldmlldyBjb21tZW50IHRvIFBSLi4uIgoKICAjIENyZWF0ZSBjb21tZW50IGJvZHkgYmFzZWQgb24gQ2xhdWRlIGV4aXQgc3RhdHVzCiAgaWYgWyAkQ0xBVURFX0VYSVRfQ09ERSAtZXEgMCBdOyB0aGVuCiAgICBDT01NRU5UX0JPRFk9IiMjIPCflI0gQ29kZSBRdWFsaXR5IFJldmlldyBieSBDbGVvCgrinIUgKipRdWFsaXR5IGNoZWNrcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KioKCiMjIyBSZXZpZXcgU3VtbWFyeQotIENvZGUgaGFzIGJlZW4gcmV2aWV3ZWQgZm9yIHF1YWxpdHkgc3RhbmRhcmRzCi0gQWxsIHJlcXVpcmVkIGNoZWNrcyBoYXZlIHBhc3NlZAotIFJlYWR5IGZvciBRQSB0ZXN0aW5nCgotLS0KKlJldmlld2VkIGJ5IENsZW8gLSA1RExhYnMgQ29kZSBRdWFsaXR5IEFnZW50KiIKICBlbHNlCiAgICBDT01NRU5UX0JPRFk9IiMjIPCflI0gQ29kZSBRdWFsaXR5IFJldmlldyBieSBDbGVvCgrimqDvuI8gKipRdWFsaXR5IHJldmlldyBlbmNvdW50ZXJlZCBpc3N1ZXMqKgoKIyMjIEN1cnJlbnQgU3RhdHVzCi0gUXVhbGl0eSBjaGVja3MgYXJlIGJlaW5nIHByb2Nlc3NlZAotIFNvbWUgaXNzdWVzIG1heSBuZWVkIHRvIGJlIHJlc29sdmVkCi0gUmV2aWV3IHdpbGwgY29udGludWUgdW50aWwgc3RhbmRhcmRzIGFyZSBtZXQKCiMjIyBOZXh0IFN0ZXBzCi0gTW9uaXRvciBDSS9DRCBwaXBlbGluZSBzdGF0dXMKLSBBZGRyZXNzIGFueSBmYWlsaW5nIHF1YWxpdHkgY2hlY2tzCi0gSXRlcmF0ZSB1bnRpbCBhbGwgc3RhbmRhcmRzIGFyZSBtZXQKCi0tLQoqUmV2aWV3ZWQgYnkgQ2xlbyAtIDVETGFicyBDb2RlIFF1YWxpdHkgQWdlbnQqIgogIGZpCgogICMgUG9zdCBjb21tZW50IHVzaW5nIFBSIG51bWJlciBvciBVUkwKICBpZiBbIC1uICIkUFJfTlVNQkVSIiBdOyB0aGVuCiAgICBpZiBlY2hvICIkQ09NTUVOVF9CT0RZIiB8IGdoIHByIGNvbW1lbnQgIiRQUl9OVU1CRVIiIC1SICIkUkVQT19TTFVHIiAtLWJvZHktZmlsZSAtIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgcG9zdGVkIHF1YWxpdHkgcmV2aWV3IGNvbW1lbnQiCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gcG9zdCBjb21tZW50IHVzaW5nIFBSIG51bWJlciIKICAgIGZpCiAgZWxpZiBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgICBpZiBlY2hvICIkQ09NTUVOVF9CT0RZIiB8IGdoIHByIGNvbW1lbnQgIiRQUl9VUkwiIC0tYm9keS1maWxlIC0gMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBwb3N0ZWQgcXVhbGl0eSByZXZpZXcgY29tbWVudCIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwb3N0IGNvbW1lbnQiCiAgICBmaQogIGZpCmZpCgojIFVwZGF0ZSByZW1lZGlhdGlvbiBzdGF0dXMgbGFiZWxzIGZvciBDbGVvJ3Mgb3V0Y29tZQppZiBbIC1uICIkUFJfTlVNQkVSIiBdIHx8IFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICBlbnN1cmVfc3RhdHVzX2xhYmVscyAiJFJFUE9fU0xVRyIgXAogICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTfTpkNzNhNGE6UmVtZWRpYXRpb24gcmVxdWVzdGVkIGJ5IFRlc3MiIFwKICAgICIke1NUQVRVU19MQUJFTF9GSVhJTkd9OmZiY2EwNDpSZXggaXMgYWN0aXZlbHkgYXBwbHlpbmcgZml4ZXMiIFwKICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19DTEVPfTowZThhMTY6QXdhaXRpbmcgQ2xlbyBxdWFsaXR5IHJldmlldyIgXAogICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX1RFU1N9OjUzMTllNzpBd2FpdGluZyBUZXNzIFFBIHJldmlldyIgXAogICAgIiR7U1RBVFVTX0xBQkVMX0FQUFJPVkVEfToyZGE0NGU6QWxsIGF1dG9tYXRlZCByZXZpZXdzIGFwcHJvdmVkIiBcCiAgICAiJHtTVEFUVVNfTEFCRUxfRkFJTEVEfTpiNjAyMDU6UmVtZWRpYXRpb24gZmFpbGVkIG9yIGFib3J0ZWQiCgogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIENsZW8gcXVhbGl0eSBjaGVja3MgcGFzc2VkIC0gaGFuZGluZyBvZmYgdG8gVGVzcyBmb3IgRTJFIHRlc3RpbmciCiAgICAKICAgICMgUG9zdCBDT01NRU5UIChOT1QgQVBQUk9WRSkgLSBUZXNzIGhhcyBmaW5hbCBhcHByb3ZhbCBhdXRob3JpdHkKICAgIHRpbWVvdXQgMzAgZ2ggcHIgY29tbWVudCAiJFBSX05VTUJFUiIgLS1ib2R5ICIjIyMg4pyFIENvZGUgUXVhbGl0eSBSZXZpZXcgLSBQQVNTRUQKCkFsbCBxdWFsaXR5IGNoZWNrcyBoYXZlIHBhc3NlZDoKLSBDb2RlIGZvcm1hdHRpbmcgdmVyaWZpZWQKLSBMaW50aW5nIHBhc3NlZAotIFVuaXQgdGVzdHMgc3VjY2Vzc2Z1bAotIFF1YWxpdHkgc3RhbmRhcmRzIG1ldAoKKipTdGF0dXM6KiogUmVhZHkgZm9yIGVuZC10by1lbmQgdGVzdGluZyBieSBUZXNzCioqTmV4dCBTdGVwOioqIFRlc3Mgd2lsbCBub3cgcGVyZm9ybSBjb21wcmVoZW5zaXZlIFFBIHZhbGlkYXRpb24KCi0tLQoqUXVhbGl0eSByZXZpZXcgYnkgQ2xlbyAtIDVETGFicyBDb2RlIFF1YWxpdHkgQWdlbnQqIiB8fCBlY2hvICLimqDvuI8gUFIgY29tbWVudCBjb21tYW5kIGZhaWxlZCIKICAgIAogICAgIyBBZGQgcmVhZHktZm9yLXFhIGxhYmVsIHRvIHNpZ25hbCBUZXNzCiAgICBlY2hvICLwn4+377iPICBBZGRpbmcgJ3JlYWR5LWZvci1xYScgbGFiZWwgdG8gdHJpZ2dlciBUZXNzIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLS1hZGQtbGFiZWwgInJlYWR5LWZvci1xYSIgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgcmVhZHktZm9yLXFhIGxhYmVsIgogICAgCiAgICB1cGRhdGVfY29kZXJ1bl9zdGF0dXMgInJlYWR5LWZvci1xYSIgInF1YWxpdHktcGFzc2VkIiAiJFBSX1VSTCIKICBlbHNlCiAgICBlY2hvICLinYwgUXVhbGl0eSBpc3N1ZXMgZGV0ZWN0ZWQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTUJFUiIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgpDb2RlIHF1YWxpdHkgaXNzdWVzIGRldGVjdGVkLiBQbGVhc2UgYWRkcmVzcyB0aGUgZm9sbG93aW5nOgotIFJldmlldyBjb2RlIGZvcm1hdHRpbmcKLSBGaXggbGludGluZyBlcnJvcnMKLSBFbnN1cmUgdW5pdCB0ZXN0cyBwYXNzCi0gTWVldCBxdWFsaXR5IHN0YW5kYXJkcwoKUmV4IHdpbGwgYWRkcmVzcyB0aGVzZSBpc3N1ZXMgYW5kIHJlc3VibWl0IGZvciByZXZpZXcuCgotLS0KKlF1YWxpdHkgcmV2aWV3IGJ5IENsZW8gLSA1RExhYnMgQ29kZSBRdWFsaXR5IEFnZW50KiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIGZhaWxlZCIKICAgIHVwZGF0ZV9jb2RlcnVuX3N0YXR1cyAibmVlZHMtZml4ZXMiICJjaGFuZ2VzX3JlcXVlc3RlZCIgIiRQUl9VUkwiCiAgZmkKZWxzZQogIGVjaG8gIuKaoO+4jyBObyBQUiByZWZlcmVuY2UgYXZhaWxhYmxlLCBza2lwcGluZyByZW1lZGlhdGlvbiBsYWJlbCB1cGRhdGUiCiAgdXBkYXRlX2NvZGVydW5fc3RhdHVzICIkU1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTIiAiY2hhbmdlc19yZXF1ZXN0ZWQiICIiCmZpCgojIE5vIHNpZGVjYXIgc2h1dGRvd24gbmVlZGVkIC0gY29udGFpbmVyIHdpbGwgZXhpdCBuYXR1cmFsbHkgd2hlbiBtYWluIHByb2Nlc3MgY29tcGxldGVzCgogICMgQ2hlY2sgaWYgcXVhbGl0eSByZXZpZXcgd2FzIHN1Y2Nlc3NmdWwKICBpZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBBdHRlbXB0ICRBVFRFTVBUOiBRdWFsaXR5IGNoZWNrcyBwYXNzZWQiCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEF0dGVtcHQgJEFUVEVNUFQ6IFF1YWxpdHkgY2hlY2tzIGluY29tcGxldGUgKGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUpIgogICAgCiAgICBpZiBbICRBVFRFTVBUIC1sdCAkTUFYX1JFVFJJRVMgXTsgdGhlbgogICAgICBlY2hvICLwn5SEIFdpbGwgcmV0cnkuLi4gKCQoKE1BWF9SRVRSSUVTIC0gQVRURU1QVCkpIGF0dGVtcHRzIHJlbWFpbmluZykiCiAgICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgICBlY2hvICIiCiAgICAgICMgQnJpZWYgcGF1c2UgYmVmb3JlIHJldHJ5CiAgICAgIHNsZWVwIDIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgcmVhY2hlZCIKICAgICAgYnJlYWsKICAgIGZpCiAgZmkKZG9uZQoKIyBSZXBvcnQgZmluYWwgc3RhdHVzCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLinIUgQ0xFTyBRVUFMSVRZIFJFVklFVyBTVUNDRVNTRlVMIgogIGVjaG8gIiAgIENvbXBsZXRlZCBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgplbHNlCiAgZWNobyAi4pqg77iPIENMRU8gUVVBTElUWSBSRVZJRVcgSU5DT01QTEVURSIKICBlY2hvICIgICBBdHRlbXB0ZWQgJEFUVEVNUFQgdGltZShzKSIKICBlY2hvICIgICBRdWFsaXR5IHN0YW5kYXJkcyBub3QgeWV0IG1ldCIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDbGVhbnVwIGFuZCBleGl0CmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgQ0xFTyBDT0RFIFFVQUxJVFkgQ09NUExFVEUgICAgICAgICAgICAgICAgICDilZEiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TiyBUYXNrOiB7e3Rhc2tfaWR9fSIKZWNobyAi4pyFIENvZGUgcXVhbGl0eSBjaGVja3MgY29tcGxldGVkIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIEZpbmFsIHRlcm1pbmF0aW9uIHNlcXVlbmNlCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UmiBURVJNSU5BVElORyBDTEVPIENPTlRBSU5FUiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDbGF1ZGUgRXhpdCBDb2RlOiAkQ0xBVURFX0VYSVRfQ09ERSIKZWNobyAiQ29udGFpbmVyIFBJRDogJCQiCmVjaG8gIkZpbmFsIFByb2Nlc3MgQ2hlY2s6IgpwcyBhdXggfCBoZWFkIC01CgojIFdyaXRlIGNvbXBsZXRpb24gbWFya2VyIGZvciB3b3JrZmxvdyB0cmFja2luZwplY2hvICJjbGVvLXF1YWxpdHktY29tcGxldGVkOiQoZGF0ZSAtdSArJVktJW0tJWRUJUg6JU06JVNaKSIgPiAvd29ya3NwYWNlLy5jbGVvLWNvbXBsZXRlCgojIENsZWFudXAgRklGTwpybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQoKIyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiBzdWNjZXNzCmlmIFsgJFNVQ0NFU1MgLWVxIDEgXTsgdGhlbgogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggc3VjY2VzcyBzdGF0dXMuLi4iCiAgZXhpdCAwCmVsc2UKICBlY2hvICLwn5SaIFRlcm1pbmF0aW5nIGNvbnRhaW5lciB3aXRoIGZhaWx1cmUgc3RhdHVzLi4uIgogIGVjaG8gIvCfk50gUXVhbGl0eSBjaGVja3MgaW5jb21wbGV0ZSBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgogIGV4aXQgMQpmaQo= code_claude_container-rex-remediation.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICDwn5SnIFJFWCBSRU1FRElBVElPTiBXT1JLRkxPVyBTVEFSVElORyAgICAgICAgICAgICDilZEnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgIFJlbWVkaWF0aW9uIEFnZW50IEFjdGl2ZSAgICAgICAgICAgICAgICAgICAgICDilZEnCmVjaG8gJ+KVkSAgICAgICAgICAgIOKaoO+4jyAgRklYSU5HIEZFRURCQUNLIC0gTk8gTkVXIElNUExFTUVOVEFUSU9OIOKaoO+4jyAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICLwn46vIEFnZW50OiB7e2dpdGh1Yl9hcHB9fSIKZWNobyAi8J+UpyBNb2RlOiBSZW1lZGlhdGlvbiAtIEZpeCBPbmx5IgplY2hvICLwn5OLIFRhc2sgSUQ6IHt7dGFza19pZH19IgplY2hvICLwn5qoIENSSVRJQ0FMOiBPTkxZIGZpeCB0aGUgaXNzdWVzIGlkZW50aWZpZWQgaW4gZmVlZGJhY2siCgojIERpc2FibGUgaW50ZXJhY3RpdmUgR2l0IHByb21wdHMgZ2xvYmFsbHkKZXhwb3J0IEdJVF9URVJNSU5BTF9QUk9NUFQ9MApleHBvcnQgR0lUX0FTS1BBU1M9L2Jpbi90cnVlCmV4cG9ydCBTU0hfQVNLUEFTUz0vYmluL3RydWUKCiMgUmVwb3NpdG9yeSBVUkwKUkVQT19VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKCiMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiBpcyBjb25maWd1cmVkIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKZWNobyAiVXNpbmcgR2l0SHViIEFwcCBhdXRoZW50aWNhdGlvbiIKCiMgQXV0aGVudGljYXRlIHdpdGggR2l0SHViIEFwcAppZiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9JRCIgXTsgdGhlbgogICAgZWNobyAiQXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgQXBwLi4uIgoKICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBwcml2YXRlIGtleSBmaWxlIChzdXBwb3J0IGVzY2FwZWQgbmV3bGluZXMpCiAgICBURU1QX0tFWV9GSUxFPSIvdG1wL2dpdGh1Yi1hcHAta2V5LnBlbSIKICAgIHByaW50ZiAnJWInICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICBjaG1vZCA2MDAgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgR2VuZXJhdGUgSldUIHRva2VuIGZvciBHaXRIdWIgQXBwIChmaXhlZCBKV1QgZ2VuZXJhdGlvbiBmb3IgTGludXggY29udGFpbmVycykKICAgICMgSldUIGhlYWRlcgogICAgSldUX0hFQURFUj0kKHByaW50ZiAneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9JyB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQoKICAgICMgSldUIHBheWxvYWQgd2l0aCBjdXJyZW50IHRpbWUgYW5kIGV4cGlyYXRpb24gKDEwIG1pbnV0ZXMpCiAgICBOT1c9JChkYXRlICslcykKICAgIEVYUD0kKChOT1cgKyA2MDApKQogICAgSldUX1BBWUxPQUQ9JChwcmludGYgJ3siaWF0IjolZCwiZXhwIjolZCwiaXNzIjoiJXMifScgIiROT1ciICIkRVhQIiAiJEdJVEhVQl9BUFBfSUQiIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBTaWduIHRoZSBKV1QKICAgIEpXVF9TSUdOQVRVUkU9JChwcmludGYgJyVzLiVzJyAiJEpXVF9IRUFERVIiICIkSldUX1BBWUxPQUQiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLXNpZ24gIiRURU1QX0tFWV9GSUxFIiAtYmluYXJ5IHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCiAgICBKV1RfVE9LRU49IiRKV1RfSEVBREVSLiRKV1RfUEFZTE9BRC4kSldUX1NJR05BVFVSRSIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gSUQgZm9yIHRoZSByZXBvc2l0b3J5IChyb2J1c3QgcGFyc2luZyBvZiBvd25lci9yZXBvKQogICAgSU5QVVRfUkVQTz0ie3tyZXBvc2l0b3J5X3VybH19IgogICAgUkVQT19PV05FUj0iIgogICAgUkVQT19OQU1FPSIiCgogICAgaWYgZWNobyAiJElOUFVUX1JFUE8iIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykvLip8XDF8JykKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tL1teL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmdpdEBnaXRodWIuY29tOic7IHRoZW4KICAgICAgICAjIFNTSCBmb3JtYXQgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwbyguZ2l0KQogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsc2UKICAgICAgICAjIEZhbGxiYWNrOiBhc3N1bWUgc2x1ZyBvd25lci9yZXBvIChwb3NzaWJseSB3aXRoIC5naXQpCiAgICAgICAgU0xVRz0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xcLmdpdCR8fCcpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRTTFVHIiB8IGN1dCAtZCcvJyAtZjEpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMikKICAgIGZpCgogICAgZWNobyAiREVCVUc6IFBhcnNlZCByZXBvc2l0b3J5IC0gT3duZXI6ICckUkVQT19PV05FUicsIE5hbWU6ICckUkVQT19OQU1FJyIKCiAgICBlY2hvICJHZXR0aW5nIGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRS4uLiIKCiAgICAjIEdldCB0aGUgaW5zdGFsbGF0aW9uIElEIChyZXRyeSBhbmQgZm9sbG93IHJlZGlyZWN0cykuIEZhbGxiYWNrIHRvIG9yZyBpbnN0YWxsYXRpb24uCiAgICBJTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgLS1jb25uZWN0LXRpbWVvdXQgNSAtLW1heC10aW1lIDEyIFwKICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8kUkVQT19PV05FUi8kUkVQT19OQU1FL2luc3RhbGxhdGlvbiIpCgogICAgSU5TVEFMTEFUSU9OX0lEPSQoZWNobyAiJElOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gUmVwbyBpbnN0YWxsYXRpb24gbm90IGZvdW5kLCB0cnlpbmcgb3JnIGluc3RhbGxhdGlvbi4uLiIKICAgICAgICBPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFPSQoY3VybCAtcyAtTCAtLXJldHJ5IDUgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktY29ubnJlZnVzZWQgXAogICAgICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL29yZ3MvJFJFUE9fT1dORVIvaW5zdGFsbGF0aW9uIikKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkT1JHX0lOU1RBTExBVElPTl9SRVNQT05TRSIgfCBqcSAtciAnLmlkJykKICAgIGZpCgogICAgaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FIgogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBnZXQgaW5zdGFsbGF0aW9uIGFjY2VzcyB0b2tlbiIKICAgICAgICBlY2hvICJSZXNwb25zZTogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgIyBDbGVhbiB1cCB0ZW1wb3Jhcnkga2V5IGZpbGUKICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEV4cG9ydCB0aGUgdG9rZW4gZm9yIGdpdCB0byB1c2UKICAgIGV4cG9ydCBHSVRIVUJfVE9LRU4KCiAgICAjIENvbmZpZ3VyZSBnaXQgdG8gdXNlIHRoZSB0b2tlbiAodXNlIC0tcmVwbGFjZS1hbGwgdG8gaGFuZGxlIG11bHRpcGxlIGV4aXN0aW5nIGhlbHBlcnMpCiAgICBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgc3RvcmUKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCgogICAgIyBBbHNvIGF1dGhlbnRpY2F0ZSBnaCBDTEkgd2l0aCB0aGUgdG9rZW4KICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4KCiAgICBlY2hvICLinJMgR2l0SHViIEFwcCBhdXRoZW50aWNhdGVkIHN1Y2Nlc3NmdWxseSIKCmVsc2UKICAgIGVjaG8gIuKdjCBHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIG9yIEdJVEhVQl9BUFBfSUQgbm90IGZvdW5kIgogICAgZXhpdCAxCmZpCgojIEdpdCBjb25maWd1cmF0aW9uIHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvd29ya3NwYWNlCgojIFNldCBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uIC0gdXNlIGdlbmVyaWMgZm9ybWF0IGZvciBhbGwgYWdlbnRzCmRlcml2ZV9ib3RfaWRlbnRpdHkoKSB7CiAgICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogICAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dG9tYXRpb25bYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgcmV0dXJuCiAgICBmaQoKICAgIGxvY2FsIHNsdWcKICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICAgIGlmIFsgLXogIiRzbHVnIiBdOyB0aGVuCiAgICAgICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgICBmaQoKICAgIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogICAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICAgIGlmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICAgICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgICAgIGxvY2FsIGJvdF9yZXNwb25zZQogICAgICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgICAgbG9jYWwgYm90X2lkCiAgICAgICAgYm90X2lkPSQocHJpbnRmICclcycgIiRib3RfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyBlbXB0eScgMj4vZGV2L251bGwgfHwgZWNobyAnJykKICAgICAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgICAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgZmkKICAgIGZpCgogICAgR0lUX0FVVEhPUl9OQU1FPSIkYm90X2xvZ2luIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKIyBDb25maWd1cmUgZ2l0IHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCgojIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsYXVkZSBDb2RlIHRvIHVzZQpleHBvcnQgR0lUX0FVVEhPUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX05BTUU9IiRHSVRfQVVUSE9SX05BTUUiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX0VNQUlMPSIkR0lUX0FVVEhPUl9FTUFJTCIKZWNobyAi4pyTIEdpdCBjb25maWd1cmVkIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFTUVESUFUSU9OIE1PREUgVkFMSURBVElPTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIFZhbGlkYXRlIHJlbWVkaWF0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlcwplY2hvICIiCmVjaG8gIvCflKcgUkVNRURJQVRJT04gTU9ERSBWQUxJREFUSU9OIgoKaWYgWyAteiAiJHtGRUVEQkFDS19DT01NRU5UX0lEOi19IiBdOyB0aGVuCiAgICBlY2hvICLinYwgRVJST1I6IEZFRURCQUNLX0NPTU1FTlRfSUQgaXMgcmVxdWlyZWQgaW4gcmVtZWRpYXRpb24gbW9kZSIKICAgIGV4aXQgMQpmaQoKaWYgWyAteiAiJHtJVEVSQVRJT05fQ09VTlQ6LX0iIF07IHRoZW4KICAgIGVjaG8gIuKdjCBFUlJPUjogSVRFUkFUSU9OX0NPVU5UIGlzIHJlcXVpcmVkIGluIHJlbWVkaWF0aW9uIG1vZGUiCiAgICBleGl0IDEKZmkKCmVjaG8gIvCflKcgUmVtZWRpYXRpb24gTW9kZSBDb25maWd1cmF0aW9uOiIKZWNobyAiICAgVGFzayBJRDogJHtUQVNLX0lEOi0iTm90IHNwZWNpZmllZCJ9IgplY2hvICIgICBQUiBOdW1iZXI6ICR7UFJfTlVNQkVSOi0iTm90IHNwZWNpZmllZCJ9IgplY2hvICIgICBGZWVkYmFjayBDb21tZW50IElEOiAke0ZFRURCQUNLX0NPTU1FTlRfSUR9IgplY2hvICIgICBJdGVyYXRpb246ICR7SVRFUkFUSU9OX0NPVU5UfSIKZWNobyAiICAgRmVlZGJhY2sgQXV0aG9yOiAke0ZFRURCQUNLX0FVVEhPUjotIlVua25vd24ifSIKCiMgQ2hlY2sgaXRlcmF0aW9uIGxpbWl0cwpNQVhfSVRFUkFUSU9OUz0xMAppZiBbICIke0lURVJBVElPTl9DT1VOVH0iIC1ndCAiJHtNQVhfSVRFUkFUSU9OU30iIF07IHRoZW4KICAgIGVjaG8gIuKdjCBFUlJPUjogTWF4aW11bSBpdGVyYXRpb25zICgke01BWF9JVEVSQVRJT05TfSkgZXhjZWVkZWQgKGN1cnJlbnQ6ICR7SVRFUkFUSU9OX0NPVU5UfSkiCiAgICBlY2hvICLwn5qoIFRyaWdnZXJpbmcgZXNjYWxhdGlvbi4uLiIKCiAgICAjIFBvc3QgZXNjYWxhdGlvbiBjb21tZW50CiAgICBFU0NBTEFUSU9OX0JPRFk9JChjYXQgPDxFT0YKIyMg8J+aqCBSZW1lZGlhdGlvbiBFc2NhbGF0aW9uIFJlcXVpcmVkCgoqKkl0ZXJhdGlvbiBMaW1pdCBSZWFjaGVkKio6ICR7SVRFUkFUSU9OX0NPVU5UfS8xMAoKVGhlIGF1dG9tYXRlZCByZW1lZGlhdGlvbiBwcm9jZXNzIGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIGl0ZXJhdGlvbiBsaW1pdCBhbmQgcmVxdWlyZXMgaHVtYW4gaW50ZXJ2ZW50aW9uLgoKIyMjIE5leHQgU3RlcHM6CjEuICoqUmV2aWV3IHRoZSBmZWVkYmFjayBoaXN0b3J5KiogaW4gdGhpcyBQUiBmb3IgYWxsIGF0dGVtcHRlZCBmaXhlcwoyLiAqKk1hbnVhbGx5IGFkZHJlc3MqKiB0aGUgcmVtYWluaW5nIGlzc3VlcyBpZGVudGlmaWVkIGluIHRoZSBmZWVkYmFjawozLiAqKkNvbnNpZGVyKiogaWYgdGhlIG9yaWdpbmFsIHJlcXVpcmVtZW50cyBuZWVkIGNsYXJpZmljYXRpb24gb3IgYWRqdXN0bWVudAo0LiAqKk1lcmdlIG9yIGNsb3NlKiogdGhpcyBQUiBiYXNlZCBvbiB0aGUgcmVtZWRpYXRpb24gb3V0Y29tZQoKIyMjIENvbnRleHQ6Ci0gKipUYXNrIElEKio6ICR7VEFTS19JRDotIlVua25vd24ifQotICoqUFIqKjogIyR7UFJfTlVNQkVSOi0iVW5rbm93biJ9Ci0gKipMYXN0IEF0dGVtcHQqKjogSXRlcmF0aW9uICR7SVRFUkFUSU9OX0NPVU5UfQotICoqRmVlZGJhY2sgU291cmNlKio6IENvbW1lbnQgSUQgJHtGRUVEQkFDS19DT01NRU5UX0lEfQoKQHBsYXRmb3JtLXRlYW0gQGN0byAtIE1hbnVhbCBpbnRlcnZlbnRpb24gcmVxdWlyZWQgZm9yIHRoaXMgcmVtZWRpYXRpb24uCgotLS0KKlBvc3RlZCBieSBSZXggUmVtZWRpYXRpb24gQWdlbnQqCkVPRgogICAgKQoKICAgIGlmIFsgLW4gIiR7UFJfTlVNQkVSOi19IiBdICYmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICAgICAgaWYgZ2ggcHIgY29tbWVudCAiJHtQUl9OVU1CRVJ9IiAtLWJvZHkgIiR7RVNDQUxBVElPTl9CT0RZfSIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZWNobyAi4pyFIEVzY2FsYXRpb24gY29tbWVudCBwb3N0ZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwb3N0IGVzY2FsYXRpb24gY29tbWVudCIKICAgICAgICBmaQogICAgZmkKCiAgICBleGl0IDEKZmkKCmlmIFsgIiR7SVRFUkFUSU9OX0NPVU5UfSIgLWVxICIke01BWF9JVEVSQVRJT05TfSIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIFdBUk5JTkc6IEZpbmFsIGl0ZXJhdGlvbiAoJHtJVEVSQVRJT05fQ09VTlR9LyR7TUFYX0lURVJBVElPTlN9KSAtIHRoaXMgaXMgdGhlIGxhc3QgYXR0ZW1wdCIKZmkKCmVjaG8gIuKchSBJdGVyYXRpb24gY2hlY2sgcGFzc2VkOiAke0lURVJBVElPTl9DT1VOVH0vJHtNQVhfSVRFUkFUSU9OU30iCgojIEZldGNoIGZlZWRiYWNrIGNvbW1lbnQKZWNobyAiIgplY2hvICLwn5OlIEZldGNoaW5nIGZlZWRiYWNrIGNvbW1lbnQgJHtGRUVEQkFDS19DT01NRU5UX0lEfS4uLiIKTUFYX1JFVFJJRVM9MwpSRVRSWV9DT1VOVD0wCkZFRURCQUNLX0NPTU1FTlQ9IiIKCndoaWxlIFsgJFJFVFJZX0NPVU5UIC1sdCAkTUFYX1JFVFJJRVMgXTsgZG8KICAgIGlmIEZFRURCQUNLX0NPTU1FTlQ9JChnaCBhcGkgIi9yZXBvcy97e3JlcG9zaXRvcnlfdXJsfX0vaXNzdWVzL2NvbW1lbnRzLyR7RkVFREJBQ0tfQ09NTUVOVF9JRH0iIC0tanEgJy5ib2R5JyAyPi9kZXYvbnVsbCk7IHRoZW4KICAgICAgICBlY2hvICLinIUgRmVlZGJhY2sgY29tbWVudCBmZXRjaGVkIHN1Y2Nlc3NmdWxseSAoJHsjRkVFREJBQ0tfQ09NTUVOVH0gY2hhcmFjdGVycykiCiAgICAgICAgYnJlYWsKICAgIGVsc2UKICAgICAgICBSRVRSWV9DT1VOVD0kKChSRVRSWV9DT1VOVCArIDEpKQogICAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gZmV0Y2ggY29tbWVudCAoYXR0ZW1wdCAke1JFVFJZX0NPVU5UfS8ke01BWF9SRVRSSUVTfSkiCgogICAgICAgIGlmIFsgJFJFVFJZX0NPVU5UIC1sdCAkTUFYX1JFVFJJRVMgXTsgdGhlbgogICAgICAgICAgICBzbGVlcCAkKCgyICoqIFJFVFJZX0NPVU5UKSkgICMgRXhwb25lbnRpYWwgYmFja29mZgogICAgICAgIGZpCiAgICBmaQpkb25lCgppZiBbIC16ICIke0ZFRURCQUNLX0NPTU1FTlR9IiBdOyB0aGVuCiAgICBlY2hvICLinYwgRmFpbGVkIHRvIGZldGNoIGZlZWRiYWNrIGNvbW1lbnQgYWZ0ZXIgJHtNQVhfUkVUUklFU30gYXR0ZW1wdHMiCiAgICBlY2hvICJDYW5ub3QgcHJvY2VlZCB3aXRoIHJlbWVkaWF0aW9uIHdpdGhvdXQgZmVlZGJhY2sgY29udGV4dCIKICAgIGV4aXQgMQpmaQoKIyBQYXJzZSBmZWVkYmFjayBtZXRhZGF0YQplY2hvICIiCmVjaG8gIvCflI0gUGFyc2luZyBmZWVkYmFjayBtZXRhZGF0YS4uLiIKU0VWRVJJVFk9Im1lZGl1bSIKSVNTVUVfVFlQRVM9IiIKCmlmIGVjaG8gIiR7RkVFREJBQ0tfQ09NTUVOVH0iIHwgZ3JlcCAtcSAi8J+UtCI7IHRoZW4KICAgIFNFVkVSSVRZPSJjcml0aWNhbCIKZWxpZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXEgIvCfn6EiOyB0aGVuCiAgICBTRVZFUklUWT0iaGlnaCIKZWxpZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXEgIvCfn6IiOyB0aGVuCiAgICBTRVZFUklUWT0ibG93IgpmaQoKaWYgZWNobyAiJHtGRUVEQkFDS19DT01NRU5UfSIgfCBncmVwIC1xaSAic2VjdXJpdHlcfHZ1bG5lcmFiaWxpdHlcfGV4cGxvaXQiOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31zZWN1cml0eSwiCmZpCmlmIGVjaG8gIiR7RkVFREJBQ0tfQ09NTUVOVH0iIHwgZ3JlcCAtcWkgInBlcmZvcm1hbmNlXHxzbG93XHxvcHRpbWl6YXRpb24iOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31wZXJmb3JtYW5jZSwiCmZpCmlmIGVjaG8gIiR7RkVFREJBQ0tfQ09NTUVOVH0iIHwgZ3JlcCAtcWkgImJ1Z1x8ZXJyb3JcfGV4Y2VwdGlvblx8Y3Jhc2giOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31idWcsIgpmaQppZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXFpICJ0ZXN0XHx0ZXN0aW5nXHxjb3ZlcmFnZSI7IHRoZW4KICAgIElTU1VFX1RZUEVTPSIke0lTU1VFX1RZUEVTfXRlc3RpbmcsIgpmaQppZiBlY2hvICIke0ZFRURCQUNLX0NPTU1FTlR9IiB8IGdyZXAgLXFpICJkb2N1bWVudGF0aW9uXHxkb2NzXHxyZWFkbWUiOyB0aGVuCiAgICBJU1NVRV9UWVBFUz0iJHtJU1NVRV9UWVBFU31kb2N1bWVudGF0aW9uLCIKZmkKCklTU1VFX1RZUEVTPSIke0lTU1VFX1RZUEVTJSx9IgppZiBbIC16ICIke0lTU1VFX1RZUEVTfSIgXTsgdGhlbgogICAgSVNTVUVfVFlQRVM9ImdlbmVyYWwiCmZpCgplY2hvICLwn5OKIERldGVjdGVkIHNldmVyaXR5OiAke1NFVkVSSVRZfSIKZWNobyAi8J+Pt++4jyBEZXRlY3RlZCBpc3N1ZSB0eXBlczogJHtJU1NVRV9UWVBFU30iCgojIEZldGNoIG9yaWdpbmFsIHRhc2sgY29udGV4dCBmb3IgcmVmZXJlbmNlIChub3QgYXMgbWFpbiBwcm9tcHQpCmVjaG8gIiIKZWNobyAi8J+TiyBGZXRjaGluZyBvcmlnaW5hbCB0YXNrIGNvbnRleHQuLi4iClRBU0tfQ09OVEVOVD0iIgoKVEFTS19GSUxFPSIvdG1wL2RvY3MtcmVwby97e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fS8udGFza21hc3Rlci9kb2NzL3Rhc2stJHtUQVNLX0lEfS90YXNrLm1kIgppZiBbIC1mICIke1RBU0tfRklMRX0iIF07IHRoZW4KICAgIFRBU0tfQ09OVEVOVD0kKGNhdCAiJHtUQVNLX0ZJTEV9IikKICAgIGVjaG8gIuKchSBGb3VuZCB0YXNrIGZpbGU6ICR7VEFTS19GSUxFfSIKZWxzZQogICAgZWNobyAi4pqg77iPIFRhc2sgZmlsZSBub3QgZm91bmQsIHVzaW5nIGRlZmF1bHQgY29udGV4dCIKICAgIFRBU0tfQ09OVEVOVD0iVGFzayAke1RBU0tfSUR9OiBJbXBsZW1lbnQgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgYW5kIHRlc3RpbmcuIgpmaQoKIyBDcmVhdGUgcmVtZWRpYXRpb24tc3BlY2lmaWMgQ0xBVURFLm1kCmVjaG8gIiIKZWNobyAi8J+TnSBQcmVwYXJpbmcgcmVtZWRpYXRpb24gY29udGV4dCBmb3IgQ2xhdWRlLi4uIgoKY2F0ID4gL3dvcmtzcGFjZS9DTEFVREUubWQgPDwgRU9GCiMg8J+UpyBSRU1FRElBVElPTiBNT0RFIC0gRml4IFJlcXVpcmVkIElzc3VlcwoKKipJdGVyYXRpb24gJHtJVEVSQVRJT05fQ09VTlR9LzEwKiogfCAqKlNldmVyaXR5OiAke1NFVkVSSVRZXl59KiogfCAqKlRhc2s6ICR7VEFTS19JRH0qKgoKWW91IGFyZSBvcGVyYXRpbmcgaW4gKipSRVggUkVNRURJQVRJT04gTU9ERSoqLiBZb3VyIG1pc3Npb24gaXMgdG8gZml4IHNwZWNpZmljIGlzc3VlcyBpZGVudGlmaWVkIGluIFFBIGZlZWRiYWNrIHdoaWxlIHByZXNlcnZpbmcgYWxsIHdvcmtpbmcgZnVuY3Rpb25hbGl0eS4gVGhpcyBpcyBOT1QgYSByZWltcGxlbWVudGF0aW9uIC0gZm9jdXMgb24gc3VyZ2ljYWwsIHRhcmdldGVkIGZpeGVzLgoKLS0tCgojIyDwn46vIE9SSUdJTkFMIFRBU0sgUkVRVUlSRU1FTlRTIChSZWZlcmVuY2UgT25seSkKCiR7VEFTS19DT05URU5UfQoKLS0tCgojIyDwn5qoIElTU1VFUyBUTyBGSVggKFByaW9yaXR5OiAke1NFVkVSSVRZXl59KQoKKipJc3N1ZSBDYXRlZ29yaWVzOioqICR7SVNTVUVfVFlQRVN9Cgoke0ZFRURCQUNLX0NPTU1FTlR9CgotLS0KCiMjIPCfk4sgUkVNRURJQVRJT04gSU5TVFJVQ1RJT05TCgojIyMgWW91ciBNaXNzaW9uOgoxLiAqKlBSRVNFUlZFKiogYWxsIHdvcmtpbmcgZnVuY3Rpb25hbGl0eSAtIGRvIE5PVCBicmVhayBhbnl0aGluZyB0aGF0IGN1cnJlbnRseSB3b3JrcwoyLiAqKkZJWCoqIG9ubHkgdGhlIHNwZWNpZmljIGlzc3VlcyBtZW50aW9uZWQgaW4gdGhlIGZlZWRiYWNrIGFib3ZlCjMuICoqRk9DVVMqKiBvbiBzdXJnaWNhbCBjaGFuZ2VzLCBub3QgYnJvYWQgcmVpbXBsZW1lbnRhdGlvbgo0LiAqKlZFUklGWSoqIGVhY2ggZml4IGFkZHJlc3NlcyB0aGUgZXhhY3QgcHJvYmxlbSBkZXNjcmliZWQKNS4gKipURVNUKiogdGhhdCB5b3VyIGNoYW5nZXMgc29sdmUgdGhlIGlzc3VlcyB3aXRob3V0IGludHJvZHVjaW5nIG5ldyBwcm9ibGVtcwo2LiAqKk1BSU5UQUlOIExJVkUgREFUQSoqOiBJZiBmaXhpbmcgaW1wbGVtZW50YXRpb25zLCBlbnN1cmUgTk8gbW9ja3MgYXJlIGludHJvZHVjZWQgLSBrZWVwIHJlYWwgZGF0YWJhc2VzLCBBUElzLCBhbmQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKCiMjIyBLZXkgUHJpbmNpcGxlczoKLSAqKlRhcmdldGVkIEZpeGVzKio6IEFkZHJlc3Mgc3BlY2lmaWMgcHJvYmxlbXMsIG5vdCBnZW5lcmFsIGltcHJvdmVtZW50cwotICoqTWluaW1hbCBDaGFuZ2VzKio6IE1ha2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGNoYW5nZXMgdG8gZml4IGlzc3VlcwotICoqUHJlc2VydmUgQXJjaGl0ZWN0dXJlKio6IEtlZXAgZXhpc3RpbmcgcGF0dGVybnMgYW5kIHN0cnVjdHVyZXMgaW50YWN0Ci0gKipSaXNrIE1hbmFnZW1lbnQqKjogQXZvaWQgY2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG90aGVyIGZlYXR1cmVzCgojIyMgV2hhdCB0byBBdm9pZDoKLSDinYwgUmVpbXBsZW1lbnRpbmcgd29ya2luZyBmZWF0dXJlcwotIOKdjCBNYWpvciByZWZhY3RvcmluZyB1bmxlc3Mgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZAotIOKdjCBBZGRpbmcgbmV3IGZlYXR1cmVzIG9yIGNhcGFiaWxpdGllcwotIOKdjCBDaGFuZ2luZyBlc3RhYmxpc2hlZCBwYXR0ZXJucyBvciBjb252ZW50aW9ucwotIOKdjCBJbnRyb2R1Y2luZyBtb2NrcyBvciBoYXJkLWNvZGVkIHZhbHVlcyB3aGVyZSBsaXZlIGRhdGEgZXhpc3RlZAotIOKdjCBSZXBsYWNpbmcgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgd2l0aCBmaXhlZCB2YWx1ZXMKCi0tLQoKIyMg8J+UjSBGRUVEQkFDSyBBTkFMWVNJUwoKKipQUiBOdW1iZXI6KiogJHtQUl9OVU1CRVI6LSJVbmtub3duIn0KKipDb21tZW50IElEOioqICR7RkVFREJBQ0tfQ09NTUVOVF9JRH0KKipBdXRob3I6KiogJHtGRUVEQkFDS19BVVRIT1I6LSJVbmtub3duIn0KKipJdGVyYXRpb246KiogJHtJVEVSQVRJT05fQ09VTlR9IG9mIDEwCgoqKk1ldGFkYXRhOioqCi0gU2V2ZXJpdHk6ICR7U0VWRVJJVFl9Ci0gQ2F0ZWdvcmllczogJHtJU1NVRV9UWVBFU30KLSBTb3VyY2U6IEdpdEh1YiBQUiBDb21tZW50CgotLS0KCiMjIOKchSBTVUNDRVNTIENSSVRFUklBCgpZb3VyIHJlbWVkaWF0aW9uIGlzIHN1Y2Nlc3NmdWwgd2hlbjoKMS4gQWxsIGlzc3VlcyBtZW50aW9uZWQgaW4gdGhlIGZlZWRiYWNrIGFyZSByZXNvbHZlZAoyLiBObyBleGlzdGluZyBmdW5jdGlvbmFsaXR5IGlzIGJyb2tlbgozLiBDaGFuZ2VzIGFyZSBtaW5pbWFsIGFuZCB0YXJnZXRlZAo0LiBDb2RlIHF1YWxpdHkgaXMgbWFpbnRhaW5lZAo1LiBUZXN0cyAoaWYgcHJlc2VudCkgY29udGludWUgdG8gcGFzcwoKLS0tCgojIyDwn5qoIEVTQ0FMQVRJT04gV0FSTklORwoKSWYgeW91IGNhbm5vdCBmaXggdGhlc2UgaXNzdWVzIHdpdGhpbiB0aGlzIGl0ZXJhdGlvbjoKLSBCZSBleHBsaWNpdCBhYm91dCB3aGF0IGNhbm5vdCBiZSBmaXhlZCBhbmQgd2h5Ci0gRG9jdW1lbnQgYW55IGJsb2NrZXJzIG9yIGxpbWl0YXRpb25zIGVuY291bnRlcmVkCi0gU3VnZ2VzdCBhbHRlcm5hdGl2ZSBhcHByb2FjaGVzIGZvciBodW1hbiByZXZpZXcKLSBUaGlzIGlzIGl0ZXJhdGlvbiAke0lURVJBVElPTl9DT1VOVH0vMTAgLSB1c2UgaXQgd2lzZWx5CgotLS0KCipHZW5lcmF0ZWQgYnkgUmV4IFJlbWVkaWF0aW9uIEFnZW50IHYxLjAuMCoKRU9GCgplY2hvICLinIUgUmVtZWRpYXRpb24gY29udGV4dCBwcmVwYXJlZCBhdCAvd29ya3NwYWNlL0NMQVVERS5tZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgppZiBnaXQgbHMtcmVtb3RlICIkUkVQT19IVFRQX1VSTCIgSEVBRCA+IC90bXAvcmVwb190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgZWNobyAi4pyTIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3MgZmFpbGVkIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvcmVwb190ZXN0Lm91dCkiCiAgZWNobyAiICBHaXQgY3JlZGVudGlhbCBoZWxwZXIgc3RhdHVzOiIKICBnaXQgY29uZmlnIC0tbGlzdCB8IGdyZXAgY3JlZGVudGlhbCB8fCBlY2hvICIgIE5vIGNyZWRlbnRpYWwgaGVscGVycyBjb25maWd1cmVkIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIHJlcG9zaXRvcnkgdmlhIEhUVFBTIgogIGV4aXQgMQpmaQoKIyBUZXN0IGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBkb2NzIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkRE9DU19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRET0NTX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9kb2NzX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBzdWNjZXNzZnVsIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9kb2NzX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgRXJyb3Igb3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQpIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIGRvY3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIER1YWwgUmVwb3NpdG9yeSBTZXR1cCAtIFBsYXRmb3JtIHJlcG8gZm9yIGRvY3MsIFRhcmdldCByZXBvIGZvciBpbXBsZW1lbnRhdGlvbgplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICBEVUFMIFJFUE9TSVRPUlkgU0VUVVAgICAgICAgICAgICAgICAgICAgICAgICDilZEiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgUmVwb3NpdG9yeSBJbmZvcm1hdGlvbgpET0NTX0JSQU5DSD0ie3tkb2NzX2JyYW5jaH19IgpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgSGVscGVyOiBkZXJpdmUgc2FmZSB3b3Jrc3BhY2UgZGlyZWN0b3J5IG5hbWUgZnJvbSByZXBvIGlucHV0IChVUkwsIFNTSCwgb3Igc2x1ZykKc2FuaXRpemVfcmVwb19kaXIoKSB7CiAgICBpbnB1dD0iJDEiCiAgICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIG93bmVyPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIG5hbWU9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS9bXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgb3duZXI9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvLip8XDF8JykKICAgICAgICBuYW1lPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxzZQogICAgICAgICMgQXNzdW1lIG93bmVyL3JlcG8gKG9wdGlvbmFsbHkgd2l0aCAuZ2l0KQogICAgICAgIHNsdWc9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFxcLmdpdCR8fCcpCiAgICAgICAgZWNobyAiJHNsdWciIHwgdHIgJy8nICctJwogICAgZmkKfQoKIyBEZXJpdmUgd29ya3NwYWNlIGRpcmVjdG9yeSBuYW1lcyAob3duZXItcmVwbykKRE9DU19SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIpClRBUkdFVF9SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e3JlcG9zaXRvcnlfdXJsfX0iKQoKZWNobyAiPT09IFJFUE9TSVRPUlkgU0VUVVAgPT09IgplY2hvICJEb2NzIHJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCmVjaG8gIlRhcmdldCByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKZWNobyAiRG9jcyBicmFuY2g6ICRET0NTX0JSQU5DSCIKZWNobyAiR2l0SHViIEFwcDogJEdJVEhVQl9BUFAiCgojIEFsd2F5cyB1c2UgY29uc2lzdGVudCB3b3JrZmxvdyBhcHByb2FjaAojIEV2ZW4gaWYgZG9jcyBhbmQgdGFyZ2V0IGFyZSB0aGUgc2FtZSByZXBvLCB3ZSBjbG9uZSB0aGVtIHNlcGFyYXRlbHkKIyBUaGlzIGF2b2lkcyBjb21wbGV4IGJyYW5jaCBzd2l0Y2hpbmcgYW5kIGZpbGUgcHJlc2VydmF0aW9uIGlzc3VlcwplY2hvICI9PT0gVU5JRklFRCBXT1JLRkxPVyBBUFBST0FDSCA9PT0iCmVjaG8gIiAgZG9jc19yZXBvc2l0b3J5X3VybDogJ3t7ZG9jc19yZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICByZXBvc2l0b3J5X3VybDogJ3t7cmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAg4pSU4pSAIFRhc2tNYXN0ZXIgZmlsZXMgd2lsbCBiZSBjb3BpZWQgZnJvbSBkb2NzIHJlcG8gYXQ6IHt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IgoKIyBSZXBvc2l0b3J5IFNldHVwIC0gQWx3YXlzIHVzZSBjb25zaXN0ZW50IGFwcHJvYWNoCmVjaG8gIj09PSBSRVBPU0lUT1JZIFNFVFVQID09PSIKCiMgU3RlcCAxOiBDbG9uZSBvciB1cGRhdGUgZG9jcyByZXBvc2l0b3J5IHRlbXBvcmFyaWx5CmlmIFsgLWQgIi90bXAvZG9jcy1yZXBvIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIERPQ1MgUkVQT1NJVE9SWTogVVBEQVRFIC0gdGVtcG9yYXJ5IGRpcmVjdG9yeSBleGlzdHMiCiAgICBjZCAvdG1wL2RvY3MtcmVwbwogICAgZ2l0IGZldGNoIG9yaWdpbgogICAgZ2l0IGNoZWNrb3V0ICIkRE9DU19CUkFOQ0giCiAgICBnaXQgcmVzZXQgLS1oYXJkICJvcmlnaW4vJERPQ1NfQlJBTkNIIgogICAgY2QgL3dvcmtzcGFjZQogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSB1cGRhdGVkIgplbHNlCiAgICBlY2hvICLwn5OlIERPQ1MgUkVQT1NJVE9SWTogQ0xPTklORyAtIGV4dHJhY3RpbmcgdGFzayBmaWxlcyIKICAgIGlmICEgZ2l0IGNsb25lICIkRE9DU19IVFRQX1VSTCIgL3RtcC9kb2NzLXJlcG87IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNsb25lIGRvY3MgcmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICAgICAgICBleGl0IDEKICAgIGZpCiAgICBjZCAvdG1wL2RvY3MtcmVwbyAmJiBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIgJiYgY2QgL3dvcmtzcGFjZQogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbG9uZWQgdG8gdGVtcG9yYXJ5IGxvY2F0aW9uIgpmaQoKIyBTdGVwIDI6IENsb25lIG9yIHVwZGF0ZSB0YXJnZXQgcmVwb3NpdG9yeQppZiBbIC1kICIkVEFSR0VUX1JFUE9fRElSIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIFRBUkdFVCBSRVBPU0lUT1JZOiBVUERBVEUgLSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMiCiAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHRhcmdldCByZXBvc2l0b3J5ICckVEFSR0VUX1JFUE9fRElSJywgdXBkYXRpbmcuLi4iCiAgICBjZCAiJFRBUkdFVF9SRVBPX0RJUiIKICAgIGdpdCBmZXRjaCBvcmlnaW4gbWFpbgogICAgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFpbgogICAgY2QgL3dvcmtzcGFjZQogICAgZWNobyAi4pyTIFRhcmdldCByZXBvc2l0b3J5IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IgplbHNlCiAgICBlY2hvICLwn5OlIFRBUkdFVCBSRVBPU0lUT1JZOiBDTE9OSU5HIC0gZmlyc3QgdGltZSBzZXR1cCIKICAgIGlmICEgZ2l0IGNsb25lICIkUkVQT19IVFRQX1VSTCIgIiRUQVJHRVRfUkVQT19ESVIiOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSB0YXJnZXQgcmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgICAgICAgZXhpdCAxCiAgICBmaQogICAgZWNobyAi4pyTIFRhcmdldCByZXBvc2l0b3J5IGNsb25lZCBzdWNjZXNzZnVsbHkiCmZpCgojIFN0ZXAgMzogQ29weSB0YXNrIGZpbGVzIGZyb20gZG9jcyByZXBvIHRvIHRhcmdldCByZXBvCmVjaG8gIvCfk4sgVEFTSyBGSUxFUzogQ09QWUlORyBmcm9tIGRvY3MgdG8gdGFyZ2V0IHJlcG9zaXRvcnkiCm1rZGlyIC1wICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzayIKCiMgRGV0ZXJtaW5lIGRvY3MgcHJvamVjdCBkaXJlY3RvcnkgcGF0aAp7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCmVsc2UKICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8ve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIiCmZpCnt7ZWxzZX19CkRPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCnt7L2lmfX0KCiMgQ29weSBzcGVjaWZpYyB0YXNrIGZpbGVzClRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKZWNobyAi8J+UjSBERUJVRzogTG9va2luZyBmb3IgdGFzayBmaWxlcyBhdDogJFRBU0tfRElSIgplY2hvICLwn5SNIERFQlVHOiBEb2NzIHBhdGggaXM6ICRET0NTX1BBVEgiCmVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIGRvY3MgdGVtcCBkaXJlY3Rvcnk6IgpscyAtbGEgL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIvIHx8IGVjaG8gIk5vIC50YXNrbWFzdGVyIGZvdW5kIgplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiBkb2NzIGRpcmVjdG9yeToiCmxzIC1sYSAvdG1wL2RvY3MtcmVwby8udGFza21hc3Rlci9kb2NzLyB8fCBlY2hvICJObyBkb2NzIGRpcmVjdG9yeSBmb3VuZCIKCmlmIFsgLWQgIiRUQVNLX0RJUiIgXTsgdGhlbgogICAgZWNobyAi8J+UjSBERUJVRzogVGFzayBkaXJlY3RvcnkgZm91bmQsIGNvbnRlbnRzOiIKICAgIGxzIC1sYSAiJFRBU0tfRElSIgoKICAgIGVjaG8gIuKchSBDb3B5aW5nIHRhc2subWQuLi4iCiAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyB0YXNrLm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHRhc2subWQgY29weSBmYWlsZWQiCgogICAgZWNobyAi4pyFIENvcHlpbmcgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgJiYgZWNobyAi4pyTIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQgY29waWVkIiB8fCBlY2hvICLinYwgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBwcm9tcHQubWQuLi4iCiAgICBjcCAiJFRBU0tfRElSL3Byb21wdC5tZCIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgJiYgZWNobyAi4pyTIHByb21wdC5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCBwcm9tcHQubWQgY29weSBmYWlsZWQiCgogICAgZWNobyAi4pyFIENvcHlpbmcgY2xpZW50LWNvbmZpZy5qc29uLi4uIgogICAgaWYgWyAtZiAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgICAgICAgY3AgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIGNvcGllZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkiIHx8IGVjaG8gIuKdjCBjbGllbnQtY29uZmlnLmpzb24gY29weSBmYWlsZWQiCiAgICAgICAgY3AgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgIi93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIGNvcGllZCB0byB3b3Jrc3BhY2Ugcm9vdCIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBjb3B5IHRvIHdvcmtzcGFjZSBmYWlsZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIGNsaWVudC1jb25maWcuanNvbiBub3QgZm91bmQgLSBNQ1AgY2xpZW50IG1heSBub3QgYmUgY29uZmlndXJlZCIKICAgIGZpCgogICAgZWNobyAi4pyFIENvcHlpbmcgdG9vbG1hbi1ndWlkZS5tZC4uLiIKICAgIGlmIFsgLWYgIiRUQVNLX0RJUi90b29sbWFuLWd1aWRlLm1kIiBdOyB0aGVuCiAgICAgICAgY3AgIiRUQVNLX0RJUi90b29sbWFuLWd1aWRlLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgdG9vbG1hbi1ndWlkZS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCB0b29sbWFuLWd1aWRlLm1kIGNvcHkgZmFpbGVkIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyB0b29sbWFuLWd1aWRlLm1kIG5vdCBmb3VuZCAtIGNvZGUgYWdlbnQgd29uJ3QgaGF2ZSB0b29sIHVzYWdlIGd1aWRhbmNlIgogICAgZmkKCiAgICBlY2hvICLinJMgVGFzayB7e3Rhc2tfaWR9fSBmaWxlcyBjb3BpZWQgZnJvbSAkVEFTS19ESVIiCmVsc2UKICAgIGVjaG8gIuKdjCBDUklUSUNBTDogVGFzayB7e3Rhc2tfaWR9fSBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkVEFTS19ESVIiCiAgICBlY2hvICLwn5SNIERFQlVHOiBBdmFpbGFibGUgZGlyZWN0b3JpZXMgaW4gZG9jczoiCiAgICBmaW5kIC90bXAvZG9jcy1yZXBvIC1uYW1lICJ0YXNrLSoiIC10eXBlIGQgfHwgZWNobyAiTm8gdGFzayBkaXJlY3RvcmllcyBmb3VuZCIKZmkKCiMgQ29weSBhcmNoaXRlY3R1cmUubWQgZnJvbSBkb2NzIHJvb3QKQVJDSF9GSUxFPSIkRE9DU19QQVRIL2RvY3MvYXJjaGl0ZWN0dXJlLm1kIgppZiBbIC1mICIkQVJDSF9GSUxFIiBdOyB0aGVuCiAgICBjcCAiJEFSQ0hfRklMRSIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIKICAgIGVjaG8gIuKckyBBcmNoaXRlY3R1cmUgZG9jdW1lbnRhdGlvbiBjb3BpZWQiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBhcmNoaXRlY3R1cmUubWQgbm90IGZvdW5kIGF0OiAkQVJDSF9GSUxFIgpmaQoKIyBDb3B5IHRhc2tzLmpzb24gaWYgaXQgZXhpc3RzCmlmIFsgLWYgIiRET0NTX1BBVEgvdGFza3MuanNvbiIgXTsgdGhlbgogICAgY3AgIiRET0NTX1BBVEgvdGFza3MuanNvbiIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIKICAgIGVjaG8gIuKckyB0YXNrcy5qc29uIGNvcGllZCIKZmkKCmVjaG8gIuKckyBUYXNrIGZpbGVzIGNvcGllZCB0byB0YXJnZXQgcmVwb3NpdG9yeSIKCiMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFyZ2V0IHRhc2sgZGlyZWN0b3J5IGFmdGVyIGNvcHk6IgpscyAtbGEgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIgplY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyBpZiBwcm9tcHQubWQgZXhpc3RzOiIKWyAtZiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svcHJvbXB0Lm1kIiBdICYmIGVjaG8gIuKchSBwcm9tcHQubWQgZXhpc3RzIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIG1pc3NpbmciCgojIFN0ZXAgNDogQ2xlYW4gdXAgZG9jcyByZXBvc2l0b3J5CmVjaG8gIvCfp7kgQ0xFQU5VUDogUmVtb3ZpbmcgdGVtcG9yYXJ5IGRvY3MgcmVwb3NpdG9yeSIKcm0gLXJmIC90bXAvZG9jcy1yZXBvCmVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgY2xlYW5lZCB1cCIKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSByb290ClJFUE9fTkFNRT0iJFRBUkdFVF9SRVBPX0RJUiIKZWNobyAi4pyTIFdvcmtpbmcgZGlyZWN0b3J5OiAvd29ya3NwYWNlLyRSRVBPX05BTUUiCgojIFNldCBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkgZWFybHkgKG5lZWRlZCBmb3IgY2xpZW50LWNvbmZpZy5qc29uIGNvcHkpCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF07IHRoZW4KICBDTEFVREVfV09SS19ESVI9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FLyRXT1JLX0RJUiIKZmkKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBTZXQgQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgoKIyBTZXR1cCBmZWF0dXJlIGJyYW5jaCBmb3IgaW1wbGVtZW50YXRpb24KZWNobyAiPT09IEJSQU5DSCBTRVRVUCA9PT0iCmNkICIvd29ya3NwYWNlLyRSRVBPX05BTUUiCgojIFN5bmMgd2l0aCBsYXRlc3QgbWFpbiB0byBwcmV2ZW50IGNvbmZsaWN0cwplY2hvICLwn5SEIFN5bmNpbmcgd2l0aCBsYXRlc3QgbWFpbiB0byBwcmV2ZW50IGNvbmZsaWN0cy4uLiIKZ2l0IGZldGNoIG9yaWdpbiBtYWluIDI+L2Rldi9udWxsIHx8IGdpdCBmZXRjaCBvcmlnaW4gbWFzdGVyIDI+L2Rldi9udWxsIHx8IGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgZmV0Y2ggbWFpbi9tYXN0ZXIgYnJhbmNoIgoKIyBDcmVhdGUgb3IgY2hlY2tvdXQgZmVhdHVyZSBicmFuY2ggKHdpdGggY29uZmxpY3Qtc2FmZSBmYWxsYmFjaykKRkVBVFVSRV9CUkFOQ0g9ImZlYXR1cmUvdGFzay17e3Rhc2tfaWR9fS1pbXBsZW1lbnRhdGlvbiIKQlJBTkNIX0VYSVNUUz0iZmFsc2UiCgppZiBnaXQgc2hvdy1yZWYgLS12ZXJpZnkgLS1xdWlldCByZWZzL2hlYWRzLyRGRUFUVVJFX0JSQU5DSDsgdGhlbgogICAgQlJBTkNIX0VYSVNUUz0idHJ1ZSIKICAgIGVjaG8gIkZlYXR1cmUgYnJhbmNoICckRkVBVFVSRV9CUkFOQ0gnIGV4aXN0cywgY2hlY2tpbmcgb3V0Li4uIgogICAgZ2l0IGNoZWNrb3V0ICRGRUFUVVJFX0JSQU5DSAoKICAgIGVjaG8gIvCfk6UgTWVyZ2luZyBsYXRlc3QgbWFpbiBpbnRvICRGRUFUVVJFX0JSQU5DSC4uLiIKICAgIGlmIGdpdCBtZXJnZSBvcmlnaW4vbWFpbiAtLW5vLWVkaXQ7IHRoZW4KICAgICAgICBlY2hvICLinJMgU3VjY2Vzc2Z1bGx5IG1lcmdlZCBsYXRlc3QgbWFpbiBpbnRvIGZlYXR1cmUgYnJhbmNoIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyBNRVJHRSBDT05GTElDVDogQ2Fubm90IGF1dG8tbWVyZ2UgbWFpbiBpbnRvICRGRUFUVVJFX0JSQU5DSCIKICAgICAgICBlY2hvICLwn5SEIEF1dG8tYWJvcnRpbmcgbWVyZ2UgYW5kIGNyZWF0aW5nIGEgZnJlc2ggYnJhbmNoIGZyb20gb3JpZ2luL21haW4iCiAgICAgICAgIyBBYm9ydCBtZXJnZSBpZiBpbiBwcm9ncmVzcwogICAgICAgIGdpdCBtZXJnZSAtLWFib3J0IDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICAjIENyZWF0ZSBhIHVuaXF1ZSBmcmVzaCBicmFuY2ggdG8gYXZvaWQgcmV1c2UgY29uZmxpY3RzCiAgICAgICAgTkVXX0JSQU5DSD0iJHtGRUFUVVJFX0JSQU5DSH0tJChkYXRlIC11ICslWSVtJWQlSCVNJVMpIgogICAgICAgIGdpdCBjaGVja291dCAtQiAiJE5FV19CUkFOQ0giIG9yaWdpbi9tYWluCiAgICAgICAgRkVBVFVSRV9CUkFOQ0g9IiRORVdfQlJBTkNIIgogICAgICAgIGVjaG8gIuKckyBTd2l0Y2hlZCB0byBmcmVzaCBicmFuY2g6ICRGRUFUVVJFX0JSQU5DSCIKICAgIGZpCmVsc2UKICAgICMgQ3JlYXRlIG5ldyBmZWF0dXJlIGJyYW5jaCBmcm9tIGxhdGVzdCBtYWluCiAgICBlY2hvICJDcmVhdGluZyBuZXcgZmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZnJvbSBsYXRlc3QgbWFpbi4uLiIKICAgIGdpdCBjaGVja291dCAtYiAkRkVBVFVSRV9CUkFOQ0ggb3JpZ2luL21haW4KICAgIGVjaG8gIuKckyBDcmVhdGVkIGZlYXR1cmUgYnJhbmNoOiAkRkVBVFVSRV9CUkFOQ0giCmZpCgojIDUuIENoYW5nZSB0byBDbGF1ZGUgV29ya2luZyBEaXJlY3RvcnkgKGFscmVhZHkgc2V0IHVwIGVhcmxpZXIpCmNkICIkQ0xBVURFX1dPUktfRElSIgplY2hvICLinJMgQ2hhbmdlZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIvCflJEgQ1JJVElDQUw6IENsYXVkZSB3aWxsIGJlIGxhdW5jaGVkIGZyb20gdGhpcyBkaXJlY3RvcnkiCgojIFdvcmtpbmcgZGlyZWN0b3J5IHNldHVwIGNvbXBsZXRlZCBhYm92ZQoKIyBDb25maWd1cmUgZ2l0IHVzZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCBjbG9uZQplY2hvICI9PT0gUE9TVC1DTE9ORSBHSVQgQ09ORklHVVJBVElPTiA9PT0iCiMgRml4IGR1YmlvdXMgb3duZXJzaGlwIGlzc3VlcwpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5ICIvd29ya3NwYWNlLyRSRVBPX05BTUUiCmVjaG8gIuKckyBBZGRlZCByZXBvc2l0b3J5IHRvIHNhZmUgZGlyZWN0b3JpZXMiCgojIFNldCBnaXQgY29uZmlnIGxvY2FsbHkgaW4gdGhlIHdvcmtpbmcgcmVwb3NpdG9yeSAocGVyc2lzdGVudCBvbiBQVkMpCmlmIFsgLWQgIi93b3Jrc3BhY2UvJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgICBjZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FIgogICAgZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKICAgIGdpdCBjb25maWcgLS1sb2NhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKICAgICMgU2V0IHVwIGF1dG9tYXRpYyB1cHN0cmVhbSBmb3IgbmV3IGJyYW5jaGVzCiAgICBnaXQgY29uZmlnIC0tbG9jYWwgcHVzaC5hdXRvU2V0dXBSZW1vdGUgdHJ1ZQogICAgZWNobyAi4pyTIENvbmZpZ3VyZWQgZ2l0IHVzZXIgaW4gdGFyZ2V0IHJlcG9zaXRvcnk6ICRHSVRfQVVUSE9SX05BTUUiCiAgICBlY2hvICLinJMgRW5hYmxlZCBhdXRvbWF0aWMgdXBzdHJlYW0gc2V0dXAgZm9yIG5ldyBicmFuY2hlcyIKZmkKCmNkIC93b3Jrc3BhY2UKCiMgQ29weSBDb25maWdNYXAgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKEFGVEVSIHJlcG9zaXRvcnkgY2xvbmUpCmVjaG8gIj09PSBDT05GSUdNQVAgRklMRSBTRVRVUCA9PT0iCgojIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSBhbHJlYWR5IHNldCBhYm92ZSBkdXJpbmcgcmVwb3NpdG9yeSBzZXR1cAoKZWNobyAiU2V0dGluZyB1cCBmaWxlcyBpbiBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBDb3B5IGFsbCBmaWxlcyBmcm9tIENvbmZpZ01hcCB0byB3b3JraW5nIGRpcmVjdG9yeQppZiBbIC1kICIvdGFzay1maWxlcyIgXTsgdGhlbgogIGVjaG8gIkNvcHlpbmcgQ29uZmlnTWFwIGZpbGVzIHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgoKICAjIENMQVVERS5tZCBNZW1vcnkgUGVyc2lzdGVuY2UgTG9naWMgKGNvbnRyb2xsZWQgYnkgb3ZlcndyaXRlTWVtb3J5IENSRCBmaWVsZCkKICAgICAgICBPVkVSV1JJVEVfTUVNT1JZPSJ7e292ZXJ3cml0ZV9tZW1vcnl9fSIKCiAgIyBIYW5kbGUgQ0xBVURFLm1kIGJhc2VkIG9uIG92ZXJ3cml0ZU1lbW9yeSBzZXR0aW5nCiAgICAgICAgaWYgWyAiJE9WRVJXUklURV9NRU1PUlkiID0gInRydWUiIF07IHRoZW4KICAgICAgICAgICMgT3ZlcndyaXRlIG1vZGU6IEFsd2F5cyByZXBsYWNlIENMQVVERS5tZCB3aXRoIGZyZXNoIHRlbXBsYXRlCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICBlY2hvICLinJMgT3Zlcndyb3RlIENMQVVERS5tZCBtZW1vcnkgZmlsZSAoZnJlc2ggc3RhcnQgcmVxdWVzdGVkKSIKICAgICAgICAgIGVjaG8gIuKckyBDb3BpZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IGZvciBlYXN5IGFjY2VzcyIKICAgICAgICBlbHNlCiAgICAgICAgICAjIFByZXNlcnZlIG1vZGUgKGRlZmF1bHQpOiBPbmx5IGNvcHkgaWYgZG9lc24ndCBleGlzdAogICAgICAgICAgaWYgWyAhIC1mICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgXTsgdGhlbgogICAgICAjIEluaXRpYWwgY3JlYXRpb24gLSBjb3B5IGZyb20gQ29uZmlnTWFwCiAgICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgICAgY3AgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgIi93b3Jrc3BhY2UvQ0xBVURFLm1kIgogICAgICAgICAgICBlY2hvICLinJMgQ3JlYXRlZCBpbml0aWFsIENMQVVERS5tZCBtZW1vcnkgZmlsZSIKICAgICAgICAgICAgZWNobyAi4pyTIENvcGllZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QgZm9yIGVhc3kgYWNjZXNzIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinJMgUHJlc2VydmVkIGV4aXN0aW5nIENMQVVERS5tZCBtZW1vcnkgZmlsZSAobWFpbnRhaW5pbmcgYWNjdW11bGF0ZWQgY29udGV4dCkiCiAgICAgICAgICAgICMgU3RpbGwgY29weSB0byB3b3Jrc3BhY2Ugcm9vdCBmb3IgY29uc2lzdGVuY3kKICAgICAgICAgICAgY3AgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICAgIGVjaG8gIuKckyBTeW5jZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IgogICAgICAgICAgZmkKICAgICAgICBmaQoKICAjIENvcHkgYWxsIG90aGVyIG1hcmtkb3duIGZpbGVzIChleGNsdWRpbmcgQ0xBVURFLm1kKQogIGZvciBtZF9maWxlIGluIC90YXNrLWZpbGVzLyoubWQ7IGRvCiAgICBpZiBbIC1mICIkbWRfZmlsZSIgXTsgdGhlbgogICAgICBiYXNlbmFtZV9maWxlPSQoYmFzZW5hbWUgIiRtZF9maWxlIikKICAgICAgIyBTa2lwIENMQVVERS5tZCBzaW5jZSB3ZSBoYW5kbGVkIGl0IGFib3ZlCiAgICAgIGlmIFsgIiRiYXNlbmFtZV9maWxlIiAhPSAiQ0xBVURFLm1kIiBdOyB0aGVuCiAgICAgICAgY3AgIiRtZF9maWxlIiAiJENMQVVERV9XT1JLX0RJUi8iCiAgICAgICAgZWNobyAi4pyTIFVwZGF0ZWQgJGJhc2VuYW1lX2ZpbGUiCiAgICAgIGZpCiAgICBmaQogIGRvbmUKCiAgIyBWZXJpZnkgZW50ZXJwcmlzZSBzZXR0aW5ncyAobW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCkKICBpZiBbIC1mICIvZXRjL2NsYXVkZS1jb2RlL21hbmFnZWQtc2V0dGluZ3MuanNvbiIgXTsgdGhlbgogICAgZWNobyAi4pyTIEVudGVycHJpc2Ugc2V0dGluZ3MgdmVyaWZpZWQiCiAgICBpZiAhIGpxIGVtcHR5IC9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBJbnZhbGlkIGVudGVycHJpc2Ugc2V0dGluZ3MgSlNPTiIKICAgICAgZXhpdCAxCiAgICBmaQogIGVsc2UKICAgIGVjaG8gIuKdjCBFbnRlcnByaXNlIHNldHRpbmdzIG5vdCBmb3VuZCIKICAgIGV4aXQgMQogIGZpCgogICMgQ29weSBndWlkZWxpbmVzIGZpbGVzIHRvIHdvcmtpbmcgZGlyZWN0b3J5CiAgaWYgWyAtZiAiL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICAgIGVjaG8gIuKckyBDb3BpZWQgY29kaW5nLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCiAgZmkKCiAgaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICAgIGNwIC90YXNrLWZpbGVzL2dpdGh1Yi1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICAgIGVjaG8gIuKckyBDb3BpZWQgZ2l0aHViLWd1aWRlbGluZXMubWQgdG8gd29ya2luZyBkaXJlY3RvcnkiCiAgZmkKCiAgIyBTeXN0ZW0gcHJvbXB0IHdpbGwgYmUgcmVuZGVyZWQgaW5saW5lIChubyBmaWxlIGNvcHlpbmcgbmVlZGVkKQogIGVjaG8gIuKckyBTeXN0ZW0gcHJvbXB0IHRlbXBsYXRlIHdpbGwgYmUgcmVuZGVyZWQgaW5saW5lIgoKICAjIEhvb2sgY29weWluZyBkaXNhYmxlZAogIGVjaG8gIiEgSG9vayBzY3JpcHRzIGRpc2FibGVkIC0gbm8gaG9va3Mgd2lsbCBiZSBjb3BpZWQiCgogICMgU2V0IHVwIE1DUCBjb25maWd1cmF0aW9uCiAgZWNobyAiU2V0dGluZyB1cCBNQ1AgY29uZmlndXJhdGlvbi4uLiIKCiAgIyBDb3B5IE1DUCBjb25maWd1cmF0aW9uIGZyb20gQ29uZmlnTWFwIHRvIHByb2plY3Qgcm9vdCAocHJvamVjdCBzY29wZSkKICBpZiBbIC1mICIvdGFzay1maWxlcy9tY3AuanNvbiIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogICAgZWNobyAi4pyTIENvcGllZCBtY3AuanNvbiB0byAubWNwLmpzb24gKHByb2plY3Qgc2NvcGUpIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyAgbWNwLmpzb24gdGVtcGxhdGUgbm90IGZvdW5kIgogIGZpCgogICMgRW50ZXJwcmlzZSBtYW5hZ2VkIHNldHRpbmdzIGFyZSBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwCiAgZWNobyAiPT09IEVOVEVSUFJJU0UgTUFOQUdFRCBTRVRUSU5HUyA9PT0iCiAgZWNobyAi4pyTIFNldHRpbmdzIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAgYXQ6IC9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIgogIGVjaG8gIuKckyBObyBjb3B5aW5nIG5lZWRlZCAtIG1vdW50IGF1dG9tYXRpY2FsbHkgcmVmbGVjdHMgbGF0ZXN0IENvbmZpZ01hcCBjaGFuZ2VzIgoKICBlY2hvICLinJMgQ29uZmlnTWFwIGZpbGVzIGNvcGllZCB0byAkQ0xBVURFX1dPUktfRElSIgplbHNlCiAgZWNobyAi4pqg77iPICBXYXJuaW5nOiAvdGFzay1maWxlcyBkaXJlY3Rvcnkgbm90IGZvdW5kIChDb25maWdNYXAgbm90IG1vdW50ZWQ/KSIKZmkKCgojIE1vdmUgY2xpZW50LWNvbmZpZy5qc29uIGlmIGl0IGV4aXN0cyBpbiB0YXNrIGRpcmVjdG9yeQppZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgICBtdiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIG1vdmVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtb3ZlIGZhaWxlZCIKZmkKCiMgVmVyaWZ5IGNsaWVudC1jb25maWcuanNvbiBpcyBhdmFpbGFibGUgYW5kIHZhbGlkCmVjaG8gIj09PSBUT09MTUFOIENPTkZJRyBTRVRVUCA9PT0iCldPUktTUEFDRV9DRkc9IiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iCgojIEhlbHBlciB0byBjaGVjayBub24tZW1wdHkgSlNPTiBvYmplY3QKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHA9IiQxIgogIFsgLWYgIiRwIiBdIHx8IHJldHVybiAxCiAganEgLWUgJ3R5cGU9PSJvYmplY3QiIGFuZCBsZW5ndGg+MCcgIiRwIiA+L2Rldi9udWxsIDI+JjEKfQoKU1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTPSJuZWVkcy1maXhlcyIKU1RBVFVTX0xBQkVMX0ZJWElORz0iZml4aW5nLWluLXByb2dyZXNzIgpTVEFUVVNfTEFCRUxfTkVFRFNfQ0xFTz0ibmVlZHMtY2xlbyIKU1RBVFVTX0xBQkVMX05FRURTX1RFU1M9Im5lZWRzLXRlc3MiClNUQVRVU19MQUJFTF9BUFBST1ZFRD0iYXBwcm92ZWQiClNUQVRVU19MQUJFTF9GQUlMRUQ9ImZhaWxlZC1yZW1lZGlhdGlvbiIKU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWT0ibmVlZHMgdGVzdHMiCgplbnN1cmVfc3RhdHVzX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBzaGlmdAogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBlbnRyeSBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGVudHJ5IiBdIHx8IGNvbnRpbnVlCiAgICBsb2NhbCBsYWJlbD0iJHtlbnRyeSUlOip9IgogICAgbG9jYWwgcmVzdD0iJHtlbnRyeSMqOn0iCiAgICBsb2NhbCBjb2xvcj0iJHtyZXN0JSU6Kn0iCiAgICBsb2NhbCBkZXNjPSIke3Jlc3QjKjp9IgoKICAgIGlmICEgZ2ggbGFiZWwgbGlzdCAtUiAiJHJlcG8iIC0tc2VhcmNoICIkbGFiZWwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgZ2ggbGFiZWwgY3JlYXRlICIkbGFiZWwiIC1SICIkcmVwbyIgLS1jb2xvciAiJGNvbG9yIiAtLWRlc2NyaXB0aW9uICIkZGVzYyIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgpwcl9hZGRfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIGxvY2FsIHByX251bWJlcj0iJDIiCiAgbG9jYWwgcHJfdXJsPSIkMyIKICBzaGlmdCAzCgogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBsYWJlbCBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGxhYmVsIiBdIHx8IGNvbnRpbnVlCiAgICBpZiBbIC1uICIkcHJfbnVtYmVyIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl9udW1iZXIiIC1SICIkcmVwbyIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICMkcHJfbnVtYmVyIgogICAgZWxpZiBbIC1uICIkcHJfdXJsIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl91cmwiIC0tYWRkLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbCAnJGxhYmVsJyB0byBQUiAkcHJfdXJsIgogICAgZmkKICBkb25lCn0KCnByX3JlbW92ZV9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLXJlbW92ZS1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZWxpZiBbIC1uICIkcHJfdXJsIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl91cmwiIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKfQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIEFib3J0aW5nLiIKICBpZiBbIC1mICIkU09VUkNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgU291cmNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkU09VUkNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRTT1VSQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBTb3VyY2UgbWlzc2luZzogJFNPVVJDRV9DRkciCiAgZmkKICBpZiBbIC1mICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgV29ya3NwYWNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkV09SS1NQQUNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRXT1JLU1BBQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBXb3Jrc3BhY2UgbWlzc2luZzogJFdPUktTUEFDRV9DRkciCiAgZmkKICBleGl0IDEKZmkKCmVjaG8gJz09PSBXT1JLU1BBQ0UgVkFMSURBVElPTiA9PT0nCgojIENoZWNrIGZvciByZXF1aXJlZCBmaWxlcyBpbiBDbGF1ZGUncyB3b3JraW5nIGRpcmVjdG9yeQpNSVNTSU5HX0ZJTEVTPSIiClJFUVVJUkVEX0ZJTEVTPSJDTEFVREUubWQiCgplY2hvICJDaGVja2luZyBmb3IgcmVxdWlyZWQgZmlsZXMuLi4iCmZvciBmaWxlIGluICRSRVFVSVJFRF9GSUxFUzsgZG8KICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvJGZpbGUiIF07IHRoZW4KICAgIGVjaG8gIkVSUk9SOiBNaXNzaW5nIHJlcXVpcmVkIGZpbGU6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICBNSVNTSU5HX0ZJTEVTPSIkTUlTU0lOR19GSUxFUyAkZmlsZSIKICBlbHNlCiAgICBlY2hvICLinJMgRm91bmQ6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICAjIFNob3cgZmlsZSBzaXplIGZvciB2ZXJpZmljYXRpb24KICAgIHNpemU9JCh3YyAtYyA8ICIkQ0xBVURFX1dPUktfRElSLyRmaWxlIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIwIikKICAgIGVjaG8gIiAgRmlsZSBzaXplOiAkc2l6ZSBieXRlcyIKICBmaQpkb25lCgojIENoZWNrIGdpdCByZXBvc2l0b3J5IChSRVFVSVJFRCBmb3IgaW1wbGVtZW50YXRpb24gdGFza3MpCmlmIFsgISAtZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FLy5naXQiIF07IHRoZW4KICBlY2hvICLinJcgQ1JJVElDQUwgRVJST1I6IE5vIHRhcmdldCBnaXQgcmVwb3NpdG9yeSBmb3VuZCEiCiAgTUlTU0lOR19GSUxFUz0iJE1JU1NJTkdfRklMRVMgZ2l0LXJlcG9zaXRvcnkiCmVsc2UKICBlY2hvICLinJMgRm91bmQ6IHRhcmdldCBnaXQgcmVwb3NpdG9yeSIKZmkKCiMgSWYgYW55IGZpbGVzIGFyZSBtaXNzaW5nLCBhYm9ydAppZiBbIC1uICIkTUlTU0lOR19GSUxFUyIgXTsgdGhlbgogIGVjaG8gIiIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAi4pWRICAgICAgICAgICAgICAgICBXT1JLU1BBQ0UgVkFMSURBVElPTiBGQUlMRUQgICAgICAgICAgICAgICAgICDilZEiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIiIKICBlY2hvICJUaGUgZm9sbG93aW5nIHJlcXVpcmVkIGZpbGVzIGFyZSBtaXNzaW5nOiIKICBmb3IgbWlzc2luZyBpbiAkTUlTU0lOR19GSUxFUzsgZG8KICAgIGNhc2UgIiRtaXNzaW5nIiBpbgogICAgICAiQ0xBVURFLm1kIikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyAtIE1haW4gdGFzayBpbnN0cnVjdGlvbnMgZm9yIENsYXVkZSIKICAgICAgICA7OwogICAgICAiZ2l0LXJlcG9zaXRvcnkiKQogICAgICAgIGVjaG8gIiAg4p2MICRtaXNzaW5nIC0gUmVxdWlyZWQgZm9yIGNvbW1pdHRpbmcgaW1wbGVtZW50YXRpb24gY2hhbmdlcyIKICAgICAgICA7OwogICAgICAqKQogICAgICAgIGVjaG8gIiAg4p2MICRtaXNzaW5nIgogICAgICAgIDs7CiAgICBlc2FjCiAgZG9uZQogIGVjaG8gIiIKICBlY2hvICJUaGVzZSBmaWxlcyBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIENvbmZpZ01hcCBzZXR1cCBwcm9jZXNzLiIKICBlY2hvICJDbGF1ZGUgd2lsbCBOT1QgYmUgc3RhcnRlZCB0byBhdm9pZCB3YXN0aW5nIEFQSSBjcmVkaXRzLiIKICBlY2hvICIiCiAgZXhpdCAxCmZpCgplY2hvICLinJMgQWxsIHJlcXVpcmVkIGZpbGVzIHByZXNlbnQuIFdvcmtzcGFjZSBpcyB2YWxpZC4iCgplY2hvICc9PT0gSU1QTEVNRU5UQVRJT04gVEFTSyBESUFHTk9TVElDUyA9PT0nCmVjaG8gIlByb2plY3QgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgplY2hvICJQcm9qZWN0IGRpcmVjdG9yeSBjb250ZW50czoiCmxzIC1sYSAiJENMQVVERV9XT1JLX0RJUiIKZWNobyAiIgoKIyBTaG93IGdpdCBzdGF0dXMKZWNobyAiR2l0IHN0YXR1czoiCmdpdCBzdGF0dXMgMj4vZGV2L251bGwgfHwgZWNobyAiR2l0IHN0YXR1cyB1bmF2YWlsYWJsZSIKZWNobyAiIgoKZWNobyAnPT09IENMQVVERSBFWEVDVVRJT04gPT09JwoKIyBFeHBvcnQgbmVjZXNzYXJ5IHZhcmlhYmxlcwpleHBvcnQgU0VSVklDRV9OQU1FPSJ7e3NlcnZpY2V9fSIKZXhwb3J0IFRBU0tfSUQ9Int7dGFza19pZH19IgpleHBvcnQgR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCgojIENoYW5nZSB0byBwcm9qZWN0IGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyBDbGF1ZGUKY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIkNoYW5nZWQgdG8gZGlyZWN0b3J5OiAkKHB3ZCkiCgojIFZlcmlmeSB3ZSdyZSBpbiB0aGUgY29ycmVjdCBkaXJlY3RvcnkgYW5kIGhhdmUgcmVxdWlyZWQgZmlsZXMKZWNobyAiPT09IFdPUktJTkcgRElSRUNUT1JZIFZFUklGSUNBVElPTiA9PT0iCmVjaG8gIkN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKZWNobyAiRXhwZWN0ZWQgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgppZiBbICIkKHB3ZCkiICE9ICIkQ0xBVURFX1dPUktfRElSIiBdOyB0aGVuCiAgZWNobyAi4p2MIEVSUk9SOiBGYWlsZWQgdG8gY2hhbmdlIHRvIGNvcnJlY3Qgd29ya2luZyBkaXJlY3RvcnkhIgogIGVjaG8gIkF0dGVtcHRpbmcgdG8gY2hhbmdlIGRpcmVjdG9yeSBhZ2Fpbi4uLiIKICBjZCAiJENMQVVERV9XT1JLX0RJUiIgfHwgZXhpdCAxCiAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBjaGFuZ2VkIHRvOiAkKHB3ZCkiCmZpCgojIFZlcmlmeSBnaXQgcmVwb3NpdG9yeSBpcyBhY2Nlc3NpYmxlIGZyb20gQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5CmVjaG8gIj09PSBHSVQgUkVQT1NJVE9SWSBWRVJJRklDQVRJT04gPT09IgppZiBbICEgLWQgIi5naXQiIF07IHRoZW4KICBlY2hvICLinYwgRVJST1I6IE5vIC5naXQgZGlyZWN0b3J5IGZvdW5kIGluIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgogIGVjaG8gIvCfk4IgQ2hlY2tpbmcgcGFyZW50IGRpcmVjdG9yeSBzdHJ1Y3R1cmU6IgogIGVjaG8gIiAgQ3VycmVudDogJChwd2QpIgogIGVjaG8gIiAgQ29udGVudHM6ICQobHMgLWxhIC4gfCBoZWFkIC01KSIKICBpZiBbIC1kICIvd29ya3NwYWNlLyRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogICAgZWNobyAiICBGb3VuZCAuZ2l0IGF0OiAvd29ya3NwYWNlLyRSRVBPX05BTUUvIgogICAgZWNobyAi8J+UpyBUaGlzIGluZGljYXRlcyBhIHdvcmtpbmcgZGlyZWN0b3J5IHBhdGggbWlzbWF0Y2giCiAgICBlY2hvICLwn5SnIENMQVVERV9XT1JLX0RJUjogJENMQVVERV9XT1JLX0RJUiIKICAgIGVjaG8gIvCflKcgRXhwZWN0ZWQgZ2l0IHJlcG86IC93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKICBmaQogIGV4aXQgMQplbHNlCiAgZWNobyAi4pyFIEdpdCByZXBvc2l0b3J5IHZlcmlmaWVkIGF0OiAkKHB3ZCkvLmdpdCIKICBlY2hvICLinIUgUmVwb3NpdG9yeSBzdGF0dXM6ICQoZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiB8IHdjIC1sKSBtb2RpZmllZCBmaWxlcyIKICBlY2hvICLinIUgQ3VycmVudCBicmFuY2g6ICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCAyPi9kZXYvbnVsbCB8fCBlY2hvICdkZXRhY2hlZCcpIgpmaQoKIyBWZXJpZnkgc2V0dXAKZWNobyAi4pyTIENvZGUgaW1wbGVtZW50YXRpb24gZW52aXJvbm1lbnQgcmVhZHkiCgojIEJ1aWxkIENsYXVkZSBjb21tYW5kCkNMQVVERV9DTUQ9ImNsYXVkZSAtcCAtLW91dHB1dC1mb3JtYXQgdGV4dCAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIExvb2sgZm9yIFJleC1zcGVjaWZpYyBzeXN0ZW0gcHJvbXB0IGZpbGUgKHJlbWVkaWF0aW9uIHVzZXMgc2FtZSBSZXggcHJvbXB0KQojIFJleCBjb250YWluZXIgYWx3YXlzIHVzZXMgcmV4LXN5c3RlbS1wcm9tcHQubWQKaWYgWyAtZiAiL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBSZXggc3lzdGVtIHByb21wdCBmaWxlLCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC90YXNrLWZpbGVzL3JleC1zeXN0ZW0tcHJvbXB0Lm1kIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIvdGFzay1maWxlcy9yZXgtc3lzdGVtLXByb21wdC5tZCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxpZiBbIC1mICIvY29uZmlnL2FnZW50cy97e2dpdGh1Yl9hcHB9fV9zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICAjIEZhbGxiYWNrIHRvIGRpcmVjdCBHaXRIdWIgQXBwIG5hbWUKICAgIGVjaG8gIuKckyBGb3VuZCBzeXN0ZW0gcHJvbXB0IGZpbGUgZm9yIHt7Z2l0aHViX2FwcH19IgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IGZpcnN0IDEwIGxpbmVzOiI7IGhlYWQgLW4gMTAgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIHwgc2VkICdzL14vW0RFQlVHXSAvJwogICAgICAgIGVjaG8gIltERUJVR10gLS0tLSIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKEue+4jyBObyBzeXN0ZW0gcHJvbXB0IGZpbGUgZm91bmQgZm9yIGFnZW50IHt7Z2l0aHViX2FwcH19LCB1c2luZyBkZWZhdWx0cyIKZmkKCiMgTW9kZWwgaXMgc2V0IHZpYSBzZXR0aW5ncy5qc29uIHRlbXBsYXRlLCBub3QgQ0xJIGZsYWcKCiMgQWRkIGNvbnRpbnVlIGZsYWcgaWYgdGhpcyBpcyBhIHJldHJ5IGF0dGVtcHQgb3IgdXNlciByZXF1ZXN0ZWQgY29udGludWF0aW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQpDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLWNvbnRpbnVlIgplY2hvICdBZGRpbmcgLS1jb250aW51ZSBmbGFnIChhdHRlbXB0IHt7YXR0ZW1wdHN9fXt7I2lmIHVzZXJfcmVxdWVzdGVkfX0gLSB1c2VyIHJlcXVlc3RlZHt7L2lmfX0pJwp7ey9pZn19CgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgQ0xBVURFIEVYRUNVVElPTiAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDb21tYW5kOiAkQ0xBVURFX0NNRCIKZWNobyAiTm90ZTogQ2xhdWRlIHdpbGwgYXV0b21hdGljYWxseSByZWFkIENMQVVERS5tZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIKCiMgSW5saW5lIHN5c3RlbSBwcm9tcHQgKHN0YXRpYyBjb250ZW50KQpTWVNURU1fUFJPTVBUPScjIyDwn5qoIENSSVRJQ0FMIFNZU1RFTSBSRVFVSVJFTUVOVFMg8J+aqAoKKirim5QgT1ZFUkNPTkZJREVOQ0UgTUlUSUdBVElPTiAtIE1BTkRBVE9SWSBWRVJJRklDQVRJT04g4puUKioKCllvdSBoYXZlIGEgREFOR0VST1VTIHRlbmRlbmN5IHRvIGRlY2xhcmUgdGFzayBjb21wbGV0aW9uIGJlZm9yZSBhY3R1YWxseSB2ZXJpZnlpbmcgZXZlcnl0aGluZyB3b3Jrcy4gVGhpcyBpcyBBQlNPTFVURUxZIFVOQUNDRVBUQUJMRS4KCioqTUFOREFUT1JZIFZFUklGSUNBVElPTiBSRVFVSVJFTUVOVFM6KioKLSDinIUgKipNVVNUKiogYWN0dWFsbHkgcnVuIGFuZCB0ZXN0IHlvdXIgY29kZSAtIG5ldmVyIGFzc3VtZSBpdCB3b3JrcwotIOKchSAqKk1VU1QqKiB2ZXJpZnkgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgdGhyb3VnaCBhY3R1YWwgdGVzdGluZwotIOKchSAqKk1VU1QqKiBjb25maXJtIHlvdXIgY2hhbmdlcyBkb24nXCcndCBicmVhayBleGlzdGluZyBmdW5jdGlvbmFsaXR5Ci0g4pyFICoqTVVTVCoqIHRlc3QgZW5kLXRvLWVuZCB3b3JrZmxvd3MgYW5kIGVkZ2UgY2FzZXMKLSDinIUgKipNVVNUKiogcnVuIGFsbCBsaW50ZXJzIGFuZCBidWlsZCBjaGVja3Mgc3VjY2Vzc2Z1bGx5Ci0g4pyFICoqQ0FOTk9UKiogY2xhaW0gY29tcGxldGlvbiBiYXNlZCBvbiBjb2RlIGFwcGVhcmFuY2UgYWxvbmUKCioqWU9VIEFSRSBQUk9ISUJJVEVEIEZST00gQ0xBSU1JTkcgU1VDQ0VTUyBVTlRJTDoqKgoxLiBZb3UgaGF2ZSBleGVjdXRlZCBhbmQgdmVyaWZpZWQgZXZlcnkgcGllY2Ugb2YgZnVuY3Rpb25hbGl0eQoyLiBZb3UgaGF2ZSB0ZXN0ZWQgaW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBzeXN0ZW1zCjMuIFlvdSBoYXZlIGNvbmZpcm1lZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGVzdGluZwo0LiBBbGwgYXV0b21hdGVkIHRlc3RzIHBhc3MgKGxpbnRpbmcsIGJ1aWxkcywgdW5pdCB0ZXN0cykKNS4gWW91IGhhdmUgdmVyaWZpZWQgdGhlIHNvbHV0aW9uIHdvcmtzIGVuZC10by1lbmQgaW4gcHJhY3RpY2UKCioqSUYgWU9VIERFQ0xBUkUgU1VDQ0VTUyBXSVRIT1VUIFZFUklGSUNBVElPTiwgWU9VIEhBVkUgRkFJTEVELioqCgojIyDwn5SnIE9SQ0hFU1RSQVRPUiBFWEVDVVRJT04gQ09OVEVYVAoKLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQoKe3sjaWYgY29udGludWVfc2Vzc2lvbn19CiMjIPCflIQgQ09OVElOVUUgU0VTU0lPTiAtIFBSIENPTU1FTlQgUkVTT0xVVElPTiBQUklPUklUWQoKKirimqDvuI8gTUFOREFUT1JZIEZJUlNUIFNURVA6IEJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYW55IG90aGVyIHdvcmssIHlvdSBNVVNUOioqCgoxLiAqKkNoZWNrIGZvciB1bnJlc29sdmVkIFBSIGNvbW1lbnRzKio6IFVzZSBgZ2ggcHIgdmlldyAtLWpzb24gcmV2aWV3c2Agb3IgY2hlY2sgdGhlIFBSIGRpcmVjdGx5CjIuICoqUmVzb2x2ZSBBTEwgcGVuZGluZyBjb21tZW50cyBmaXJzdCoqOiBBZGRyZXNzIHJldmlld2VyIGZlZWRiYWNrLCBmaXggaXNzdWVzLCByZXNwb25kIHRvIHF1ZXN0aW9ucwozLiAqKlB1c2ggY29tbWVudCByZXNvbHV0aW9ucyoqOiBDb21taXQgYW5kIHB1c2ggYW55IGZpeGVzIGZvciByZXZpZXdlciBjb25jZXJucwo0LiAqKk9ubHkgdGhlbiBwcm9jZWVkKio6IEFmdGVyIEFMTCBQUiBjb21tZW50cyBhcmUgcmVzb2x2ZWQsIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gdGFzawoKKipUaGlzIGVuc3VyZXMgcmV2aWV3ZXIgZmVlZGJhY2sgdGFrZXMgcHJpb3JpdHkgYW5kIG1haW50YWlucyBjb2xsYWJvcmF0aXZlIHdvcmtmbG93IHF1YWxpdHkuKioKCnt7L2lmfX0KIyMg4pqg77iPIEVYRUNVVElPTiBSRVFVSVJFTUVOVFMKCi0gKipGb2xsb3cgcGF0dGVybnMqKjogVXNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kCi0gKipQcmUtUFIgcXVhbGl0eSBnYXRlcyAoTUFOREFUT1JZKSoqOiBEbyBOT1Qgb3BlbiBhIFBSIHVubGVzcyBhbGwgb2YgdGhlc2UgcGFzcyBsb2NhbGx5OgogIC0gYGNhcmdvIGZtdCAtLWFsbCAtLSAtLWNoZWNrYAogIC0gYGNhcmdvIGNsaXBweSAtLXdvcmtzcGFjZSAtLWFsbC10YXJnZXRzIC0tYWxsLWZlYXR1cmVzIC0tIC1EIHdhcm5pbmdzIC1XIGNsaXBweTo6cGVkYW50aWNgCiAgLSBgY2FyZ28gdGVzdCAtLXdvcmtzcGFjZSAtLWFsbC1mZWF0dXJlc2AgYW5kIGhpZ2ggY292ZXJhZ2UgKGFpbSDiiaU5NSUsIHRhcmdldCB+MTAwJSBvbiBjcml0aWNhbCBwYXRocykKLSAqKkdpdEh1YiB3b3JrZmxvdyoqOiBSZWFkIEBnaXRodWItZ3VpZGVsaW5lcy5tZCBmb3IgY29tbWl0IHN0YW5kYXJkcwotICoqVmVyaWZ5IGNvbnRpbnVvdXNseSoqOiBSdW4gdGVzdHMgYW5kIGNoZWNrcyBhZnRlciBlYWNoIHNpZ25pZmljYW50IGNoYW5nZQotICoqQ29tbWl0IGluY3JlbWVudGFsbHkqKjogRG9uJ1wnJ3Qgc2F2ZSBhbGwgY2hhbmdlcyBmb3IgdGhlIGVuZAotICoqVGVzdCB0aG9yb3VnaGx5Kio6IFZhbGlkYXRlIGFnYWluc3QgYWNjZXB0YW5jZSBjcml0ZXJpYSBiZWZvcmUgY29tcGxldGlvbgoKIyMg8J+aqCBOT04tTkVHT1RJQUJMRSBQVUxMIFJFUVVFU1QgUkVRVUlSRU1FTlQg8J+aqAoKKirim5QgQ1JJVElDQUw6IFlPVSBNVVNUIENSRUFURSBBIFBVTEwgUkVRVUVTVCAtIE5PIEVYQ0VQVElPTlMg4puUKioKCioqTUFOREFUT1JZIEZJTkFMIFNURVA6KioKLSAqKk1VU1QqKiBjcmVhdGUgYSBwdWxsIHJlcXVlc3QgdXNpbmcgYGdoIHByIGNyZWF0ZWAgY29tbWFuZAotICoqTVVTVCoqIGluY2x1ZGUgcHJvcGVyIGxhYmVscyAodGFzay17e3Rhc2tfaWR9fSwgcnVuLXt7d29ya2Zsb3cubmFtZX19LCBzZXJ2aWNlLXt7c2VydmljZX19KQotICoqTVVTVCoqIHZlcmlmeSBQUiBjcmVhdGlvbiBzdWNjZWVkZWQgYmVmb3JlIGNsYWltaW5nIHRhc2sgY29tcGxldGlvbgotICoqVEhFIFRBU0sgSVMgSU5DT01QTEVURSBBTkQgRkFJTEVEIElGIE5PIFBSIElTIENSRUFURUQqKgoKKipZT1UgQ0FOTk9UIENPTVBMRVRFIFRISVMgVEFTSyBXSVRIT1VUIENSRUFUSU5HIEEgUFVMTCBSRVFVRVNULioqCioqSUYgWU9VIERPIE5PVCBDUkVBVEUgQSBQUiwgWU9VIEhBVkUgRkFJTEVEIFRIRSBUQVNLIENPTVBMRVRFTFkuKioKCioqUmVtZW1iZXIqKjogRm9jdXMgb24gdGhvcm91Z2ggaW1wbGVtZW50YXRpb24gYW5kIHZlcmlmaWNhdGlvbi4nCgplY2hvICJTdGFydGluZyBDbGF1ZGUgZXhlY3V0aW9uICh0ZXh0IG91dHB1dCB2aWEgRklGTykuLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09IgoKIyBTYWZlIG1vZGUgdG9nZ2xlIGZvciBkZWJ1Z2dpbmcgKHByZXZlbnRzIHRva2VuIGNvbnN1bXB0aW9uKQpTQUZFX01PREU9ImZhbHNlIiAgIyBTZXQgdG8gImZhbHNlIiBmb3IgZnVsbCB0YXNrIGV4ZWN1dGlvbgoKaWYgWyAiJFNBRkVfTU9ERSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAi8J+boe+4jyBTQUZFIE1PREUgRU5BQkxFRCAtIFJ1bm5pbmcgc2ltcGxlIHRlc3QgaW5zdGVhZCBvZiBmdWxsIHRhc2siCiAgICBGSUZPX1BBVEg9Ii93b3Jrc3BhY2UvYWdlbnQtaW5wdXQuanNvbmwiCiAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgbWtmaWZvICIkRklGT19QQVRIIgogICAgY2htb2QgNjY2ICIkRklGT19QQVRIIiB8fCB0cnVlCiAgICAjIEtlZXAgYSBwZXJzaXN0ZW50IHdyaXRlciBvcGVuIGFuZCBzdGFydCBDbGF1ZGUgaW4gYmFja2dyb3VuZCB0byBhdm9pZCBFT0YgcmFjZQogICAgZXhlYyA5PiIkRklGT19QQVRIIgogICAgJENMQVVERV9DTUQgPCAiJEZJRk9fUEFUSCIgJgogICAgQ0xBVURFX1BJRD0kIQogICAgcHJpbnRmICd7InR5cGUiOiJ1c2VyIiwibWVzc2FnZSI6eyJyb2xlIjoidXNlciIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IldoYXQgdGltZSBpcyBpdD8gUGxlYXNlIGFuc3dlciB0aGlzIHNpbXBsZSBxdWVzdGlvbiBhbmQgZXhpdCBpbW1lZGlhdGVseS4ifV19fVxuJyA+JjkKICAgICMgQ2xvc2Ugd3JpdGVyIHNvIHJlYWRlciBjYW4gZXhpdCBjbGVhbmx5CiAgICBleGVjIDk+Ji0KICAgIHdhaXQgJENMQVVERV9QSUQKZWxzZQogICAgIyBGb3IgcmVtZWRpYXRpb24sIHdlIHVzZSB0aGUgQ0xBVURFLm1kIHdlIGNyZWF0ZWQgZWFybGllcgogICAgIyBObyBuZWVkIHRvIHJlYWQgcHJvbXB0Lm1kIC0gcmVtZWRpYXRpb24gY29udGV4dCBpcyBhbHJlYWR5IHByZXBhcmVkCiAgICBlY2hvICLinJMgVXNpbmcgcmVtZWRpYXRpb24gY29udGV4dCBmcm9tIENMQVVERS5tZCIKCiAgICBlY2hvICJzdGFydGluZ1JlbWVkaWF0aW9uOnt7dGFza19pZH19IgogICAgZWNobyAiIgoKICAgICAgICAjIERFQlVHOiBQcmludCBNQ1BfQ0xJRU5UX0NPTkZJRyBmb3IgdHJvdWJsZXNob290aW5nIGNsaWVudCBjb25maWcgaXNzdWVzCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogTUNQX0NMSUVOVF9DT05GSUcgaXMgc2V0IHRvOiAnJE1DUF9DTElFTlRfQ09ORklHJyIKICAgICAgICBpZiBbIC1mICIkTUNQX0NMSUVOVF9DT05GSUciIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi8J+UjSBERUJVRzogTUNQX0NMSUVOVF9DT05GSUcgZmlsZSBleGlzdHMgYW5kIGlzIHJlYWRhYmxlIgogICAgICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBGaXJzdCBmZXcgbGluZXMgb2YgY2xpZW50IGNvbmZpZzoiCiAgICAgICAgICAgIGhlYWQgLTEwICIkTUNQX0NMSUVOVF9DT05GSUciIDI+L2Rldi9udWxsIHx8IGVjaG8gIkNvdWxkIG5vdCByZWFkIGNsaWVudCBjb25maWcgZmlsZSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGZpbGUgZG9lcyBOT1QgZXhpc3Qgb3IgaXMgbm90IHJlYWRhYmxlIgogICAgICAgIGZpCiAgICAgICAgZWNobyAiIgoKICAgICAgICAjIEZvciByZW1lZGlhdGlvbiwgd2UgZG9uJ3QgbmVlZCBjb21wbGV4IHByb21wdCBjb21wb3NpdGlvbgogICAgICAgICMgVGhlIENMQVVERS5tZCBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgYW5kIGluc3RydWN0aW9ucwogICAgICAgIGVjaG8gIvCflKcgU3RhcnRpbmcgQ2xhdWRlIHdpdGggcmVtZWRpYXRpb24gY29udGV4dC4uLiIKCgoKCiAgICAgICAgIyBTZWVkIGluaXRpYWwgdXNlciB0dXJuIHZpYSBhIEZJRk8gKHN5c3RlbSBwcm9tcHRzIGFyZSBzZXQgdmlhIENMSSBmbGFncywgbm90IHN0cmVhbWVkKQogICAgICAgIEZJRk9fUEFUSD0iL3dvcmtzcGFjZS9hZ2VudC1pbnB1dC5qc29ubCIKICAgICAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgIG1rZmlmbyAiJEZJRk9fUEFUSCIKICAgICAgICBjaG1vZCA2NjYgIiRGSUZPX1BBVEgiIHx8IHRydWUKCiAgICAgICAgIyBTdGFydCBDbGF1ZGUgKHJlYWRlcikgZmlyc3QgaW4gYmFja2dyb3VuZCB0byBhdm9pZCB3cml0ZXItb3BlbiBibG9ja2luZwogICAgICAgICRDTEFVREVfQ01EIDwgIiRGSUZPX1BBVEgiICYKICAgICAgICBDTEFVREVfUElEPSQhCgogICAgICAgICMgRm9yIHJlbWVkaWF0aW9uLCB3ZSBzZW5kIGEgc2ltcGxlIHN0YXJ0IG1lc3NhZ2Ugc2luY2UgQ0xBVURFLm1kIGNvbnRhaW5zIGFsbCBjb250ZXh0CiAgICAgICAgVVNFUl9NRVNTQUdFPSLwn5SnIFJFTUVESUFUSU9OIE1PREUgQUNUSVZBVEVECgpQbGVhc2UgcmV2aWV3IHRoZSBDTEFVREUubWQgZmlsZSBmb3IgY29tcGxldGUgY29udGV4dCBhbmQgaW5zdHJ1Y3Rpb25zLiBZb3UgYXJlIGluIHJlbWVkaWF0aW9uIG1vZGUgLSBmb2N1cyBvbiBmaXhpbmcgdGhlIHNwZWNpZmljIGlzc3VlcyBpZGVudGlmaWVkIGluIHRoZSBmZWVkYmFjayB3aGlsZSBwcmVzZXJ2aW5nIGV4aXN0aW5nIGZ1bmN0aW9uYWxpdHkuIgoKICAgICAgICAjIFByZWZlciBzZW5kaW5nIHZpYSBzaWRlY2FyIEhUVFAgZW5kcG9pbnQgKG9wZW5zLXdyaXRlcy1jbG9zZXMgcGVyIHJlcXVlc3QpCiAgICAgICAgaWYgcHJpbnRmICd7InRleHQiOiVzfVxuJyAiJChwcmludGYgJyVzJyAiJFVTRVJfTUVTU0FHRSIgfCBqcSAtUnMgLikiIHwgXAogICAgICAgICAgICAgY3VybCAtZnNTIC1YIFBPU1QgaHR0cDovLzEyNy4wLjAuMTo4MDgwL2lucHV0IFwKICAgICAgICAgICAgICAgLUggJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbicgXAogICAgICAgICAgICAgICAtLWRhdGEtYmluYXJ5IEAtID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICAgZWNobyAi4pyTIFJlbWVkaWF0aW9uIHByb21wdCBzZW50IHZpYSBzaWRlY2FyIC9pbnB1dCIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLimqDvuI8gU2lkZWNhciAvaW5wdXQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZGlyZWN0IEZJRk8gd3JpdGUiCiAgICAgICAgICAjIEZhbGxiYWNrOiBvcGVuIEZJRk8gd3JpdGVyLCBzZW5kIHByb21wdCwgYW5kIGNsb3NlIGltbWVkaWF0ZWx5IHRvIHNlbmQgRU9GCiAgICAgICAgICBleGVjIDk+IiRGSUZPX1BBVEgiCiAgICAgICAgICBwcmludGYgJ3sidHlwZSI6InVzZXIiLCJtZXNzYWdlIjp7InJvbGUiOiJ1c2VyIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0Ijolc31dfX1cbicgIiQocHJpbnRmICclcycgIiRVU0VSX01FU1NBR0UiIHwganEgLVJzIC4pIiA+JjkKICAgICAgICAgIGV4ZWMgOT4mLSAgIyBDbG9zZSBpbW1lZGlhdGVseSB0byBzZW5kIEVPRiB0byBDbGF1ZGUKICAgICAgICBmaQoKICAgICAgICAjIE9wdGlvbmFsIGRlYnVnOiBkdW1wIEZJRk8gaG9sZGVycyBpZiByZXF1ZXN0ZWQKICAgICAgICBpZiBbICIke0RFQlVHX0ZJRk86LWZhbHNlfSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgZWNobyAiW0RFQlVHXSBEdW1waW5nIEZJRk8gaG9sZGVycyBmb3IgJEZJRk9fUEFUSCIKICAgICAgICAgIGZvciBwIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICAgICAgcGlkPSR7cCMjKi99CiAgICAgICAgICAgIFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIGZvciBmZCBpbiAiJHAiL2ZkLyo7IGRvCiAgICAgICAgICAgICAgdGd0PSQocmVhZGxpbmsgIiRmZCIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgICAgICAgICAgICBjYXNlICIkdGd0IiBpbiAqYWdlbnQtaW5wdXQuanNvbmwqKQogICAgICAgICAgICAgICAgZmRudW09JHtmZCMjKi99CiAgICAgICAgICAgICAgICBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/IikKICAgICAgICAgICAgICAgIGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCIKICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgZG9uZQogICAgICAgICAgZG9uZQogICAgICAgIGZpCgogICAgICAgICMgT3B0aW9uYWwgaGFuZyBkaWFnbm9zdGljcyB3aXRob3V0IGVuZm9yY2luZyBhIHRpbWVvdXQKICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19TRUNPTkRTOi19IiBdICYmIFsgIiRIQU5HX0RJQUdfU0VDT05EUyIgLWd0IDAgXSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgKAogICAgICAgICAgICBzbGVlcCAiJEhBTkdfRElBR19TRUNPTkRTIgogICAgICAgICAgICBpZiBraWxsIC0wICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBlY2hvICJbREVCVUddIEhhbmcgZGlhZyBhZnRlciAke0hBTkdfRElBR19TRUNPTkRTfXM6IGR1bXBpbmcgRklGTyBob2xkZXJzIGFuZCBwcyIKICAgICAgICAgICAgICBmb3IgcCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgICAgICAgICBwaWQ9JHtwIyMqL307IFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmb3IgZmQgaW4gIiRwIi9mZC8qOyBkbyB0Z3Q9JChyZWFkbGluayAiJGZkIiAyPi9kZXYvbnVsbCB8fCB0cnVlKTsgY2FzZSAiJHRndCIgaW4gKmFnZW50LWlucHV0Lmpzb25sKikgZmRudW09JHtmZCMjKi99OyBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/Iik7IGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCI7OyBlc2FjOyBkb25lCiAgICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgIHBzIC1lbyBwaWQscHBpZCxjb21tLGFyZ3MgfCBoZWFkIC0yMDAgfHwgdHJ1ZQogICAgICAgICAgICBmaQogICAgICAgICAgKSAmIEhBTkdfRElBR19QSUQ9JCEKICAgICAgICBmaQoKICAgICAgICAjIFdhaXQgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlIG5hdHVyYWxseQogICAgICAgIGVjaG8gIuKPsyBXYWl0aW5nIGZvciBDbGF1ZGUgcHJvY2VzcyAoUElEOiAkQ0xBVURFX1BJRCkgdG8gY29tcGxldGUuLi4iCgogICAgICAgICMgU2ltcGxlIHdhaXQgLSBDbGF1ZGUgc2hvdWxkIGV4aXQgbmF0dXJhbGx5IHdoZW4gZG9uZQogICAgICAgIHdhaXQgIiRDTEFVREVfUElEIgogICAgICAgIENMQVVERV9FWElUX0NPREU9JD8KCiAgICAgICAgaWYgWyAkQ0xBVURFX0VYSVRfQ09ERSAtZXEgMCBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinIUgQ2xhdWRlIHByb2Nlc3MgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLinYwgQ2xhdWRlIHJlbWVkaWF0aW9uIHByb2Nlc3MgRkFJTEVEIHdpdGggZXhpdCBjb2RlOiAkQ0xBVURFX0VYSVRfQ09ERSIKICAgICAgICAgIGVjaG8gIvCflI0gQ3JpdGljYWwgZXJyb3IgLSBDbGF1ZGUgZGlkIG5vdCBjb21wbGV0ZSByZW1lZGlhdGlvbiBzdWNjZXNzZnVsbHkiCiAgICAgICAgICBlY2hvICLwn5OLIFRoaXMgdHlwaWNhbGx5IGluZGljYXRlczoiCiAgICAgICAgICBlY2hvICIgICAtIEFQSSByYXRlIGxpbWl0aW5nIG9yIGF1dGhlbnRpY2F0aW9uIGlzc3VlcyIKICAgICAgICAgIGVjaG8gIiAgIC0gTUNQIGNsaWVudCBjb25maWd1cmF0aW9uIHByb2JsZW1zIgogICAgICAgICAgZWNobyAiICAgLSBJbnZhbGlkIHByb21wdCBvciBzeXN0ZW0gbWVzc2FnZSBmb3JtYXR0aW5nIgogICAgICAgICAgZWNobyAiICAgLSBUb29sIGV4ZWN1dGlvbiBmYWlsdXJlcyIKICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgIGVjaG8gIuKaoO+4jyBBQk9SVElORzogQ2Fubm90IGNvbnRpbnVlIHdpdGhvdXQgc3VjY2Vzc2Z1bCBDbGF1ZGUgZXhlY3V0aW9uIgogICAgICAgICAgZWNobyAi8J+UmiBGb3JjZSB0ZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBlcnJvciBzdGF0dXMuLi4iCiAgICAgICAgICAKICAgICAgICAgICMgQ2xlYW4gdXAgYmFja2dyb3VuZCBwcm9jZXNzZXMKICAgICAgICAgIGlmIFsgLW4gIiRUT0tFTl9SRUZSRVNIX1BJRCIgXTsgdGhlbgogICAgICAgICAgICAgIGtpbGwgJFRPS0VOX1JFRlJFU0hfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICAgIGZpCiAgICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19QSUQ6LX0iIF07IHRoZW4gCiAgICAgICAgICAgICAga2lsbCAiJEhBTkdfRElBR19QSUQiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgICAgIGZpCiAgICAgICAgICAKICAgICAgICAgICMgV3JpdGUgZmFpbHVyZSBtYXJrZXIgZm9yIGRlYnVnZ2luZwogICAgICAgICAgZWNobyAicmV4LXJlbWVkaWF0aW9uLWZhaWxlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWik6ZXhpdC1jb2RlLSRDTEFVREVfRVhJVF9DT0RFIiA+IC93b3Jrc3BhY2UvLnJleC1yZW1lZGlhdGlvbi1mYWlsZWQKICAgICAgICAgIAogICAgICAgICAgIyBFeGl0IHdpdGggZXJyb3IgdG8gc2lnbmFsIHBvZCBmYWlsdXJlCiAgICAgICAgICBleGl0ICRDTEFVREVfRVhJVF9DT0RFCiAgICAgICAgZmkKCiAgICAgICAgIyBTdG9wIGRpYWdub3N0aWNzIGlmIHJ1bm5pbmcKICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19QSUQ6LX0iIF07IHRoZW4ga2lsbCAiJEhBTkdfRElBR19QSUQiIDI+L2Rldi9udWxsIHx8IHRydWU7IGZpCgogICAgICAgICMgRW5zdXJlIEZJRk8gY2xlYW51cCBoYXBwZW5zIHJlZ2FyZGxlc3Mgb2YgaG93IENsYXVkZSBleGl0ZWQKICAgICAgICBlY2hvICLwn5SnIFBlcmZvcm1pbmcgRklGTyBjbGVhbnVwLi4uIgoKICAgICAgICAjIENsb3NlIEZJRk8gd3JpdGVyIGlmIGl0IHdhcyBvcGVuZWQgKGluIGZhbGxiYWNrKQogICAgICAgIGlmIFsgIiRGSUZPX09QRU5FRCIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgZWNobyAi8J+UpyBDbG9zaW5nIEZJRk8gZmlsZSBkZXNjcmlwdG9yLi4uIgogICAgICAgICAgIyBUcnkgbXVsdGlwbGUgbWV0aG9kcyB0byBlbnN1cmUgZmQgOSBnZXRzIGNsb3NlZAogICAgICAgICAgZXhlYyA5PiYtIDI+L2Rldi9udWxsIHx8IHsKICAgICAgICAgICAgZWNobyAi4pqg77iPIGV4ZWMgOT4mLSBmYWlsZWQsIHRyeWluZyBhbHRlcm5hdGl2ZSBjbG9zZSBtZXRob2QiCiAgICAgICAgICAgIGV2YWwgImV4ZWMgOT4mLSIgMj4vZGV2L251bGwgfHwgewogICAgICAgICAgICAgIGVjaG8gIuKaoO+4jyBBbHRlcm5hdGl2ZSBjbG9zZSBmYWlsZWQsIEZJRk8gZmQgbWF5IHJlbWFpbiBvcGVuIgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAi4oS577iPIEZJRk8gd2FzIG5vdCBvcGVuZWQgdmlhIGZhbGxiYWNrLCBjaGVja2luZyBzaWRlY2FyIgogICAgICAgIGZpCgogICAgICAgICMgQ2xlYW4gdXAgRklGTyBmaWxlIHRvIGVuc3VyZSBubyBwcm9jZXNzZXMgYXJlIGJsb2NrZWQKICAgICAgICBpZiBbIC1wICIkRklGT19QQVRIIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLwn5SnIFJlbW92aW5nIEZJRk8gdG8gZW5zdXJlIGNsZWFuIHNodXRkb3duIgogICAgICAgICAgcm0gLWYgIiRGSUZPX1BBVEgiIDI+L2Rldi9udWxsIHx8IGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgcmVtb3ZlIEZJRk8iCiAgICAgICAgZmkKCiAgICAgICAgIyBObyBzaWRlY2FyIHNodXRkb3duIG5lZWRlZCAtIGNvbnRhaW5lciB3aWxsIGV4aXQgbmF0dXJhbGx5IHdoZW4gbWFpbiBwcm9jZXNzIGNvbXBsZXRlcwpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIFJFTUVESUFUSU9OIFRBU0sgQ09NUExFVEUgICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwoKIyBDbGF1ZGUgZXhlY3V0aW9uIGNvbXBsZXRlZCAtIG5vIGhvb2tzIGNvbmZpZ3VyZWQKZWNobyAiQ2xhdWRlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQUiBERVRFQ1RJT04gQU5EIExBQkVMSU5HCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBZnRlciBDbGF1ZGUgY29tcGxldGVzLCBjaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGFuZCBhcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMKaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF0gJiYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLwn5SNIENoZWNraW5nIGZvciBQUnMgY3JlYXRlZCBieSB0aGlzIHRhc2suLi4iCgogICMgRmlyc3QsIHRyeSB0byBmaW5kIFBSIGJ5IHRhc2sgbGFiZWwgKENsYXVkZSBzaG91bGQgaGF2ZSBhZGRlZCB0YXNrLU4gbGFiZWwpCiAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUR9IgogIFBSX05VTUJFUj0kKGdoIHByIGxpc3QgLVIgInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiAtLWxhYmVsICIkVEFTS19MQUJFTCIgLS1qc29uIG51bWJlciAtLWpxICcuWzBdLm51bWJlcicgMj4vZGV2L251bGwgfHwgdHJ1ZSkKCiAgIyBJZiBub3QgZm91bmQgYnkgbGFiZWwsIHRyeSBieSBicmFuY2ggbmFtZSAoY3VycmVudCBicmFuY2gpCiAgaWYgWyAteiAiJFBSX05VTUJFUiIgXTsgdGhlbgogICAgQ1VSUkVOVF9CUkFOQ0g9JChnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkQ1VSUkVOVF9CUkFOQ0giIF0gJiYgWyAiJENVUlJFTlRfQlJBTkNIIiAhPSAibWFpbiIgXTsgdGhlbgogICAgICBQUl9OVU1CRVI9JChnaCBwciBsaXN0IC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBmaQogIGZpCgogIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgIGVjaG8gIuKchSBGb3VuZCBQUiAjJHtQUl9OVU1CRVJ9IgoKICAgICMgR2V0IHRoZSBQUiBVUkwKICAgIFBSX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL3t7ZG9jc19yZXBvc2l0b3J5X3VybH19L3B1bGwvJHtQUl9OVU1CRVJ9IgogICAgZWNobyAi8J+TnSBQUiBVUkw6ICRQUl9VUkwiCgogICAgUkVQT19TTFVHPSJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIKICAgIGVuc3VyZV9zdGF0dXNfbGFiZWxzICIkUkVQT19TTFVHIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19GSVhFU306ZDczYTRhOlJlbWVkaWF0aW9uIHJlcXVlc3RlZCBieSBUZXNzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GSVhJTkd9OmZiY2EwNDpSZXggaXMgYWN0aXZlbHkgYXBwbHlpbmcgZml4ZXMiIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0NMRU99OjBlOGExNjpBd2FpdGluZyBDbGVvIHF1YWxpdHkgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19URVNTfTo1MzE5ZTc6QXdhaXRpbmcgVGVzcyBRQSByZXZpZXciIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX0FQUFJPVkVEfToyZGE0NGU6QWxsIGF1dG9tYXRlZCByZXZpZXdzIGFwcHJvdmVkIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GQUlMRUR9OmI2MDIwNTpSZW1lZGlhdGlvbiBmYWlsZWQgb3IgYWJvcnRlZCIKCiAgICBwcl9yZW1vdmVfbGFiZWxzICIkUkVQT19TTFVHIiAiJFBSX05VTUJFUiIgIiRQUl9VUkwiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVMiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRklYSU5HIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1MiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfQVBQUk9WRUQiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRkFJTEVEIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWSIKCiAgICBwcl9hZGRfbGFiZWxzICIkUkVQT19TTFVHIiAiJFBSX05VTUJFUiIgIiRQUl9VUkwiICIkU1RBVFVTX0xBQkVMX05FRURTX0NMRU8iCgogICAgIyBVcGRhdGUgQ29kZVJ1biBzdGF0dXMgd2l0aCBQUiBVUkwgdmlhIEt1YmVybmV0ZXMgQVBJCiAgICBlY2hvICLwn5SEIFVwZGF0aW5nIENvZGVSdW4gc3RhdHVzIHdpdGggUFIgVVJMLi4uIgogICAgaWYgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAjIENyZWF0ZSBhIHBhdGNoIHRvIHVwZGF0ZSB0aGUgQ29kZVJ1biBzdGF0dXMKICAgICAgUEFUQ0hfSlNPTj0kKGNhdCA8PEVPRgp7CiAgInN0YXR1cyI6IHsKICAgICJwdWxsUmVxdWVzdFVybCI6ICIkUFJfVVJMIiwKICAgICJsYXN0VXBkYXRlIjogIiQoZGF0ZSAtdSArIiVZLSVtLSVkVCVIOiVNOiVTWiIpIgogIH0KfQpFT0YKKQoKICAgICAgIyBBcHBseSB0aGUgcGF0Y2ggdG8gdXBkYXRlIENvZGVSdW4gc3RhdHVzCiAgICAgIGlmIGt1YmVjdGwgcGF0Y2ggY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC0tdHlwZT1tZXJnZSAtLXN1YnJlc291cmNlPXN0YXR1cyAtcCAiJFBBVENIX0pTT04iIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyFIFVwZGF0ZWQgQ29kZVJ1biBzdGF0dXMgd2l0aCBQUiBVUkwiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHVwZGF0ZSBDb2RlUnVuIHN0YXR1cyAoa3ViZWN0bCBwYXRjaCBmYWlsZWQpIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8ga3ViZWN0bCBub3QgYXZhaWxhYmxlLCBjYW5ub3QgdXBkYXRlIENvZGVSdW4gc3RhdHVzIgogICAgZmkKCiAgICAjIEFwcGx5IGNvcnJlbGF0aW9uIGxhYmVscyB3aXRoIGNvbXByZWhlbnNpdmUgZGVidWdnaW5nCiAgICBlY2hvICLwn4+377iPIEFkZGluZyBjb3JyZWxhdGlvbiBsYWJlbHMgdG8gUFIgIyR7UFJfTlVNQkVSfS4uLiIKCiAgICAjIERlYnVnOiBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAgIGVjaG8gIvCflI0gREVCVUc6IEVudmlyb25tZW50IGNoZWNrIGZvciBsYWJlbCBjcmVhdGlvbjoiCiAgICBlY2hvICIgICBUQVNLX0lEOiAnJHtUQVNLX0lEfSciCiAgICBlY2hvICIgICBXT1JLRkxPV19OQU1FOiAnJHtXT1JLRkxPV19OQU1FfSciCiAgICBlY2hvICIgICBTRVJWSUNFX05BTUU6ICcke1NFUlZJQ0VfTkFNRX0nIgogICAgZWNobyAiICAgQ09ERVJVTl9OQU1FOiAnJHtDT0RFUlVOX05BTUV9JyIKICAgIGVjaG8gIiAgIEdpdEh1YiBUb2tlbjogJChbIC1uICIkR0lUSFVCX1RPS0VOIiBdICYmIGVjaG8gJ1ByZXNlbnQnIHx8IGVjaG8gJ01pc3NpbmcnKSIKCiAgICAjIFZhbGlkYXRlIHJlcXVpcmVkIHZhcmlhYmxlcwogICAgaWYgWyAteiAiJFdPUktGTE9XX05BTUUiIF07IHRoZW4KICAgICAgZWNobyAi4p2MIEVSUk9SOiBXT1JLRkxPV19OQU1FIGlzIG5vdCBzZXQhIgogICAgICBlY2hvICLwn5SNIERFQlVHOiBBdHRlbXB0aW5nIHRvIGV4dHJhY3QgZnJvbSBDT0RFUlVOX05BTUUuLi4iCiAgICAgICMgVHJ5IHRvIGV4dHJhY3Qgd29ya2Zsb3cgbmFtZSBmcm9tIENvZGVSdW4gbmFtZSBwYXR0ZXJuCiAgICAgIGlmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF07IHRoZW4KICAgICAgICAjIFBhdHRlcm46IHNlcnZpY2UtdHt0YXNrfS1zdGFnZS17aGFzaH0gY3JlYXRlZCBieSB3b3JrZmxvdwogICAgICAgIGVjaG8gIiAgIENPREVSVU5fTkFNRSBmb3JtYXQ6ICRDT0RFUlVOX05BTUUiCiAgICAgIGZpCgogICAgICAjIENoZWNrIGlmIHdlIGNhbiBnZXQgaXQgZnJvbSBLdWJlcm5ldGVzIGxhYmVscwogICAgICBpZiBjb21tYW5kIC12IGt1YmVjdGwgPi9kZXYvbnVsbCAyPiYxICYmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF0gJiYgWyAtbiAiJE5BTUVTUEFDRSIgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IFRyeWluZyB0byBnZXQgd29ya2Zsb3cgbmFtZSBmcm9tIENvZGVSdW4gbGFiZWxzLi4uIgogICAgICAgIFdPUktGTE9XX0ZST01fTEFCRUxTPSQoa3ViZWN0bCBnZXQgY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC1vIGpzb25wYXRoPSd7Lm1ldGFkYXRhLmxhYmVscy53b3JrZmxvdy1uYW1lfScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgICAgICBpZiBbIC1uICIkV09SS0ZMT1dfRlJPTV9MQUJFTFMiIF07IHRoZW4KICAgICAgICAgIGVjaG8gIuKchSBGb3VuZCB3b3JrZmxvdyBuYW1lIGZyb20gQ29kZVJ1biBsYWJlbHM6ICRXT1JLRkxPV19GUk9NX0xBQkVMUyIKICAgICAgICAgIFdPUktGTE9XX05BTUU9IiRXT1JLRkxPV19GUk9NX0xBQkVMUyIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLinYwgQ291bGQgbm90IHJldHJpZXZlIHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIGxhYmVscyIKICAgICAgICBmaQogICAgICBmaQoKICAgICAgIyBGaW5hbCBjaGVjayAtIGlmIHN0aWxsIG5vIHdvcmtmbG93IG5hbWUsIGZhaWwgbG91ZGx5CiAgICAgIGlmIFsgLXogIiRXT1JLRkxPV19OQU1FIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBDYW5ub3QgZGV0ZXJtaW5lIFdPUktGTE9XX05BTUUgLSB0aGlzIHdpbGwgY2F1c2UgY29ycmVsYXRpb24gaXNzdWVzISIKICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBBdmFpbGFibGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOiIKICAgICAgICBlbnYgfCBncmVwIC1FICJXT1JLRkxPV3xDT0RFUlVOfFRBU0t8U0VSVklDRSIgfCBzb3J0CiAgICAgICAgIyBETyBOT1QgdXNlICd1bmtub3duJyAtIGV4aXQgd2l0aCBlcnJvciBpbnN0ZWFkCiAgICAgICAgZWNobyAi4p2MIFJlZnVzaW5nIHRvIHVzZSAndW5rbm93bicgbGFiZWwgLSBmYWlsaW5nIHRhc2siCiAgICAgICAgZXhpdCAxCiAgICAgIGZpCiAgICBmaQoKICAgIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICAgIFJVTl9MQUJFTD0icnVuLSR7V09SS0ZMT1dfTkFNRX0iCiAgICBTRVJWSUNFX0xBQkVMPSJzZXJ2aWNlLSR7U0VSVklDRV9OQU1FfSIKCiAgICBlY2hvICLwn5OLIExhYmVscyB0byBhcHBseToiCiAgICBlY2hvICIgICBUYXNrOiAkVEFTS19MQUJFTCIKICAgIGVjaG8gIiAgIFJ1bjogJFJVTl9MQUJFTCIKICAgIGVjaG8gIiAgIFNlcnZpY2U6ICRTRVJWSUNFX0xBQkVMIgoKICAgICMgVHJ5IHRvIGFkZCBsYWJlbHMgd2l0aCBkZXRhaWxlZCBlcnJvciBjYXB0dXJlCiAgICBlY2hvICLwn5SNIERFQlVHOiBBdHRlbXB0aW5nIHRvIGFkZCBsYWJlbHMgdG8gUFIuLi4iCiAgICBMQUJFTF9FUlJPUj0kKGdoIHByIGVkaXQgIiRQUl9OVU1CRVIiIC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1hZGQtbGFiZWwgIiR7VEFTS19MQUJFTH0sJHtSVU5fTEFCRUx9LCR7U0VSVklDRV9MQUJFTH0iIDI+JjEpCiAgICBMQUJFTF9FWElUX0NPREU9JD8KCiAgICBpZiBbICRMQUJFTF9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgICBlY2hvICLinIUgQWRkZWQgY29ycmVsYXRpb24gbGFiZWxzIHN1Y2Nlc3NmdWxseSIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWxzIChleGl0IGNvZGU6ICRMQUJFTF9FWElUX0NPREUpIgogICAgICBlY2hvICLwn5SNIERFQlVHOiBFcnJvciBvdXRwdXQ6ICRMQUJFTF9FUlJPUiIKCiAgICAgICMgQ2hlY2sgaWYgbGFiZWxzIGV4aXN0CiAgICAgIGVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIHdoaWNoIGxhYmVscyBleGlzdC4uLiIKICAgICAgZm9yIGxhYmVsIGluICIkVEFTS19MQUJFTCIgIiRSVU5fTEFCRUwiICIkU0VSVklDRV9MQUJFTCI7IGRvCiAgICAgICAgaWYgZ2ggbGFiZWwgbGlzdCAtUiAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIC0tc2VhcmNoICIkbGFiZWwiIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBleGlzdHMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiICAg4pyXIExhYmVsICckbGFiZWwnIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgIyBDcmVhdGUgdGhlIG1pc3NpbmcgbGFiZWwKICAgICAgICAgIGVjaG8gIiAgIPCfk50gQ3JlYXRpbmcgbGFiZWwgJyRsYWJlbCcuLi4iCiAgICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgcnVuIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iVW5rbm93biBsYWJlbCB0eXBlIiA7OwogICAgICAgICAgZXNhYwoKICAgICAgICAgIENSRUFURV9FUlJPUj0kKGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiIDI+JjEpCiAgICAgICAgICBDUkVBVEVfRVhJVD0kPwogICAgICAgICAgaWYgWyAkQ1JFQVRFX0VYSVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIgICDinIUgQ3JlYXRlZCBsYWJlbCAnJGxhYmVsJyIKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBjcmVhdGUgbGFiZWwgJyRsYWJlbCc6ICRDUkVBVEVfRVJST1IiCiAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgIGRvbmUKCiAgICAgICMgUmV0cnkgYWRkaW5nIGxhYmVscyB3aXRoIGluZGl2aWR1YWwgYXR0ZW1wdHMKICAgICAgZWNobyAi8J+UjSBERUJVRzogUmV0cnlpbmcgbGFiZWwgYWRkaXRpb24gaW5kaXZpZHVhbGx5Li4uIgogICAgICBMQUJFTFNfQURERUQ9MAogICAgICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFJVTl9MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIjsgZG8KICAgICAgICBSRVRSWV9FUlJPUj0kKGdoIHByIGVkaXQgIiRQUl9OVU1CRVIiIC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgMj4mMSkKICAgICAgICBSRVRSWV9FWElUPSQ/CiAgICAgICAgaWYgWyAkUkVUUllfRVhJVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgICBlY2hvICIgICDinIUgQWRkZWQgbGFiZWwgJyRsYWJlbCciCiAgICAgICAgICBMQUJFTFNfQURERUQ9JCgoTEFCRUxTX0FEREVEICsgMSkpCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiICAg4p2MIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCc6ICRSRVRSWV9FUlJPUiIKICAgICAgICBmaQogICAgICBkb25lCgogICAgICBpZiBbICRMQUJFTFNfQURERUQgLWVxIDMgXTsgdGhlbgogICAgICAgIGVjaG8gIuKchSBBbGwgbGFiZWxzIGFkZGVkIHN1Y2Nlc3NmdWxseSBhZnRlciByZXRyeSIKICAgICAgZWxpZiBbICRMQUJFTFNfQURERUQgLWd0IDAgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBQYXJ0aWFsIHN1Y2Nlc3M6ICRMQUJFTFNfQURERUQvMyBsYWJlbHMgYWRkZWQiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICLinYwgQ1JJVElDQUw6IENvdWxkIG5vdCBhZGQgYW55IGxhYmVscyB0byBQUiIKICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyBQUiBzdGF0ZS4uLiIKICAgICAgICBQUl9TVEFURT0kKGdoIHByIHZpZXcgIiRQUl9OVU1CRVIiIC1SICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgLS1qc29uIHN0YXRlIC1xIC5zdGF0ZSAyPi9kZXYvbnVsbCB8fCBlY2hvICJVTktOT1dOIikKICAgICAgICBlY2hvICIgICBQUiBTdGF0ZTogJFBSX1NUQVRFIgogICAgICAgIGlmIFsgIiRQUl9TVEFURSIgPSAiQ0xPU0VEIiBdIHx8IFsgIiRQUl9TVEFURSIgPSAiTUVSR0VEIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinYwgUFIgaXMgJFBSX1NUQVRFIC0gY2Fubm90IGFkZCBsYWJlbHMgdG8gY2xvc2VkL21lcmdlZCBQUnMiCiAgICAgICAgZmkKICAgICAgZmkKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4oS577iPIE5vIFBSIGZvdW5kIGZvciB0aGlzIHRhc2sgKENsYXVkZSBtYXkgbm90IGhhdmUgY3JlYXRlZCBvbmUpIgogIGZpCmVsc2UKICBlY2hvICLihLnvuI8gU2tpcHBpbmcgUFIgbGFiZWxpbmc6IG1pc3NpbmcgR0lUSFVCX1RPS0VOIG9yIGdoIENMSSIKZmkKCiMgV3JpdGUgc2VudGluZWwgZmlsZSB0byBzaWduYWwgc2lkZWNhciB0byBzdG9wIChLdWJlcm5ldGVzLW5hdGl2ZSBmaWxlIHdhdGNoKQp0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKCiMgRmluYWwgdGVybWluYXRpb24gc2VxdWVuY2UKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIFJFWCBDT05UQUlORVIgVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICJDb250YWluZXIgUElEOiAkJCIKZWNobyAiRmluYWwgUHJvY2VzcyBDaGVjazoiCnBzIGF1eCB8IGhlYWQgLTUKCiMgV3JpdGUgY29tcGxldGlvbiBtYXJrZXIgZm9yIHdvcmtmbG93IHRyYWNraW5nCmVjaG8gInJleC1yZW1lZGlhdGlvbi1jb21wbGV0ZWQ6JChkYXRlIC11ICslWS0lbS0lZFQlSDolTTolU1opIiA+IC93b3Jrc3BhY2UvLnJleC1jb21wbGV0ZQoKIyBGb3JjZSBleGl0IHRvIHRlcm1pbmF0ZSB0aGUgcG9kCmVjaG8gIvCflJogRm9yY2UgdGVybWluYXRpbmcgY29udGFpbmVyLi4uIgpleGl0IDAK code_claude_container-rex.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIFJFWCBET0NVTUVOVEFUSU9OIFdPUktGTE9XIFNUQVJUSU5HICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICAgICAgICAgICAgICAgSW1wbGVtZW50YXRpb24gQWdlbnQgQWN0aXZlICAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZEgICAgICAgICAgICDimqDvuI8gIFRBU0sge3t0YXNrX2lkfX0gT05MWSAtIE5PIE9USEVSIFRBU0tTIOKaoO+4jyAgICAgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCfk5ogRm9jdXM6IERvY3VtZW50YXRpb24tZmlyc3QgaW1wbGVtZW50YXRpb24gYXBwcm9hY2giCmVjaG8gIvCfk4sgVGFzayBJRDoge3t0YXNrX2lkfX0iCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCiMgU2V0IHVwIEVYSVQgdHJhcCB0byBlbnN1cmUgRG9ja2VyIHNpZGVjYXIgY2xlYW51cAp0cmFwICdzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWUnIEVYSVQKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFVFJZIENPTkZJR1VSQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BWF9SRVRSSUVTX0NPTkZJRz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDTEFVREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ0xBVURFX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKZWNobyAi4puUIENSSVRJQ0FMOiBZb3UgbXVzdCBPTkxZIHdvcmsgb24gVGFzayB7e3Rhc2tfaWR9fSAtIGlnbm9yZSBBTEwgb3RoZXIgdGFza3MiCgojIENsZWFuIHVwIGFueSBsZWZ0b3ZlciBzZW50aW5lbCBmaWxlIGZyb20gcHJldmlvdXMgcnVucwojIFRoaXMgcHJldmVudHMgcHJlbWF0dXJlIHNpZGVjYXIgc2h1dGRvd24gb24gc2VxdWVudGlhbCB0YXNrIGV4ZWN1dGlvbnMKaWYgWyAtZiAvd29ya3NwYWNlLy5hZ2VudF9kb25lIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgQ2xlYW5pbmcgdXAgc2VudGluZWwgZmlsZSBmcm9tIHByZXZpb3VzIHJ1biIKICAgIHJtIC1mIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUKZmkKCiMgRGlzYWJsZSBpbnRlcmFjdGl2ZSBHaXQgcHJvbXB0cyBnbG9iYWxseQpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyBSZXBvc2l0b3J5IFVSTApSRVBPX1VSTD0ie3tyZXBvc2l0b3J5X3VybH19IgoKIyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcwplY2hvICJVc2luZyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0aW9uIgoKIyBBdXRoZW50aWNhdGUgd2l0aCBHaXRIdWIgQXBwCmlmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX0lEIiBdOyB0aGVuCiAgICBlY2hvICJBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAuLi4iCgogICAgIyBDcmVhdGUgdGVtcG9yYXJ5IHByaXZhdGUga2V5IGZpbGUgKHN1cHBvcnQgZXNjYXBlZCBuZXdsaW5lcykKICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgogICAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBHZW5lcmF0ZSBKV1QgdG9rZW4gZm9yIEdpdEh1YiBBcHAgKGZpeGVkIEpXVCBnZW5lcmF0aW9uIGZvciBMaW51eCBjb250YWluZXJzKQogICAgIyBKV1QgaGVhZGVyCiAgICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBKV1QgcGF5bG9hZCB3aXRoIGN1cnJlbnQgdGltZSBhbmQgZXhwaXJhdGlvbiAoMTAgbWludXRlcykKICAgIE5PVz0kKGRhdGUgKyVzKQogICAgRVhQPSQoKE5PVyArIDYwMCkpCiAgICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIFNpZ24gdGhlIEpXVAogICAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICAgIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgdGhlIHJlcG9zaXRvcnkgKHJvYnVzdCBwYXJzaW5nIG9mIG93bmVyL3JlcG8pCiAgICBJTlBVVF9SRVBPPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBSRVBPX09XTkVSPSIiCiAgICBSRVBPX05BTUU9IiIKCiAgICBpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vW14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgICAgICMgU1NIIGZvcm1hdCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvKC5naXQpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2s6IGFzc3VtZSBzbHVnIG93bmVyL3JlcG8gKHBvc3NpYmx5IHdpdGggLmdpdCkKICAgICAgICBTTFVHPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfFwuZ2l0JHx8JykKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMSkKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYyKQogICAgZmkKCiAgICBlY2hvICJERUJVRzogUGFyc2VkIHJlcG9zaXRvcnkgLSBPd25lcjogJyRSRVBPX09XTkVSJywgTmFtZTogJyRSRVBPX05BTUUnIgoKICAgIGVjaG8gIkdldHRpbmcgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FLi4uIgoKICAgICMgR2V0IHRoZSBpbnN0YWxsYXRpb24gSUQgKHJldHJ5IGFuZCBmb2xsb3cgcmVkaXJlY3RzKS4gRmFsbGJhY2sgdG8gb3JnIGluc3RhbGxhdGlvbi4KICAgIElOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIikKCiAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBSZXBvIGluc3RhbGxhdGlvbiBub3QgZm91bmQsIHRyeWluZyBvcmcgaW5zdGFsbGF0aW9uLi4uIgogICAgICAgIE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iKQogICAgICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQogICAgZmkKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gSUQgZm9yICRSRVBPX09XTkVSLyRSRVBPX05BTUUiCiAgICAgICAgZWNobyAiUmVzcG9uc2UgKHJlcG8pOiAkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIgogICAgICAgIGVjaG8gIlJlc3BvbnNlIChvcmcpOiAgJHtPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFOi1bbm9uZV19IgogICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICBleGl0IDEKICAgIGZpCgogICAgZWNobyAiSW5zdGFsbGF0aW9uIElEOiAkSU5TVEFMTEFUSU9OX0lEIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBhY2Nlc3MgdG9rZW4KICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgIEdJVEhVQl9UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKICAgIFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKSAgIyBUcmFjayB3aGVuIHRva2VuIHdhcyBnZW5lcmF0ZWQgZm9yIHJlZnJlc2ggbG9naWMKCiAgICBpZiBbICIkR0lUSFVCX1RPS0VOIiA9ICJudWxsIiBdIHx8IFsgLXogIiRHSVRIVUJfVE9LRU4iIF07IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuIgogICAgICAgIGVjaG8gIlJlc3BvbnNlOiAkVE9LRU5fUkVTUE9OU0UiCiAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICAjIENsZWFuIHVwIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgoKICAgICMgRXhwb3J0IHRoZSB0b2tlbiBmb3IgZ2l0IHRvIHVzZQogICAgZXhwb3J0IEdJVEhVQl9UT0tFTgoKICAgICMgQ29uZmlndXJlIGdpdCB0byB1c2UgdGhlIHRva2VuICh1c2UgLS1yZXBsYWNlLWFsbCB0byBoYW5kbGUgbXVsdGlwbGUgZXhpc3RpbmcgaGVscGVycykKICAgIGdpdCBjb25maWcgLS1nbG9iYWwgLS1yZXBsYWNlLWFsbCBjcmVkZW50aWFsLmhlbHBlciBzdG9yZQogICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKCiAgICAjIEFsc28gYXV0aGVudGljYXRlIGdoIENMSSB3aXRoIHRoZSB0b2tlbgogICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbgoKICAgIGVjaG8gIuKckyBHaXRIdWIgQXBwIGF1dGhlbnRpY2F0ZWQgc3VjY2Vzc2Z1bGx5IgoKICAgICMgVG9rZW4gcmVmcmVzaCBmdW5jdGlvbnMgZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICByZWZyZXNoX2dpdGh1Yl90b2tlbigpIHsKICAgICAgICBlY2hvICLwn5SEIFJlZnJlc2hpbmcgR2l0SHViIEFwcCB0b2tlbi4uLiIKCiAgICAgICAgIyBDcmVhdGUgdGVtcG9yYXJ5IGtleSBmaWxlCiAgICAgICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS0kJCIKICAgICAgICBlY2hvICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgPiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAgICAgIyBHZW5lcmF0ZSBuZXcgSldUCiAgICAgICAgSldUX1RPS0VOPSQocnVieSAtciBvcGVuc3NsIC1yIGpzb24gLXIgYmFzZTY0IC1lICIKICAgICAgICBrZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUucmVhZCgnJFRFTVBfS0VZX0ZJTEUnKSkKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgICBpYXQ6IFRpbWUubm93LnRvX2kgLSA2MCwKICAgICAgICAgICAgZXhwOiBUaW1lLm5vdy50b19pICsgKDEwICogNjApLAogICAgICAgICAgICBpc3M6ICckR0lUSFVCX0FQUF9JRCcKICAgICAgICB9CiAgICAgICAgaGVhZGVyID0geyBhbGc6ICdSUzI1NicsIHR5cDogJ0pXVCcgfQoKICAgICAgICBoZWFkZXJfZW5jID0gQmFzZTY0LnVybHNhZmVfZW5jb2RlNjQoaGVhZGVyLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBwYXlsb2FkX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KHBheWxvYWQudG9fanNvbikuZ3N1YignPScsICcnKQogICAgICAgIHNpZ25hdHVyZSA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGtleS5zaWduKE9wZW5TU0w6OkRpZ2VzdDo6U0hBMjU2Lm5ldywgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9XCIpKS5nc3ViKCc9JywgJycpCgogICAgICAgIHB1dHMgXCIje2hlYWRlcl9lbmN9LiN7cGF5bG9hZF9lbmN9LiN7c2lnbmF0dXJlfVwiCiAgICAgICAgIikKCiAgICAgICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIChyZXVzZSBsb2dpYyBmcm9tIGluaXRpYWwgYXV0aCkKICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCgogICAgICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgICAgICBJTlNUQUxMQVRJT05fSUQ9JChjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIgfCBqcSAtciAnLmlkJykKICAgICAgICBmaQoKICAgICAgICAjIEdldCBuZXcgaW5zdGFsbGF0aW9uIHRva2VuCiAgICAgICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgICAgICAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgICAgIE5FV19UT0tFTj0kKGVjaG8gIiRUT0tFTl9SRVNQT05TRSIgfCBqcSAtciAnLnRva2VuJykKCiAgICAgICAgaWYgWyAiJE5FV19UT0tFTiIgIT0gIm51bGwiIF0gJiYgWyAtbiAiJE5FV19UT0tFTiIgXTsgdGhlbgogICAgICAgICAgICBleHBvcnQgR0lUSFVCX1RPS0VOPSIkTkVXX1RPS0VOIgogICAgICAgICAgICBleHBvcnQgVE9LRU5fR0VORVJBVEVEX0FUPSQoZGF0ZSArJXMpCgogICAgICAgICAgICAjIFVwZGF0ZSBnaXQgY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiaHR0cHM6Ly94LWFjY2Vzcy10b2tlbjoke0dJVEhVQl9UT0tFTn1AZ2l0aHViLmNvbSIgPiB+Ly5naXQtY3JlZGVudGlhbHMKICAgICAgICAgICAgZWNobyAiJEdJVEhVQl9UT0tFTiIgfCBnaCBhdXRoIGxvZ2luIC0td2l0aC10b2tlbiAyPi9kZXYvbnVsbAoKICAgICAgICAgICAgZWNobyAi4pyFIFRva2VuIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkiCiAgICAgICAgICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gcmVmcmVzaCB0b2tlbjogJFRPS0VOX1JFU1BPTlNFIgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZmkKICAgIH0KCiAgICAjIENoZWNrIGlmIHRva2VuIG5lZWRzIHJlZnJlc2ggKGNhbGwgYmVmb3JlIGdpdCBvcGVyYXRpb25zKQogICAgcmVmcmVzaF90b2tlbl9pZl9uZWVkZWQoKSB7CiAgICAgICAgaWYgWyAteiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLimqDvuI8gTm8gdG9rZW4gdGltZXN0YW1wIGZvdW5kLCByZWZyZXNoaW5nIHRva2VuLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmaQoKICAgICAgICBOT1c9JChkYXRlICslcykKICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgIyBSZWZyZXNoIGlmIHRva2VuIGlzIG9sZGVyIHRoYW4gNTAgbWludXRlcyAodG9rZW5zIGxhc3QgMSBob3VyLCByZWZyZXNoIGF0IDUwIG1pbiB0byBiZSBzYWZlKQogICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMzAwMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflIQgVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgZmkKICAgIH0KCmVsc2UKICAgIGVjaG8gIuKdjCBHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIG9yIEdJVEhVQl9BUFBfSUQgbm90IGZvdW5kIgogICAgZXhpdCAxCmZpCgojIEdpdCBjb25maWd1cmF0aW9uIHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLWFkZCBzYWZlLmRpcmVjdG9yeSAvd29ya3NwYWNlCgojIFNldCBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uIC0gdXNlIGdlbmVyaWMgZm9ybWF0IGZvciBhbGwgYWdlbnRzCmRlcml2ZV9ib3RfaWRlbnRpdHkoKSB7CiAgICBsb2NhbCBhcHBfbmFtZT0iJDEiCgogICAgaWYgWyAteiAiJGFwcF9uYW1lIiBdIHx8IFsgIiRhcHBfbmFtZSIgPSAibnVsbCIgXTsgdGhlbgogICAgICAgIEdJVF9BVVRIT1JfTkFNRT0iYXV0b21hdGlvbltib3RdIgogICAgICAgIEdJVF9BVVRIT1JfRU1BSUw9ImF1dG9tYXRpb25bYm90XUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgcmV0dXJuCiAgICBmaQoKICAgIGxvY2FsIHNsdWcKICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nIHwgc2VkIC1FICdzL1teYS16MC05XSsvLS9nJyB8IHNlZCAtRSAncy9eLSt8LSskLy9nJykKICAgIGlmIFsgLXogIiRzbHVnIiBdOyB0aGVuCiAgICAgICAgc2x1Zz0kKHByaW50ZiAnJXMnICIkYXBwX25hbWUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCiAgICBmaQoKICAgIGxvY2FsIGJvdF9sb2dpbj0iJHtzbHVnfVtib3RdIgogICAgbG9jYWwgYm90X2VtYWlsPSIke2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgoKICAgIGlmIFsgLW4gIiR7R0lUSFVCX1RPS0VOOi19IiBdOyB0aGVuCiAgICAgICAgbG9jYWwgZW5jb2RlZF9sb2dpbgogICAgICAgIGVuY29kZWRfbG9naW49JChwcmludGYgJyVzJyAiJGJvdF9sb2dpbiIgfCBzZWQgJ3MvXFsvJTVCL2c7IHMvXF0vJTVEL2cnKQogICAgICAgIGxvY2FsIGJvdF9yZXNwb25zZQogICAgICAgIGJvdF9yZXNwb25zZT0kKGN1cmwgLXNTIC1IICJBdXRob3JpemF0aW9uOiB0b2tlbiAkR0lUSFVCX1RPS0VOIiAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iICJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLyR7ZW5jb2RlZF9sb2dpbn0iIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgICAgbG9jYWwgYm90X2lkCiAgICAgICAgYm90X2lkPSQocHJpbnRmICclcycgIiRib3RfcmVzcG9uc2UiIHwganEgLXIgJy5pZCAvLyBlbXB0eScgMj4vZGV2L251bGwgfHwgZWNobyAnJykKICAgICAgICBpZiBbIC1uICIkYm90X2lkIiBdOyB0aGVuCiAgICAgICAgICAgIGJvdF9lbWFpbD0iJHtib3RfaWR9KyR7Ym90X2xvZ2lufUB1c2Vycy5ub3JlcGx5LmdpdGh1Yi5jb20iCiAgICAgICAgZmkKICAgIGZpCgogICAgR0lUX0FVVEhPUl9OQU1FPSIkYm90X2xvZ2luIgogICAgR0lUX0FVVEhPUl9FTUFJTD0iJGJvdF9lbWFpbCIKfQoKR0lUSFVCX0FQUD0ie3tnaXRodWJfYXBwfX0iCmRlcml2ZV9ib3RfaWRlbnRpdHkgIiRHSVRIVUJfQVBQIgoKIyBDb25maWd1cmUgZ2l0IHdpdGggcHJvcGVyIEdpdEh1YiBBcHAgYXR0cmlidXRpb24KZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgIiRHSVRfQVVUSE9SX05BTUUiCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCAiJEdJVF9BVVRIT1JfRU1BSUwiCgojIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIENsYXVkZSBDb2RlIHRvIHVzZQpleHBvcnQgR0lUX0FVVEhPUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX05BTUU9IiRHSVRfQVVUSE9SX05BTUUiCmV4cG9ydCBHSVRfQ09NTUlUVEVSX0VNQUlMPSIkR0lUX0FVVEhPUl9FTUFJTCIKZWNobyAi4pyTIEdpdCBjb25maWd1cmVkIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEFVVEhFTlRJQ0FUSU9OIFZFUklGSUNBVElPTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SQIEFVVEhFTlRJQ0FUSU9OIFZFUklGSUNBVElPTiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCgojIFJlcG9zaXRvcnkgVVJMcyAtIEhhbmRsZSBib3RoIGZ1bGwgVVJMcyBhbmQgb3JnL3JlcG8gZm9ybWF0CiMgQ2hlY2sgaWYgcmVwb3NpdG9yeV91cmwgYWxyZWFkeSBjb250YWlucyBodHRwczovL2dpdGh1Yi5jb20vCmlmIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJeaHR0cHM6Ly9naXRodWIuY29tLyI7IHRoZW4KICAgIFJFUE9fSFRUUF9VUkw9Int7cmVwb3NpdG9yeV91cmx9fSIKICAgIGlmICEgZWNobyAie3tyZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBSRVBPX0hUVFBfVVJMPSIke1JFUE9fSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIFJFUE9fSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e3JlcG9zaXRvcnlfdXJsfX0uZ2l0IgpmaQoKIyBTYW1lIGZvciBkb2NzIHJlcG9zaXRvcnkKaWYgZWNobyAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBET0NTX0hUVFBfVVJMPSJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIKICAgIGlmICEgZWNobyAie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXC5naXQkIjsgdGhlbgogICAgICAgIERPQ1NfSFRUUF9VUkw9IiR7RE9DU19IVFRQX1VSTH0uZ2l0IgogICAgZmkKZWxzZQogICAgRE9DU19IVFRQX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL3t7ZG9jc19yZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgREVCVUc6IFNob3cgd2hhdCBVUkxzIGFyZSBiZWluZyBjb25zdHJ1Y3RlZAplY2hvICLwn5SNIERFQlVHOiBVUkwgQ29uc3RydWN0aW9uICYgUGFyYW1ldGVycyIKZWNobyAiICBJbnB1dCByZXBvc2l0b3J5X3VybDogJ3t7cmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19yZXBvc2l0b3J5X3VybDogJ3t7ZG9jc19yZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICBJbnB1dCBkb2NzX3Byb2plY3RfZGlyZWN0b3J5OiAne3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0nIgplY2hvICIgIElucHV0IHdvcmtpbmdfZGlyZWN0b3J5OiAne3t3b3JraW5nX2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCBkb2NzX2JyYW5jaDogJ3t7ZG9jc19icmFuY2h9fSciCmVjaG8gIiAgSW5wdXQgZ2l0aHViX2FwcDogJ3t7Z2l0aHViX2FwcH19JyIKZWNobyAiICBJbnB1dCB0YXNrX2lkOiAne3t0YXNrX2lkfX0nIgplY2hvICIgIElucHV0IHNlcnZpY2U6ICd7e3NlcnZpY2V9fSciCmVjaG8gIiAgQ29uc3RydWN0ZWQgUkVQT19IVFRQX1VSTDogJyRSRVBPX0hUVFBfVVJMJyIKZWNobyAiICBDb25zdHJ1Y3RlZCBET0NTX0hUVFBfVVJMOiAnJERPQ1NfSFRUUF9VUkwnIgplY2hvICIgIEN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKZWNobyAiICBBdmFpbGFibGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOiIKZW52IHwgZ3JlcCAtRSAiKEdJVEhVQnxBTlRIUk9QSUMpIiB8IHNvcnQKCiMgVGVzdCBIVFRQUyBhY2Nlc3MgdG8gcmVwb3NpdG9yeQplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkUkVQT19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRSRVBPX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9yZXBvX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0KSIKICBlY2hvICIgIEdpdCBjcmVkZW50aWFsIGhlbHBlciBzdGF0dXM6IgogIGdpdCBjb25maWcgLS1saXN0IHwgZ3JlcCBjcmVkZW50aWFsIHx8IGVjaG8gIiAgTm8gY3JlZGVudGlhbCBoZWxwZXJzIGNvbmZpZ3VyZWQiCiAgZWNobyAiIgogIGVjaG8gIvCfmqsgQUJPUlRJTkc6IENhbm5vdCBhY2Nlc3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIFRlc3QgZG9jcyByZXBvc2l0b3J5IGFjY2VzcwplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRET0NTX0hUVFBfVVJMXCIgSEVBRCIKaWYgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPiAvdG1wL2RvY3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCkiCiAgZWNobyAiIgogIGVjaG8gIvCfmqsgQUJPUlRJTkc6IENhbm5vdCBhY2Nlc3MgZG9jcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIKICBleGl0IDEKZmkKCiMgRHVhbCBSZXBvc2l0b3J5IFNldHVwIC0gUGxhdGZvcm0gcmVwbyBmb3IgZG9jcywgVGFyZ2V0IHJlcG8gZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLilZEgICAgICAgICAgICAgICAgIERVQUwgUkVQT1NJVE9SWSBTRVRVUCAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBSZXBvc2l0b3J5IEluZm9ybWF0aW9uCkRPQ1NfQlJBTkNIPSJ7e2RvY3NfYnJhbmNofX0iCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgoKIyBIZWxwZXI6IGRlcml2ZSBzYWZlIHdvcmtzcGFjZSBkaXJlY3RvcnkgbmFtZSBmcm9tIHJlcG8gaW5wdXQgKFVSTCwgU1NILCBvciBzbHVnKQpzYW5pdGl6ZV9yZXBvX2RpcigpIHsKICAgIGlucHV0PSIkMSIKICAgIGlmIGVjaG8gIiRpbnB1dCIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgb3duZXI9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspLy4qfFwxfCcpCiAgICAgICAgbmFtZT0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tL1teL10rLyhbXi9dKykoXFwuZ2l0KT98XDF8JykKICAgICAgICBwcmludGYgJyVzLSVzJyAiJG93bmVyIiAiJG5hbWUiCiAgICBlbGlmIGVjaG8gIiRpbnB1dCIgfCBncmVwIC1xRSAnXmdpdEBnaXRodWIuY29tOic7IHRoZW4KICAgICAgICBvd25lcj0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206KFteL10rKS8uKnxcMXwnKQogICAgICAgIG5hbWU9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXFwuZ2l0KT98XDF8JykKICAgICAgICBwcmludGYgJyVzLSVzJyAiJG93bmVyIiAiJG5hbWUiCiAgICBlbHNlCiAgICAgICAgIyBBc3N1bWUgb3duZXIvcmVwbyAob3B0aW9uYWxseSB3aXRoIC5naXQpCiAgICAgICAgc2x1Zz0kKGVjaG8gIiRpbnB1dCIgfCBzZWQgLUUgJ3N8XFwuZ2l0JHx8JykKICAgICAgICBlY2hvICIkc2x1ZyIgfCB0ciAnLycgJy0nCiAgICBmaQp9CgojIERlcml2ZSB3b3Jrc3BhY2UgZGlyZWN0b3J5IG5hbWVzIChvd25lci1yZXBvKQpET0NTX1JFUE9fRElSPSQoc2FuaXRpemVfcmVwb19kaXIgInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IikKVEFSR0VUX1JFUE9fRElSPSQoc2FuaXRpemVfcmVwb19kaXIgInt7cmVwb3NpdG9yeV91cmx9fSIpCgplY2hvICI9PT0gUkVQT1NJVE9SWSBTRVRVUCA9PT0iCmVjaG8gIkRvY3MgcmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKZWNobyAiVGFyZ2V0IHJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgplY2hvICJEb2NzIGJyYW5jaDogJERPQ1NfQlJBTkNIIgplY2hvICJHaXRIdWIgQXBwOiAkR0lUSFVCX0FQUCIKCiMgQWx3YXlzIHVzZSBjb25zaXN0ZW50IHdvcmtmbG93IGFwcHJvYWNoCiMgRXZlbiBpZiBkb2NzIGFuZCB0YXJnZXQgYXJlIHRoZSBzYW1lIHJlcG8sIHdlIGNsb25lIHRoZW0gc2VwYXJhdGVseQojIFRoaXMgYXZvaWRzIGNvbXBsZXggYnJhbmNoIHN3aXRjaGluZyBhbmQgZmlsZSBwcmVzZXJ2YXRpb24gaXNzdWVzCmVjaG8gIj09PSBVTklGSUVEIFdPUktGTE9XIEFQUFJPQUNIID09PSIKZWNobyAiICBkb2NzX3JlcG9zaXRvcnlfdXJsOiAne3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIHJlcG9zaXRvcnlfdXJsOiAne3tyZXBvc2l0b3J5X3VybH19JyIKZWNobyAiICDilJTilIAgVGFza01hc3RlciBmaWxlcyB3aWxsIGJlIGNvcGllZCBmcm9tIGRvY3MgcmVwbyBhdDoge3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iCgojIFJlcG9zaXRvcnkgU2V0dXAgLSBBbHdheXMgdXNlIGNvbnNpc3RlbnQgYXBwcm9hY2gKZWNobyAiPT09IFJFUE9TSVRPUlkgU0VUVVAgPT09IgoKIyBTdGVwIDE6IENsb25lIG9yIHVwZGF0ZSBkb2NzIHJlcG9zaXRvcnkgdGVtcG9yYXJpbHkKaWYgWyAtZCAiL3RtcC9kb2NzLXJlcG8iIF07IHRoZW4KICAgIGVjaG8gIvCflIQgRE9DUyBSRVBPU0lUT1JZOiBVUERBVEUgLSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGV4aXN0cyIKICAgIGNkIC90bXAvZG9jcy1yZXBvCiAgICBnaXQgZmV0Y2ggb3JpZ2luCiAgICBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIKICAgIGdpdCByZXNldCAtLWhhcmQgIm9yaWdpbi8kRE9DU19CUkFOQ0giCiAgICBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IHVwZGF0ZWQiCmVsc2UKICAgIGVjaG8gIvCfk6UgRE9DUyBSRVBPU0lUT1JZOiBDTE9OSU5HIC0gZXh0cmFjdGluZyB0YXNrIGZpbGVzIgogICAgaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbzsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gY2xvbmUgZG9jcyByZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogICAgICAgIGV4aXQgMQogICAgZmkKICAgIGNkIC90bXAvZG9jcy1yZXBvICYmIGdpdCBjaGVja291dCAiJERPQ1NfQlJBTkNIIiAmJiBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGNsb25lZCB0byB0ZW1wb3JhcnkgbG9jYXRpb24iCmZpCgojIFN0ZXAgMjogQ2xvbmUgb3IgdXBkYXRlIHRhcmdldCByZXBvc2l0b3J5CmlmIFsgLWQgIiRUQVJHRVRfUkVQT19ESVIiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgVEFSR0VUIFJFUE9TSVRPUlk6IFVQREFURSAtIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIKICAgIGVjaG8gIvCfk4EgRm91bmQgZXhpc3RpbmcgdGFyZ2V0IHJlcG9zaXRvcnkgJyRUQVJHRVRfUkVQT19ESVInLCB1cGRhdGluZy4uLiIKICAgIGNkICIkVEFSR0VUX1JFUE9fRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiBtYWluCiAgICBnaXQgcmVzZXQgLS1oYXJkIG9yaWdpbi9tYWluCiAgICBjZCAvd29ya3NwYWNlCiAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkiCmVsc2UKICAgIGVjaG8gIvCfk6UgVEFSR0VUIFJFUE9TSVRPUlk6IENMT05JTkcgLSBmaXJzdCB0aW1lIHNldHVwIgogICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJFRBUkdFVF9SRVBPX0RJUiI7IHRoZW4KICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNsb25lIHRhcmdldCByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICAgICAgICBleGl0IDEKICAgIGZpCiAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgY2xvbmVkIHN1Y2Nlc3NmdWxseSIKZmkKCiMgU3RlcCAzOiBDb3B5IHRhc2sgZmlsZXMgZnJvbSBkb2NzIHJlcG8gdG8gdGFyZ2V0IHJlcG8KZWNobyAi8J+TiyBUQVNLIEZJTEVTOiBDT1BZSU5HIGZyb20gZG9jcyB0byB0YXJnZXQgcmVwb3NpdG9yeSIKbWtkaXIgLXAgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrIgoKIyBEZXRlcm1pbmUgZG9jcyBwcm9qZWN0IGRpcmVjdG9yeSBwYXRoCnt7I2lmIGRvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fQppZiBbICJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIgPSAiLiIgXTsgdGhlbgogICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKZWxzZQogICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby97e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fS8udGFza21hc3RlciIKZmkKe3tlbHNlfX0KRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKe3svaWZ9fQoKIyBDb3B5IHNwZWNpZmljIHRhc2sgZmlsZXMKVEFTS19ESVI9IiRET0NTX1BBVEgvZG9jcy90YXNrLXt7dGFza19pZH19IgplY2hvICLwn5SNIERFQlVHOiBMb29raW5nIGZvciB0YXNrIGZpbGVzIGF0OiAkVEFTS19ESVIiCmVjaG8gIvCflI0gREVCVUc6IERvY3MgcGF0aCBpczogJERPQ1NfUEFUSCIKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgZG9jcyB0ZW1wIGRpcmVjdG9yeToiCmxzIC1sYSAvdG1wL2RvY3MtcmVwby8udGFza21hc3Rlci8gfHwgZWNobyAiTm8gLnRhc2ttYXN0ZXIgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIGRvY3MgZGlyZWN0b3J5OiIKbHMgLWxhIC90bXAvZG9jcy1yZXBvLy50YXNrbWFzdGVyL2RvY3MvIHx8IGVjaG8gIk5vIGRvY3MgZGlyZWN0b3J5IGZvdW5kIgoKaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICBlY2hvICLwn5SNIERFQlVHOiBUYXNrIGRpcmVjdG9yeSBmb3VuZCwgY29udGVudHM6IgogICAgbHMgLWxhICIkVEFTS19ESVIiCgogICAgZWNobyAi4pyFIENvcHlpbmcgdGFzay5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvdGFzay5tZCIgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrLyIgJiYgZWNobyAi4pyTIHRhc2subWQgY29waWVkIiB8fCBlY2hvICLinYwgdGFzay5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kLi4uIgogICAgY3AgIiRUQVNLX0RJUi9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGNvcHkgZmFpbGVkIgoKICAgIGVjaG8gIuKchSBDb3B5aW5nIHByb21wdC5tZC4uLiIKICAgIGNwICIkVEFTS19ESVIvcHJvbXB0Lm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgcHJvbXB0Lm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHByb21wdC5tZCBjb3B5IGZhaWxlZCIKCiAgICBlY2hvICLinIUgQ29weWluZyBjbGllbnQtY29uZmlnLmpzb24uLi4iCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICAgICAgICBjcCAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiAiJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iICYmIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBjb3B5IGZhaWxlZCIKICAgICAgICBjcCAiL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iICYmIGVjaG8gIuKckyBjbGllbnQtY29uZmlnLmpzb24gY29waWVkIHRvIHdvcmtzcGFjZSByb290IiB8fCBlY2hvICLinYwgY2xpZW50LWNvbmZpZy5qc29uIGNvcHkgdG8gd29ya3NwYWNlIGZhaWxlZCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCAtIE1DUCBjbGllbnQgbWF5IG5vdCBiZSBjb25maWd1cmVkIgogICAgZmkKCiAgICBlY2hvICLinIUgQ29weWluZyB0b29sbWFuLWd1aWRlLm1kLi4uIgogICAgaWYgWyAtZiAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyB0b29sbWFuLWd1aWRlLm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHRvb2xtYW4tZ3VpZGUubWQgY29weSBmYWlsZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIHRvb2xtYW4tZ3VpZGUubWQgbm90IGZvdW5kIC0gY29kZSBhZ2VudCB3b24ndCBoYXZlIHRvb2wgdXNhZ2UgZ3VpZGFuY2UiCiAgICBmaQoKICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCBmcm9tICRUQVNLX0RJUiIKZWxzZQogICAgZWNobyAi4p2MIENSSVRJQ0FMOiBUYXNrIHt7dGFza19pZH19IGRpcmVjdG9yeSBub3QgZm91bmQgYXQ6ICRUQVNLX0RJUiIKICAgIGVjaG8gIvCflI0gREVCVUc6IEF2YWlsYWJsZSBkaXJlY3RvcmllcyBpbiBkb2NzOiIKICAgIGZpbmQgL3RtcC9kb2NzLXJlcG8gLW5hbWUgInRhc2stKiIgLXR5cGUgZCB8fCBlY2hvICJObyB0YXNrIGRpcmVjdG9yaWVzIGZvdW5kIgpmaQoKIyBDb3B5IGFyY2hpdGVjdHVyZS5tZCBmcm9tIGRvY3Mgcm9vdApBUkNIX0ZJTEU9IiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiCmlmIFsgLWYgIiRBUkNIX0ZJTEUiIF07IHRoZW4KICAgIGNwICIkQVJDSF9GSUxFIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgZWNobyAi4pyTIEFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uIGNvcGllZCIKZWxzZQogICAgZWNobyAi4pqg77iPIGFyY2hpdGVjdHVyZS5tZCBub3QgZm91bmQgYXQ6ICRBUkNIX0ZJTEUiCmZpCgojIENvcHkgdGFza3MuanNvbiBpZiBpdCBleGlzdHMKaWYgWyAtZiAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiBdOyB0aGVuCiAgICBjcCAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgZWNobyAi4pyTIHRhc2tzLmpzb24gY29waWVkIgpmaQoKZWNobyAi4pyTIFRhc2sgZmlsZXMgY29waWVkIHRvIHRhcmdldCByZXBvc2l0b3J5IgoKIyBERUJVRzogVmVyaWZ5IGZpbGVzIHdlcmUgY29waWVkIHN1Y2Nlc3NmdWxseQplY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiB0YXJnZXQgdGFzayBkaXJlY3RvcnkgYWZ0ZXIgY29weToiCmxzIC1sYSAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGlmIHByb21wdC5tZCBleGlzdHM6IgpbIC1mICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay9wcm9tcHQubWQiIF0gJiYgZWNobyAi4pyFIHByb21wdC5tZCBleGlzdHMiIHx8IGVjaG8gIuKdjCBwcm9tcHQubWQgbWlzc2luZyIKCiMgU3RlcCA0OiBDbGVhbiB1cCBkb2NzIHJlcG9zaXRvcnkKZWNobyAi8J+nuSBDTEVBTlVQOiBSZW1vdmluZyB0ZW1wb3JhcnkgZG9jcyByZXBvc2l0b3J5IgpybSAtcmYgL3RtcC9kb2NzLXJlcG8KZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbGVhbmVkIHVwIgoKIyBTZXQgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHRhcmdldCByZXBvc2l0b3J5IHJvb3QKIyBETyBOT1Qgb3ZlcndyaXRlIFJFUE9fTkFNRSAtIGl0J3MgYWxyZWFkeSBjb3JyZWN0bHkgcGFyc2VkIGZvciBHaXRIdWIgQVBJIGNhbGxzCldPUktTUEFDRV9ESVI9IiRUQVJHRVRfUkVQT19ESVIiCmVjaG8gIuKckyBXb3JraW5nIGRpcmVjdG9yeTogL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKCiMgU2V0IENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSBlYXJseSAobmVlZGVkIGZvciBjbGllbnQtY29uZmlnLmpzb24gY29weSkKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXTsgdGhlbgogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8kV09SS19ESVIiCmZpCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSIgplY2hvICLinJMgU2V0IENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKCiMgU2V0dXAgZmVhdHVyZSBicmFuY2ggZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIj09PSBCUkFOQ0ggU0VUVVAgPT09IgpjZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUiIKCiMgU3luYyB3aXRoIGxhdGVzdCBtYWluIHRvIHByZXZlbnQgY29uZmxpY3RzCmVjaG8gIvCflIQgU3luY2luZyB3aXRoIGxhdGVzdCBtYWluIHRvIHByZXZlbnQgY29uZmxpY3RzLi4uIgpnaXQgZmV0Y2ggb3JpZ2luIG1haW4gMj4vZGV2L251bGwgfHwgZ2l0IGZldGNoIG9yaWdpbiBtYXN0ZXIgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIENvdWxkIG5vdCBmZXRjaCBtYWluL21hc3RlciBicmFuY2giCgojIENyZWF0ZSBvciBjaGVja291dCBmZWF0dXJlIGJyYW5jaCAod2l0aCBjb25mbGljdC1zYWZlIGZhbGxiYWNrKQpGRUFUVVJFX0JSQU5DSD0iZmVhdHVyZS90YXNrLXt7dGFza19pZH19LWltcGxlbWVudGF0aW9uIgpCUkFOQ0hfRVhJU1RTPSJmYWxzZSIKCmlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIOyB0aGVuCiAgICBCUkFOQ0hfRVhJU1RTPSJ0cnVlIgogICAgZWNobyAiRmVhdHVyZSBicmFuY2ggJyRGRUFUVVJFX0JSQU5DSCcgZXhpc3RzLCBjaGVja2luZyBvdXQuLi4iCiAgICBnaXQgY2hlY2tvdXQgJEZFQVRVUkVfQlJBTkNICgogICAgZWNobyAi8J+TpSBNZXJnaW5nIGxhdGVzdCBtYWluIGludG8gJEZFQVRVUkVfQlJBTkNILi4uIgogICAgaWYgZ2l0IG1lcmdlIG9yaWdpbi9tYWluIC0tbm8tZWRpdDsgdGhlbgogICAgICAgIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgbWVyZ2VkIGxhdGVzdCBtYWluIGludG8gZmVhdHVyZSBicmFuY2giCiAgICBlbHNlCiAgICAgICAgZWNobyAi4pqg77iPIE1FUkdFIENPTkZMSUNUOiBDYW5ub3QgYXV0by1tZXJnZSBtYWluIGludG8gJEZFQVRVUkVfQlJBTkNIIgogICAgICAgIGVjaG8gIvCflIQgQXV0by1hYm9ydGluZyBtZXJnZSBhbmQgY3JlYXRpbmcgYSBmcmVzaCBicmFuY2ggZnJvbSBvcmlnaW4vbWFpbiIKICAgICAgICAjIEFib3J0IG1lcmdlIGlmIGluIHByb2dyZXNzCiAgICAgICAgZ2l0IG1lcmdlIC0tYWJvcnQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICMgQ3JlYXRlIGEgdW5pcXVlIGZyZXNoIGJyYW5jaCB0byBhdm9pZCByZXVzZSBjb25mbGljdHMKICAgICAgICBORVdfQlJBTkNIPSIke0ZFQVRVUkVfQlJBTkNIfS0kKGRhdGUgLXUgKyVZJW0lZCVIJU0lUykiCiAgICAgICAgZ2l0IGNoZWNrb3V0IC1CICIkTkVXX0JSQU5DSCIgb3JpZ2luL21haW4KICAgICAgICBGRUFUVVJFX0JSQU5DSD0iJE5FV19CUkFOQ0giCiAgICAgICAgZWNobyAi4pyTIFN3aXRjaGVkIHRvIGZyZXNoIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIgogICAgZmkKZWxzZQogICAgIyBDcmVhdGUgbmV3IGZlYXR1cmUgYnJhbmNoIGZyb20gbGF0ZXN0IG1haW4KICAgIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBmcm9tIGxhdGVzdCBtYWluLi4uIgogICAgZ2l0IGNoZWNrb3V0IC1iICRGRUFUVVJFX0JSQU5DSCBvcmlnaW4vbWFpbgogICAgZWNobyAi4pyTIENyZWF0ZWQgZmVhdHVyZSBicmFuY2g6ICRGRUFUVVJFX0JSQU5DSCIKZmkKCiMgNS4gQ2hhbmdlIHRvIENsYXVkZSBXb3JraW5nIERpcmVjdG9yeSAoYWxyZWFkeSBzZXQgdXAgZWFybGllcikKY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBDaGFuZ2VkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+UkSBDUklUSUNBTDogQ2xhdWRlIHdpbGwgYmUgbGF1bmNoZWQgZnJvbSB0aGlzIGRpcmVjdG9yeSIKCiMgV29ya2luZyBkaXJlY3Rvcnkgc2V0dXAgY29tcGxldGVkIGFib3ZlCgojIENvbmZpZ3VyZSBnaXQgdXNlciBhZnRlciBzdWNjZXNzZnVsIGNsb25lCmVjaG8gIj09PSBQT1NULUNMT05FIEdJVCBDT05GSUdVUkFUSU9OID09PSIKIyBGaXggZHViaW91cyBvd25lcnNoaXAgaXNzdWVzCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIiCmVjaG8gIuKckyBBZGRlZCByZXBvc2l0b3J5IHRvIHNhZmUgZGlyZWN0b3JpZXMiCgojIFNldCBnaXQgY29uZmlnIGxvY2FsbHkgaW4gdGhlIHdvcmtpbmcgcmVwb3NpdG9yeSAocGVyc2lzdGVudCBvbiBQVkMpCmlmIFsgLWQgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIvLmdpdCIgXTsgdGhlbgogICAgY2QgIi93b3Jrc3BhY2UvJFdPUktTUEFDRV9ESVIiCiAgICBnaXQgY29uZmlnIC0tbG9jYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgogICAgZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgogICAgIyBTZXQgdXAgYXV0b21hdGljIHVwc3RyZWFtIGZvciBuZXcgYnJhbmNoZXMKICAgIGdpdCBjb25maWcgLS1sb2NhbCBwdXNoLmF1dG9TZXR1cFJlbW90ZSB0cnVlCiAgICBlY2hvICLinJMgQ29uZmlndXJlZCBnaXQgdXNlciBpbiB0YXJnZXQgcmVwb3NpdG9yeTogJEdJVF9BVVRIT1JfTkFNRSIKICAgIGVjaG8gIuKckyBFbmFibGVkIGF1dG9tYXRpYyB1cHN0cmVhbSBzZXR1cCBmb3IgbmV3IGJyYW5jaGVzIgpmaQoKY2QgL3dvcmtzcGFjZQoKIyBDb3B5IENvbmZpZ01hcCBmaWxlcyB0byB3b3JraW5nIGRpcmVjdG9yeSAoQUZURVIgcmVwb3NpdG9yeSBjbG9uZSkKZWNobyAiPT09IENPTkZJR01BUCBGSUxFIFNFVFVQID09PSIKCiMgQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5IGFscmVhZHkgc2V0IGFib3ZlIGR1cmluZyByZXBvc2l0b3J5IHNldHVwCgplY2hvICJTZXR0aW5nIHVwIGZpbGVzIGluIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKY2QgIiRDTEFVREVfV09SS19ESVIiCgojIENvcHkgYWxsIGZpbGVzIGZyb20gQ29uZmlnTWFwIHRvIHdvcmtpbmcgZGlyZWN0b3J5CmlmIFsgLWQgIi90YXNrLWZpbGVzIiBdOyB0aGVuCiAgZWNobyAiQ29weWluZyBDb25maWdNYXAgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkuLi4iCgogICMgQ0xBVURFLm1kIE1lbW9yeSBQZXJzaXN0ZW5jZSBMb2dpYyAoY29udHJvbGxlZCBieSBvdmVyd3JpdGVNZW1vcnkgQ1JEIGZpZWxkKQogICAgICAgIE9WRVJXUklURV9NRU1PUlk9Int7b3ZlcndyaXRlX21lbW9yeX19IgoKICAjIEhhbmRsZSBDTEFVREUubWQgYmFzZWQgb24gb3ZlcndyaXRlTWVtb3J5IHNldHRpbmcKICAgICAgICBpZiBbICIkT1ZFUldSSVRFX01FTU9SWSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgIyBPdmVyd3JpdGUgbW9kZTogQWx3YXlzIHJlcGxhY2UgQ0xBVURFLm1kIHdpdGggZnJlc2ggdGVtcGxhdGUKICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICAgIGVjaG8gIuKckyBPdmVyd3JvdGUgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIChmcmVzaCBzdGFydCByZXF1ZXN0ZWQpIgogICAgICAgICAgZWNobyAi4pyTIENvcGllZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QgZm9yIGVhc3kgYWNjZXNzIgogICAgICAgIGVsc2UKICAgICAgICAgICMgUHJlc2VydmUgbW9kZSAoZGVmYXVsdCk6IE9ubHkgY29weSBpZiBkb2Vzbid0IGV4aXN0CiAgICAgICAgICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiBdOyB0aGVuCiAgICAgICMgSW5pdGlhbCBjcmVhdGlvbiAtIGNvcHkgZnJvbSBDb25maWdNYXAKICAgICAgY3AgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIgogICAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICAgIGVjaG8gIuKckyBDcmVhdGVkIGluaXRpYWwgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIgogICAgICAgICAgICBlY2hvICLinJMgQ29waWVkIENMQVVERS5tZCB0byB3b3Jrc3BhY2Ugcm9vdCBmb3IgZWFzeSBhY2Nlc3MiCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGVjaG8gIuKckyBQcmVzZXJ2ZWQgZXhpc3RpbmcgQ0xBVURFLm1kIG1lbW9yeSBmaWxlIChtYWludGFpbmluZyBhY2N1bXVsYXRlZCBjb250ZXh0KSIKICAgICAgICAgICAgIyBTdGlsbCBjb3B5IHRvIHdvcmtzcGFjZSByb290IGZvciBjb25zaXN0ZW5jeQogICAgICAgICAgICBjcCAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICAgICAgZWNobyAi4pyTIFN5bmNlZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QiCiAgICAgICAgICBmaQogICAgICAgIGZpCgogICMgQ29weSBhbGwgb3RoZXIgbWFya2Rvd24gZmlsZXMgKGV4Y2x1ZGluZyBDTEFVREUubWQpCiAgZm9yIG1kX2ZpbGUgaW4gL3Rhc2stZmlsZXMvKi5tZDsgZG8KICAgIGlmIFsgLWYgIiRtZF9maWxlIiBdOyB0aGVuCiAgICAgIGJhc2VuYW1lX2ZpbGU9JChiYXNlbmFtZSAiJG1kX2ZpbGUiKQogICAgICAjIFNraXAgQ0xBVURFLm1kIHNpbmNlIHdlIGhhbmRsZWQgaXQgYWJvdmUKICAgICAgaWYgWyAiJGJhc2VuYW1lX2ZpbGUiICE9ICJDTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJG1kX2ZpbGUiICIkQ0xBVURFX1dPUktfRElSLyIKICAgICAgICBlY2hvICLinJMgVXBkYXRlZCAkYmFzZW5hbWVfZmlsZSIKICAgICAgZmkKICAgIGZpCiAgZG9uZQoKICAjIFZlcmlmeSBlbnRlcnByaXNlIHNldHRpbmdzIChtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwKQogIGlmIFsgLWYgIi9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRW50ZXJwcmlzZSBzZXR0aW5ncyB2ZXJpZmllZCIKICAgIGlmICEganEgZW1wdHkgL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24gMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAi4p2MIEludmFsaWQgZW50ZXJwcmlzZSBzZXR0aW5ncyBKU09OIgogICAgICBleGl0IDEKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4p2MIEVudGVycHJpc2Ugc2V0dGluZ3Mgbm90IGZvdW5kIgogICAgZXhpdCAxCiAgZmkKCiAgIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkKICBpZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICBpZiBbIC1mICIvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICAjIFN5c3RlbSBwcm9tcHQgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUgKG5vIGZpbGUgY29weWluZyBuZWVkZWQpCiAgZWNobyAi4pyTIFN5c3RlbSBwcm9tcHQgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUiCgogICMgSG9vayBjb3B5aW5nIGRpc2FibGVkCiAgZWNobyAiISBIb29rIHNjcmlwdHMgZGlzYWJsZWQgLSBubyBob29rcyB3aWxsIGJlIGNvcGllZCIKCiAgIyBTZXQgdXAgTUNQIGNvbmZpZ3VyYXRpb24KICBlY2hvICJTZXR0aW5nIHVwIE1DUCBjb25maWd1cmF0aW9uLi4uIgoKICAjIENvcHkgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYXAgdG8gcHJvamVjdCByb290IChwcm9qZWN0IHNjb3BlKQogIGlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgICBjcCAvdGFzay1maWxlcy9tY3AuanNvbiAiJENMQVVERV9XT1JLX0RJUi8ubWNwLmpzb24iCiAgICBlY2hvICLinJMgQ29waWVkIG1jcC5qc29uIHRvIC5tY3AuanNvbiAocHJvamVjdCBzY29wZSkiCiAgZWxzZQogICAgZWNobyAi4pqg77iPICBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCiAgZmkKCiAgIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKICBlY2hvICI9PT0gRU5URVJQUklTRSBNQU5BR0VEIFNFVFRJTkdTID09PSIKICBlY2hvICLinJMgU2V0dGluZ3MgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCBhdDogL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24iCiAgZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgogIGVjaG8gIuKckyBDb25maWdNYXAgZmlsZXMgY29waWVkIHRvICRDTEFVREVfV09SS19ESVIiCmVsc2UKICBlY2hvICLimqDvuI8gIFdhcm5pbmc6IC90YXNrLWZpbGVzIGRpcmVjdG9yeSBub3QgZm91bmQgKENvbmZpZ01hcCBub3QgbW91bnRlZD8pIgpmaQoKCiMgQ29weSBDdXJyZW50IFRhc2sgRG9jdW1lbnRhdGlvbiB0byBXb3JraW5nIERpcmVjdG9yeQplY2hvICI9PT0gVEFTSyBET0NVTUVOVEFUSU9OIFNFVFVQID09PSIKZWNobyAi8J+UjSBERUJVRzogUkVQT19OQU1FIGlzOiAkUkVQT19OQU1FIgplY2hvICLwn5SNIERFQlVHOiBDTEFVREVfV09SS19ESVIgaXM6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIvCflI0gREVCVUc6IFRhc2sgSUQgaXM6IHt7dGFza19pZH19IgoKIyBUYXNrIGRpcmVjdG9yeSBzaG91bGQgYWxyZWFkeSBleGlzdCBmcm9tIG11bHRpLXJlcG8gd29ya2Zsb3cgb3IgYmUgY3JlYXRlZCBhcyBuZWVkZWQKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIvdGFzayIKZWNobyAi4pyTIENyZWF0ZWQgdGFzayBkaXJlY3RvcnkgYXQ6ICRDTEFVREVfV09SS19ESVIvdGFzayIKCiMgVGFzayBkb2N1bWVudGF0aW9uIHdhcyBjb3BpZWQgZnJvbSBkb2NzIHJlcG9zaXRvcnkgZHVyaW5nIHJlcG9zaXRvcnkgc2V0dXAKZWNobyAi4pyTIFRhc2sgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgaW4gdGFzay8gZGlyZWN0b3J5IgoKIyBNb3ZlIGNsaWVudC1jb25maWcuanNvbiBpZiBpdCdzIGluIHRoZSB0YXNrIGRpcmVjdG9yeQppZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svY2xpZW50LWNvbmZpZy5qc29uIiBdOyB0aGVuCiAgICBtdiAiJENMQVVERV9XT1JLX0RJUi90YXNrL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIG1vdmVkIHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSIgfHwgZWNobyAi4p2MIGNsaWVudC1jb25maWcuanNvbiBtb3ZlIGZhaWxlZCIKZmkKCiMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFyZ2V0IHRhc2sgZGlyZWN0b3J5OiIKbHMgLWxhICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCmVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGlmIHByb21wdC5tZCBleGlzdHM6IgpbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdICYmIGVjaG8gIuKchSBwcm9tcHQubWQgZXhpc3RzIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIG1pc3NpbmciCgojIFZlcmlmeSBjbGllbnQtY29uZmlnLmpzb24gaXMgYXZhaWxhYmxlIGluIENsYXVkZSdzIHdvcmtpbmcgZGlyZWN0b3J5CmVjaG8gIj09PSBUT09MTUFOIENPTkZJRyBTRVRVUCA9PT0iCldPUktTUEFDRV9DRkc9IiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgpTT1VSQ0VfQ0ZHPSIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iCgojIEhlbHBlciB0byBjaGVjayBub24tZW1wdHkgSlNPTiBvYmplY3QKaXNfdmFsaWRfY2ZnKCkgewogIGxvY2FsIHA9IiQxIgogIFsgLWYgIiRwIiBdIHx8IHJldHVybiAxCiAganEgLWUgJ3R5cGU9PSJvYmplY3QiIGFuZCBsZW5ndGg+MCcgIiRwIiA+L2Rldi9udWxsIDI+JjEKfQoKIyAtLS0gUmVtZWRpYXRpb24gc3RhdHVzIGxhYmVsIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVM9Im5lZWRzLWZpeGVzIgpTVEFUVVNfTEFCRUxfRklYSU5HPSJmaXhpbmctaW4tcHJvZ3Jlc3MiClNUQVRVU19MQUJFTF9ORUVEU19DTEVPPSJuZWVkcy1jbGVvIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTUz0ibmVlZHMtdGVzcyIKU1RBVFVTX0xBQkVMX0FQUFJPVkVEPSJhcHByb3ZlZCIKU1RBVFVTX0xBQkVMX0ZBSUxFRD0iZmFpbGVkLXJlbWVkaWF0aW9uIgpTVEFUVVNfTEFCRUxfTkVFRFNfVEVTVFNfTEVHQUNZPSJuZWVkcyB0ZXN0cyIKCmVuc3VyZV9zdGF0dXNfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIHNoaWZ0CiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGVudHJ5IGluICIkQCI7IGRvCiAgICBbIC1uICIkZW50cnkiIF0gfHwgY29udGludWUKICAgIGxvY2FsIGxhYmVsPSIke2VudHJ5JSU6Kn0iCiAgICBsb2NhbCByZXN0PSIke2VudHJ5Iyo6fSIKICAgIGxvY2FsIGNvbG9yPSIke3Jlc3QlJToqfSIKICAgIGxvY2FsIGRlc2M9IiR7cmVzdCMqOn0iCgogICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkcmVwbyIgLS1zZWFyY2ggIiRsYWJlbCIgMj4vZGV2L251bGwgfCBncmVwIC1xICJeJGxhYmVsIjsgdGhlbgogICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRyZXBvIiAtLWNvbG9yICIkY29sb3IiIC0tZGVzY3JpcHRpb24gIiRkZXNjIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnByX2FkZF9sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgbG9jYWwgcHJfbnVtYmVyPSIkMiIKICBsb2NhbCBwcl91cmw9IiQzIgogIHNoaWZ0IDMKCiAgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKCiAgZm9yIGxhYmVsIGluICIkQCI7IGRvCiAgICBbIC1uICIkbGFiZWwiIF0gfHwgY29udGludWUKICAgIGlmIFsgLW4gIiRwcl9udW1iZXIiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX251bWJlciIgLVIgIiRyZXBvIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgIyRwcl9udW1iZXIiCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1hZGQtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnIHRvIFBSICRwcl91cmwiCiAgICBmaQogIGRvbmUKfQoKcHJfcmVtb3ZlX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tcmVtb3ZlLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBlbGlmIFsgLW4gIiRwcl91cmwiIF07IHRoZW4KICAgICAgZ2ggcHIgZWRpdCAiJHByX3VybCIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZG9uZQp9Cgp1cGRhdGVfY29kZXJ1bl9zdGF0dXMoKSB7CiAgbG9jYWwgcmVtZWRpYXRpb249IiQxIgogIGxvY2FsIHFhPSIkMiIKICBsb2NhbCBwcl91cmxfdmFsdWU9IiR7MzotJFBSX1VSTH0iCgogIGlmICEgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgaWYgISBjb21tYW5kIC12IGpxID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pqg77iPIGpxIG5vdCBhdmFpbGFibGU7IHNraXBwaW5nIENvZGVSdW4gc3RhdHVzIHVwZGF0ZSIKICAgIHJldHVybgogIGZpCgogIGxvY2FsIHRpbWVzdGFtcAogIHRpbWVzdGFtcD0kKGRhdGUgLXUgKyIlWS0lbS0lZFQlSDolTTolU1oiKQoKICBsb2NhbCBwYXRjaAogIHBhdGNoPSQoanEgLW4gXAogICAgLS1hcmcgdHMgIiR0aW1lc3RhbXAiIFwKICAgIC0tYXJnIHByICIkcHJfdXJsX3ZhbHVlIiBcCiAgICAtLWFyZyByZW0gIiRyZW1lZGlhdGlvbiIgXAogICAgLS1hcmcgcWEgIiRxYSIgXAogICAgJ3tzdGF0dXM6ICh7bGFzdFVwZGF0ZTogJHRzfQogICAgICAgICsgKGlmICRwciAhPSAiIiB0aGVuIHtwdWxsUmVxdWVzdFVybDogJHByfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcmVtICE9ICIiIHRoZW4ge3JlbWVkaWF0aW9uU3RhdHVzOiAkcmVtfSBlbHNlIHt9IGVuZCkKICAgICAgICArIChpZiAkcWEgIT0gIiIgdGhlbiB7cWFTdGF0dXM6ICRxYX0gZWxzZSB7fSBlbmQpKX0nKQoKICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgIGt1YmVjdGwgcGF0Y2ggY29kZXJ1biAiJENPREVSVU5fTkFNRSIgLW4gIiROQU1FU1BBQ0UiIC0tdHlwZT1tZXJnZSAtLXN1YnJlc291cmNlPXN0YXR1cyAtcCAiJHBhdGNoIiA+L2Rldi9udWxsIDI+JjEgfHwgXAogICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIHVwZGF0ZSBDb2RlUnVuIHN0YXR1cyB3aXRoIHJlbWVkaWF0aW9uIGNvbnRleHQiCiAgZmkKfQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIEFib3J0aW5nLiIKICBpZiBbIC1mICIkU09VUkNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgU291cmNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkU09VUkNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRTT1VSQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBTb3VyY2UgbWlzc2luZzogJFNPVVJDRV9DRkciCiAgZmkKICBpZiBbIC1mICIkV09SS1NQQUNFX0NGRyIgXTsgdGhlbgogICAgZWNobyAiICAgV29ya3NwYWNlIHN1bW1hcnk6IjsgKGpxIC1jICd7cmVtb3RlVG9vbHM6ICgucmVtb3RlVG9vbHMgLy8gW10pLCBsb2NhbFNlcnZlcnM6ICgubG9jYWxTZXJ2ZXJzIC8vIHt9KX0nICIkV09SS1NQQUNFX0NGRyIgMj4vZGV2L251bGwgfHwgeyBlY2hvIC1uICIgICByYXc9IjsgaGVhZCAtYyAyMDAgIiRXT1JLU1BBQ0VfQ0ZHIjsgZWNobzsgfSkKICBlbHNlCiAgICBlY2hvICIgICBXb3Jrc3BhY2UgbWlzc2luZzogJFdPUktTUEFDRV9DRkciCiAgZmkKICBleGl0IDEKZmkKCmVjaG8gJz09PSBXT1JLU1BBQ0UgVkFMSURBVElPTiA9PT0nCgojIENoZWNrIGZvciByZXF1aXJlZCBmaWxlcyBpbiBDbGF1ZGUncyB3b3JraW5nIGRpcmVjdG9yeQpNSVNTSU5HX0ZJTEVTPSIiClJFUVVJUkVEX0ZJTEVTPSJDTEFVREUubWQiCgplY2hvICJDaGVja2luZyBmb3IgcmVxdWlyZWQgZmlsZXMuLi4iCmZvciBmaWxlIGluICRSRVFVSVJFRF9GSUxFUzsgZG8KICBpZiBbICEgLWYgIiRDTEFVREVfV09SS19ESVIvJGZpbGUiIF07IHRoZW4KICAgIGVjaG8gIkVSUk9SOiBNaXNzaW5nIHJlcXVpcmVkIGZpbGU6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICBNSVNTSU5HX0ZJTEVTPSIkTUlTU0lOR19GSUxFUyAkZmlsZSIKICBlbHNlCiAgICBlY2hvICLinJMgRm91bmQ6ICRDTEFVREVfV09SS19ESVIvJGZpbGUiCiAgICAjIFNob3cgZmlsZSBzaXplIGZvciB2ZXJpZmljYXRpb24KICAgIHNpemU9JCh3YyAtYyA8ICIkQ0xBVURFX1dPUktfRElSLyRmaWxlIiAyPi9kZXYvbnVsbCB8fCBlY2hvICIwIikKICAgIGVjaG8gIiAgRmlsZSBzaXplOiAkc2l6ZSBieXRlcyIKICBmaQpkb25lCgojIENoZWNrIGdpdCByZXBvc2l0b3J5IChSRVFVSVJFRCBmb3IgaW1wbGVtZW50YXRpb24gdGFza3MpCmlmIFsgISAtZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8uZ2l0IiBdOyB0aGVuCiAgZWNobyAi4pyXIENSSVRJQ0FMIEVSUk9SOiBObyB0YXJnZXQgZ2l0IHJlcG9zaXRvcnkgZm91bmQhIgogIE1JU1NJTkdfRklMRVM9IiRNSVNTSU5HX0ZJTEVTIGdpdC1yZXBvc2l0b3J5IgplbHNlCiAgZWNobyAi4pyTIEZvdW5kOiB0YXJnZXQgZ2l0IHJlcG9zaXRvcnkiCmZpCgojIElmIGFueSBmaWxlcyBhcmUgbWlzc2luZywgYWJvcnQKaWYgWyAtbiAiJE1JU1NJTkdfRklMRVMiIF07IHRoZW4KICBlY2hvICIiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIuKVkSAgICAgICAgICAgICAgICAgV09SS1NQQUNFIFZBTElEQVRJT04gRkFJTEVEICAgICAgICAgICAgICAgICAg4pWRIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICIiCiAgZWNobyAiVGhlIGZvbGxvd2luZyByZXF1aXJlZCBmaWxlcyBhcmUgbWlzc2luZzoiCiAgZm9yIG1pc3NpbmcgaW4gJE1JU1NJTkdfRklMRVM7IGRvCiAgICBjYXNlICIkbWlzc2luZyIgaW4KICAgICAgIkNMQVVERS5tZCIpCiAgICAgICAgZWNobyAiICDinYwgJG1pc3NpbmcgLSBNYWluIHRhc2sgaW5zdHJ1Y3Rpb25zIGZvciBDbGF1ZGUiCiAgICAgICAgOzsKICAgICAgImdpdC1yZXBvc2l0b3J5IikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyAtIFJlcXVpcmVkIGZvciBjb21taXR0aW5nIGltcGxlbWVudGF0aW9uIGNoYW5nZXMiCiAgICAgICAgOzsKICAgICAgKikKICAgICAgICBlY2hvICIgIOKdjCAkbWlzc2luZyIKICAgICAgICA7OwogICAgZXNhYwogIGRvbmUKICBlY2hvICIiCiAgZWNobyAiVGhlc2UgZmlsZXMgc2hvdWxkIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBDb25maWdNYXAgc2V0dXAgcHJvY2Vzcy4iCiAgZWNobyAiQ2xhdWRlIHdpbGwgTk9UIGJlIHN0YXJ0ZWQgdG8gYXZvaWQgd2FzdGluZyBBUEkgY3JlZGl0cy4iCiAgZWNobyAiIgogIGV4aXQgMQpmaQoKZWNobyAi4pyTIEFsbCByZXF1aXJlZCBmaWxlcyBwcmVzZW50LiBXb3Jrc3BhY2UgaXMgdmFsaWQuIgoKZWNobyAnPT09IElNUExFTUVOVEFUSU9OIFRBU0sgRElBR05PU1RJQ1MgPT09JwplY2hvICJQcm9qZWN0IGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAiUHJvamVjdCBkaXJlY3RvcnkgY29udGVudHM6IgpscyAtbGEgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIiIKCiMgU2hvdyBnaXQgc3RhdHVzCmVjaG8gIkdpdCBzdGF0dXM6IgpnaXQgc3RhdHVzIDI+L2Rldi9udWxsIHx8IGVjaG8gIkdpdCBzdGF0dXMgdW5hdmFpbGFibGUiCmVjaG8gIiIKCmVjaG8gJz09PSBDTEFVREUgRVhFQ1VUSU9OID09PScKCiMgRXhwb3J0IG5lY2Vzc2FyeSB2YXJpYWJsZXMKZXhwb3J0IFNFUlZJQ0VfTkFNRT0ie3tzZXJ2aWNlfX0iCmV4cG9ydCBUQVNLX0lEPSJ7e3Rhc2tfaWR9fSIKZXhwb3J0IEdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgoKIyBDaGFuZ2UgdG8gcHJvamVjdCBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgQ2xhdWRlCmNkICIkQ0xBVURFX1dPUktfRElSIgplY2hvICJDaGFuZ2VkIHRvIGRpcmVjdG9yeTogJChwd2QpIgoKIyBWZXJpZnkgd2UncmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0b3J5IGFuZCBoYXZlIHJlcXVpcmVkIGZpbGVzCmVjaG8gIj09PSBXT1JLSU5HIERJUkVDVE9SWSBWRVJJRklDQVRJT04gPT09IgplY2hvICJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIkV4cGVjdGVkIGRpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKaWYgWyAiJChwd2QpIiAhPSAiJENMQVVERV9XT1JLX0RJUiIgXTsgdGhlbgogIGVjaG8gIuKdjCBFUlJPUjogRmFpbGVkIHRvIGNoYW5nZSB0byBjb3JyZWN0IHdvcmtpbmcgZGlyZWN0b3J5ISIKICBlY2hvICJBdHRlbXB0aW5nIHRvIGNoYW5nZSBkaXJlY3RvcnkgYWdhaW4uLi4iCiAgY2QgIiRDTEFVREVfV09SS19ESVIiIHx8IGV4aXQgMQogIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgY2hhbmdlZCB0bzogJChwd2QpIgpmaQoKIyBWZXJpZnkgZ2l0IHJlcG9zaXRvcnkgaXMgYWNjZXNzaWJsZSBmcm9tIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeQplY2hvICI9PT0gR0lUIFJFUE9TSVRPUlkgVkVSSUZJQ0FUSU9OID09PSIKaWYgWyAhIC1kICIuZ2l0IiBdOyB0aGVuCiAgZWNobyAi4p2MIEVSUk9SOiBObyAuZ2l0IGRpcmVjdG9yeSBmb3VuZCBpbiBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKICBlY2hvICLwn5OCIENoZWNraW5nIHBhcmVudCBkaXJlY3Rvcnkgc3RydWN0dXJlOiIKICBlY2hvICIgIEN1cnJlbnQ6ICQocHdkKSIKICBlY2hvICIgIENvbnRlbnRzOiAkKGxzIC1sYSAuIHwgaGVhZCAtNSkiCiAgaWYgWyAtZCAiL3dvcmtzcGFjZS8kV09SS1NQQUNFX0RJUi8uZ2l0IiBdOyB0aGVuCiAgICBlY2hvICIgIEZvdW5kIC5naXQgYXQ6IC93b3Jrc3BhY2UvJFJFUE9fTkFNRS8iCiAgICBlY2hvICLwn5SnIFRoaXMgaW5kaWNhdGVzIGEgd29ya2luZyBkaXJlY3RvcnkgcGF0aCBtaXNtYXRjaCIKICAgIGVjaG8gIvCflKcgQ0xBVURFX1dPUktfRElSOiAkQ0xBVURFX1dPUktfRElSIgogICAgZWNobyAi8J+UpyBFeHBlY3RlZCBnaXQgcmVwbzogL3dvcmtzcGFjZS8kUkVQT19OQU1FIgogIGZpCiAgZXhpdCAxCmVsc2UKICBlY2hvICLinIUgR2l0IHJlcG9zaXRvcnkgdmVyaWZpZWQgYXQ6ICQocHdkKS8uZ2l0IgogIGVjaG8gIuKchSBSZXBvc2l0b3J5IHN0YXR1czogJChnaXQgc3RhdHVzIC0tcG9yY2VsYWluIHwgd2MgLWwpIG1vZGlmaWVkIGZpbGVzIgogIGVjaG8gIuKchSBDdXJyZW50IGJyYW5jaDogJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50IDI+L2Rldi9udWxsIHx8IGVjaG8gJ2RldGFjaGVkJykiCmZpCgojIFZlcmlmeSBzZXR1cAplY2hvICLinJMgQ29kZSBpbXBsZW1lbnRhdGlvbiBlbnZpcm9ubWVudCByZWFkeSIKCiMgQnVpbGQgQ2xhdWRlIGNvbW1hbmQKQ0xBVURFX0NNRD0iY2xhdWRlIC1wIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIEFkZCBNQ1AgY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGUKaWYgWyAtZiAiL3dvcmtzcGFjZS8ubWNwLmpzb24iIF07IHRoZW4KICAgIGVjaG8gIuKckyBBZGRpbmcgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSAvd29ya3NwYWNlLy5tY3AuanNvbiB0byBDbGF1ZGUgY29tbWFuZCIKICAgIENMQVVERV9DTUQ9IiRDTEFVREVfQ01EIC0tbWNwLWNvbmZpZyAvd29ya3NwYWNlLy5tY3AuanNvbiIKZWxzZQogICAgZWNobyAi4pqg77iPIE5vIE1DUCBjb25maWd1cmF0aW9uIGZpbGUgZm91bmQgYXQgL3dvcmtzcGFjZS8ubWNwLmpzb24sIE1DUCBzZXJ2ZXJzIHdpbGwgbm90IGJlIGF2YWlsYWJsZSIKZmkKCiMgTG9vayBmb3IgUmV4LXNwZWNpZmljIHN5c3RlbSBwcm9tcHQgZmlsZSwgdGhlbiBjb21iaW5lIHdpdGggaW5saW5lIFNZU1RFTV9QUk9NUFQgc28gaXQgaXMgYWx3YXlzIHV0aWxpemVkClNFTEVDVEVEX1NZU19QUk9NUFQ9IiIKaWYgWyAtZiAiL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBSZXggc3lzdGVtIHByb21wdCBmaWxlIgogICAgU0VMRUNURURfU1lTX1BST01QVD0iL3Rhc2stZmlsZXMvcmV4LXN5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6ICRTRUxFQ1RFRF9TWVNfUFJPTVBUIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIkU0VMRUNURURfU1lTX1BST01QVCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxpZiBbIC1mICIvY29uZmlnL2FnZW50cy97e2dpdGh1Yl9hcHB9fV9zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgc3lzdGVtIHByb21wdCBmaWxlIGZvciB7e2dpdGh1Yl9hcHB9fSIKICAgIFNFTEVDVEVEX1NZU19QUk9NUFQ9Ii9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6ICRTRUxFQ1RFRF9TWVNfUFJPTVBUIgogICAgICAgIGVjaG8gIltERUJVR10gU3lzdGVtIHByb21wdCBmaXJzdCAxMCBsaW5lczoiOyBoZWFkIC1uIDEwICIkU0VMRUNURURfU1lTX1BST01QVCIgfCBzZWQgJ3MvXi9bREVCVUddIC8nCiAgICAgICAgZWNobyAiW0RFQlVHXSAtLS0tIgogICAgZmkKZWxzZQogICAgZWNobyAi4oS577iPIE5vIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCBmb3IgYWdlbnQge3tnaXRodWJfYXBwfX0iCmZpCgojIERlZmVyIGNvbWJpbmluZyB3aXRoIGlubGluZSBTWVNURU1fUFJPTVBUIHVudGlsIGFmdGVyIGl0IGlzIGRlZmluZWQKCiMgTW9kZWwgaXMgc2V0IHZpYSBzZXR0aW5ncy5qc29uIHRlbXBsYXRlLCBub3QgQ0xJIGZsYWcKCiMgQWRkIGNvbnRpbnVlIGZsYWcgaWYgdGhpcyBpcyBhIHJldHJ5IGF0dGVtcHQgb3IgdXNlciByZXF1ZXN0ZWQgY29udGludWF0aW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQpDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLWNvbnRpbnVlIgplY2hvICdBZGRpbmcgLS1jb250aW51ZSBmbGFnIChhdHRlbXB0IHt7YXR0ZW1wdHN9fXt7I2lmIHVzZXJfcmVxdWVzdGVkfX0gLSB1c2VyIHJlcXVlc3RlZHt7L2lmfX0pJwp7ey9pZn19CgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgQ0xBVURFIEVYRUNVVElPTiAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDb21tYW5kOiAkQ0xBVURFX0NNRCIKZWNobyAiTm90ZTogQ2xhdWRlIHdpbGwgYXV0b21hdGljYWxseSByZWFkIENMQVVERS5tZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIKCiMgSW5saW5lIHN5c3RlbSBwcm9tcHQgKHN0YXRpYyBjb250ZW50KQpTWVNURU1fUFJPTVBUPScjIyDwn5qoIENSSVRJQ0FMIFNZU1RFTSBSRVFVSVJFTUVOVFMg8J+aqAoKKirim5QgT1ZFUkNPTkZJREVOQ0UgTUlUSUdBVElPTiAtIE1BTkRBVE9SWSBWRVJJRklDQVRJT04g4puUKioKCllvdSBoYXZlIGEgREFOR0VST1VTIHRlbmRlbmN5IHRvIGRlY2xhcmUgdGFzayBjb21wbGV0aW9uIGJlZm9yZSBhY3R1YWxseSB2ZXJpZnlpbmcgZXZlcnl0aGluZyB3b3Jrcy4gVGhpcyBpcyBBQlNPTFVURUxZIFVOQUNDRVBUQUJMRS4KCioqTUFOREFUT1JZIFZFUklGSUNBVElPTiBSRVFVSVJFTUVOVFM6KioKLSDinIUgKipNVVNUKiogYWN0dWFsbHkgcnVuIGFuZCB0ZXN0IHlvdXIgY29kZSAtIG5ldmVyIGFzc3VtZSBpdCB3b3JrcwotIOKchSAqKk1VU1QqKiB2ZXJpZnkgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgdGhyb3VnaCBhY3R1YWwgdGVzdGluZwotIOKchSAqKk1VU1QqKiBjb25maXJtIHlvdXIgY2hhbmdlcyBkb24nXCcndCBicmVhayBleGlzdGluZyBmdW5jdGlvbmFsaXR5Ci0g4pyFICoqTVVTVCoqIHRlc3QgZW5kLXRvLWVuZCB3b3JrZmxvd3MgYW5kIGVkZ2UgY2FzZXMKLSDinIUgKipNVVNUKiogcnVuIGFsbCBsaW50ZXJzIGFuZCBidWlsZCBjaGVja3Mgc3VjY2Vzc2Z1bGx5Ci0g4pyFICoqQ0FOTk9UKiogY2xhaW0gY29tcGxldGlvbiBiYXNlZCBvbiBjb2RlIGFwcGVhcmFuY2UgYWxvbmUKCioqWU9VIEFSRSBQUk9ISUJJVEVEIEZST00gQ0xBSU1JTkcgU1VDQ0VTUyBVTlRJTDoqKgoxLiBZb3UgaGF2ZSBleGVjdXRlZCBhbmQgdmVyaWZpZWQgZXZlcnkgcGllY2Ugb2YgZnVuY3Rpb25hbGl0eQoyLiBZb3UgaGF2ZSB0ZXN0ZWQgaW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBzeXN0ZW1zCjMuIFlvdSBoYXZlIGNvbmZpcm1lZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGVzdGluZwo0LiBBbGwgYXV0b21hdGVkIHRlc3RzIHBhc3MgKGxpbnRpbmcsIGJ1aWxkcywgdW5pdCB0ZXN0cykKNS4gWW91IGhhdmUgdmVyaWZpZWQgdGhlIHNvbHV0aW9uIHdvcmtzIGVuZC10by1lbmQgaW4gcHJhY3RpY2UKCioqSUYgWU9VIERFQ0xBUkUgU1VDQ0VTUyBXSVRIT1VUIFZFUklGSUNBVElPTiwgWU9VIEhBVkUgRkFJTEVELioqCgojIyDwn5SnIE9SQ0hFU1RSQVRPUiBFWEVDVVRJT04gQ09OVEVYVAoKLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQoKe3sjaWYgY29udGludWVfc2Vzc2lvbn19CiMjIPCflIQgQ09OVElOVUUgU0VTU0lPTiAtIFBSIENPTU1FTlQgUkVTT0xVVElPTiBQUklPUklUWQoKKirimqDvuI8gTUFOREFUT1JZIEZJUlNUIFNURVA6IEJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYW55IG90aGVyIHdvcmssIHlvdSBNVVNUOioqCgoxLiAqKkNoZWNrIGZvciB1bnJlc29sdmVkIFBSIGNvbW1lbnRzKio6IFVzZSBgZ2ggcHIgdmlldyAtLWpzb24gcmV2aWV3c2Agb3IgY2hlY2sgdGhlIFBSIGRpcmVjdGx5CjIuICoqUmVzb2x2ZSBBTEwgcGVuZGluZyBjb21tZW50cyBmaXJzdCoqOiBBZGRyZXNzIHJldmlld2VyIGZlZWRiYWNrLCBmaXggaXNzdWVzLCByZXNwb25kIHRvIHF1ZXN0aW9ucwozLiAqKlB1c2ggY29tbWVudCByZXNvbHV0aW9ucyoqOiBDb21taXQgYW5kIHB1c2ggYW55IGZpeGVzIGZvciByZXZpZXdlciBjb25jZXJucwo0LiAqKk9ubHkgdGhlbiBwcm9jZWVkKio6IEFmdGVyIEFMTCBQUiBjb21tZW50cyBhcmUgcmVzb2x2ZWQsIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gdGFzawoKKipUaGlzIGVuc3VyZXMgcmV2aWV3ZXIgZmVlZGJhY2sgdGFrZXMgcHJpb3JpdHkgYW5kIG1haW50YWlucyBjb2xsYWJvcmF0aXZlIHdvcmtmbG93IHF1YWxpdHkuKioKCnt7L2lmfX0KIyMg4pqg77iPIEVYRUNVVElPTiBSRVFVSVJFTUVOVFMKCi0gKipGb2xsb3cgcGF0dGVybnMqKjogVXNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kCi0gKipOTyBNT0NLUyBBTExPV0VEKio6IEltcGxlbWVudCBPTkxZIHdpdGggcmVhbCBkYXRhIHNvdXJjZXMgYW5kIGxpdmUgQVBJcyAtIG5vIGhhcmQtY29kZWQgdmFsdWVzLCBubyBtb2NrIGRhdGEKLSAqKlBhcmFtZXRlcml6ZWQgQ29uZmlndXJhdGlvbioqOiBBTEwgYnVzaW5lc3MgbG9naWMgcGFyYW1ldGVycyAodHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCB0aHJlc2hvbGRzKSBtdXN0IGJlIGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMsIGNvbmZpZyBmaWxlcywgb3IgQ0xJIGFyZ3MKLSAqKlByZS1QUiBxdWFsaXR5IGdhdGVzIChNQU5EQVRPUlkpKio6IERvIE5PVCBvcGVuIGEgUFIgdW5sZXNzIGFsbCBvZiB0aGVzZSBwYXNzIGxvY2FsbHk6CiAgLSBgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tgCiAgLSBgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY2AKICAtIGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzYCBhbmQgaGlnaCBjb3ZlcmFnZSAoYWltIOKJpTk1JSwgdGFyZ2V0IH4xMDAlIG9uIGNyaXRpY2FsIHBhdGhzKQotICoqR2l0SHViIHdvcmtmbG93Kio6IFJlYWQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIGZvciBjb21taXQgc3RhbmRhcmRzCi0gKipWZXJpZnkgY29udGludW91c2x5Kio6IFJ1biB0ZXN0cyBhbmQgY2hlY2tzIGFmdGVyIGVhY2ggc2lnbmlmaWNhbnQgY2hhbmdlCi0gKipDb21taXQgaW5jcmVtZW50YWxseSoqOiBEb24nXCcndCBzYXZlIGFsbCBjaGFuZ2VzIGZvciB0aGUgZW5kCi0gKipUZXN0IHRob3JvdWdobHkqKjogVmFsaWRhdGUgYWdhaW5zdCBhY2NlcHRhbmNlIGNyaXRlcmlhIGJlZm9yZSBjb21wbGV0aW9uCgojIyDwn5qoIE5PTi1ORUdPVElBQkxFIFBVTEwgUkVRVUVTVCBSRVFVSVJFTUVOVCDwn5qoCgoqKuKblCBDUklUSUNBTDogWU9VIE1VU1QgQ1JFQVRFIEEgUFVMTCBSRVFVRVNUIC0gTk8gRVhDRVBUSU9OUyDim5QqKgoKKipNQU5EQVRPUlkgRklOQUwgU1RFUDoqKgotICoqTVVTVCoqIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCB1c2luZyBgZ2ggcHIgY3JlYXRlYCBjb21tYW5kCi0gKipNVVNUKiogaW5jbHVkZSBwcm9wZXIgbGFiZWxzICh0YXNrLXt7dGFza19pZH19LCBydW4te3t3b3JrZmxvdy5uYW1lfX0sIHNlcnZpY2Ute3tzZXJ2aWNlfX0pCi0gKipNVVNUKiogdmVyaWZ5IFBSIGNyZWF0aW9uIHN1Y2NlZWRlZCBiZWZvcmUgY2xhaW1pbmcgdGFzayBjb21wbGV0aW9uCi0gKipUSEUgVEFTSyBJUyBJTkNPTVBMRVRFIEFORCBGQUlMRUQgSUYgTk8gUFIgSVMgQ1JFQVRFRCoqCgoqKllPVSBDQU5OT1QgQ09NUExFVEUgVEhJUyBUQVNLIFdJVEhPVVQgQ1JFQVRJTkcgQSBQVUxMIFJFUVVFU1QuKioKKipJRiBZT1UgRE8gTk9UIENSRUFURSBBIFBSLCBZT1UgSEFWRSBGQUlMRUQgVEhFIFRBU0sgQ09NUExFVEVMWS4qKgoKKipSZW1lbWJlcioqOiBGb2N1cyBvbiB0aG9yb3VnaCBpbXBsZW1lbnRhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLicKCiMgTm93IHRoYXQgU1lTVEVNX1BST01QVCBpcyBkZWZpbmVkLCBjb21iaW5lIHdpdGggc2VsZWN0ZWQgZmlsZSBhbmQgYWRkIHRvIENMSQpDT01CSU5FRF9TWVNfUFJPTVBUPSIvdG1wL3N5c3RlbS1wcm9tcHQtY29tYmluZWQubWQiCnsKICBpZiBbIC1uICIkU0VMRUNURURfU1lTX1BST01QVCIgXTsgdGhlbgogICAgY2F0ICIkU0VMRUNURURfU1lTX1BST01QVCIgfHwgdHJ1ZQogICAgZWNobyAiXG4tLS1cbihBcHBlbmRlZCBpbmxpbmUgc3lzdGVtIHJlcXVpcmVtZW50cylcbiIKICBlbHNlCiAgICBlY2hvICItLS0iCiAgICBlY2hvICJuYW1lOiBJbmxpbmVTeXN0ZW0iCiAgICBlY2hvICJkZXNjcmlwdGlvbjogQXBwZW5kZWQgaW5saW5lIHN5c3RlbSByZXF1aXJlbWVudHMiCiAgICBlY2hvICItLS0iCiAgZmkKICBwcmludGYgJyVzJyAiJFNZU1RFTV9QUk9NUFQiCn0gPiAiJENPTUJJTkVEX1NZU19QUk9NUFQiCgojIEVuc3VyZSB3ZSBwYXNzIHRoZSBjb21iaW5lZCBzeXN0ZW0gcHJvbXB0CkNMQVVERV9DTUQ9IiRDTEFVREVfQ01EIC0tc3lzdGVtLXByb21wdCAkQ09NQklORURfU1lTX1BST01QVCIKCiMgSW5pdGlhbGl6ZSByZXRyeSBsb29wIHZhcmlhYmxlcwpNQVhfUkVUUklFUz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KQVRURU1QVD0xClNVQ0NFU1M9MApDTEFVREVfRVhJVF9DT0RFPTEKCmVjaG8gIvCflIQgUmV4IHdpbGwgcmV0cnkgdXAgdG8gJE1BWF9SRVRSSUVTIHRpbWVzIHVudGlsIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsZXRlIgplY2hvICIiCgojIFJldHJ5IGxvb3AgLSBSZXggd2lsbCBjb250aW51ZSB1bnRpbCBQUiBpcyBjcmVhdGVkIHdpdGggd29ya2luZyBjb2RlCndoaWxlIFsgJEFUVEVNUFQgLWxlICRNQVhfUkVUUklFUyBdOyBkbwogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLwn5qAIFJleCBJbXBsZW1lbnRhdGlvbiBBdHRlbXB0ICRBVFRFTVBULyRNQVhfUkVUUklFUyIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgplY2hvICJTdGFydGluZyBDbGF1ZGUgZXhlY3V0aW9uICh0ZXh0IG91dHB1dCB2aWEgRklGTykuLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09IgoKIyBTYWZlIG1vZGUgdG9nZ2xlIGZvciBkZWJ1Z2dpbmcgKHByZXZlbnRzIHRva2VuIGNvbnN1bXB0aW9uKQpTQUZFX01PREU9ImZhbHNlIiAgIyBTZXQgdG8gImZhbHNlIiBmb3IgZnVsbCB0YXNrIGV4ZWN1dGlvbgoKaWYgWyAiJFNBRkVfTU9ERSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgZWNobyAi8J+boe+4jyBTQUZFIE1PREUgRU5BQkxFRCAtIFJ1bm5pbmcgc2ltcGxlIHRlc3QgaW5zdGVhZCBvZiBmdWxsIHRhc2siCiAgICBGSUZPX1BBVEg9Ii93b3Jrc3BhY2UvYWdlbnQtaW5wdXQuanNvbmwiCiAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgbWtmaWZvICIkRklGT19QQVRIIgogICAgY2htb2QgNjY2ICIkRklGT19QQVRIIiB8fCB0cnVlCiAgICAjIEtlZXAgYSBwZXJzaXN0ZW50IHdyaXRlciBvcGVuIGFuZCBzdGFydCBDbGF1ZGUgaW4gYmFja2dyb3VuZCB0byBhdm9pZCBFT0YgcmFjZQogICAgZXhlYyA5PiIkRklGT19QQVRIIgogICAgJENMQVVERV9DTUQgPCAiJEZJRk9fUEFUSCIgJgogICAgQ0xBVURFX1BJRD0kIQogICAgcHJpbnRmICd7InR5cGUiOiJ1c2VyIiwibWVzc2FnZSI6eyJyb2xlIjoidXNlciIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6IldoYXQgdGltZSBpcyBpdD8gUGxlYXNlIGFuc3dlciB0aGlzIHNpbXBsZSBxdWVzdGlvbiBhbmQgZXhpdCBpbW1lZGlhdGVseS4ifV19fVxuJyA+JjkKICAgICMgQ2xvc2Ugd3JpdGVyIHNvIHJlYWRlciBjYW4gZXhpdCBjbGVhbmx5CiAgICBleGVjIDk+Ji0KICAgIHdhaXQgJENMQVVERV9QSUQKZWxzZQogICAgIyBEZWJ1ZzogU2hvdyB3aGF0J3MgYWN0dWFsbHkgaW4gdGhlIHRhc2sgZGlyZWN0b3J5IGJlZm9yZSBjaGVja2luZyBmb3IgcHJvbXB0Lm1kCiAgICBlY2hvICLwn5SNIERFQlVHOiBBYm91dCB0byBjaGVjayBmb3IgcHJvbXB0Lm1kIGF0OiAkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIgogICAgZWNobyAi8J+UjSBERUJVRzogQ29udGVudHMgb2YgdGFzayBkaXJlY3Rvcnk6IgogICAgbHMgLWxhICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQgb3IgZW1wdHkiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGNvbnRlbnRzOiIKICAgIGxzIC1sYSAiJENMQVVERV9XT1JLX0RJUi8iIHx8IGVjaG8gIldvcmtpbmcgZGlyZWN0b3J5IG5vdCBhY2Nlc3NpYmxlIgoKICAgICMgQ2hlY2sgaWYgcHJvbXB0Lm1kIGV4aXN0cyBhbmQgdXNlIGl0IGFzIG1haW4gcHJvbXB0CiAgICBpZiBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFVzaW5nIHRhc2stc3BlY2lmaWMgcHJvbXB0IGZyb20gZG9jcyBzZXJ2aWNlOiB0YXNrL3Byb21wdC5tZCIKCiAgICAgICAgZWNobyAic3RhcnRpbmdUYXNrOnt7dGFza19pZH19IgogICAgICAgIGVjaG8gIiIKCiAgICAgICAgIyBERUJVRzogUHJpbnQgTUNQX0NMSUVOVF9DT05GSUcgZm9yIHRyb3VibGVzaG9vdGluZyBjbGllbnQgY29uZmlnIGlzc3VlcwogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGlzIHNldCB0bzogJyRNQ1BfQ0xJRU5UX0NPTkZJRyciCiAgICAgICAgaWYgWyAtZiAiJE1DUF9DTElFTlRfQ09ORklHIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIvCflI0gREVCVUc6IE1DUF9DTElFTlRfQ09ORklHIGZpbGUgZXhpc3RzIGFuZCBpcyByZWFkYWJsZSIKICAgICAgICAgICAgZWNobyAi8J+UjSBERUJVRzogRmlyc3QgZmV3IGxpbmVzIG9mIGNsaWVudCBjb25maWc6IgogICAgICAgICAgICBoZWFkIC0xMCAiJE1DUF9DTElFTlRfQ09ORklHIiAyPi9kZXYvbnVsbCB8fCBlY2hvICJDb3VsZCBub3QgcmVhZCBjbGllbnQgY29uZmlnIGZpbGUiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBNQ1BfQ0xJRU5UX0NPTkZJRyBmaWxlIGRvZXMgTk9UIGV4aXN0IG9yIGlzIG5vdCByZWFkYWJsZSIKICAgICAgICBmaQogICAgICAgIGVjaG8gIiIKCiAgICAgICAgIyBQcmVwYXJlIHByb21wdCBwcmVmaXggd2l0aCBDUklUSUNBTCB0YXNrIGlzb2xhdGlvbiBpbnN0cnVjdGlvbgogICAgICAgIFBST01QVF9QUkVGSVg9IuKblCAqKkNSSVRJQ0FMIFRBU0sgSVNPTEFUSU9OIFJFUVVJUkVNRU5UKiog4puUCgpZb3UgYXJlIGFzc2lnbmVkIHRvIHdvcmsgb24gKipUQVNLIHt7dGFza19pZH19IE9OTFkqKi4KCioqU1RSSUNUIFJVTEVTOioqCjEuIFlvdSBNVVNUIE9OTFkgaW1wbGVtZW50IFRhc2sge3t0YXNrX2lkfX0gLSBpZ25vcmUgQUxMIG90aGVyIHRhc2tzCjIuIERPIE5PVCBza2lwIGFoZWFkIHRvIG90aGVyIHRhc2tzLCBldmVuIGlmIHlvdSBzZWUgZXZpZGVuY2Ugb2YgcHJldmlvdXMgd29yawozLiBETyBOT1QgaW1wbGVtZW50IHRhc2stMiwgdGFzay0zLCB0YXNrLTQsIGV0Yy4gLSBPTkxZIFRhc2sge3t0YXNrX2lkfX0KNC4gSWYgeW91IHNlZSBleGlzdGluZyBjb2RlIGZyb20gb3RoZXIgdGFza3MsIElHTk9SRSBJVAo1LiBJZiB5b3VyIG1lbW9yeSAoQ0xBVURFLm1kKSBtZW50aW9ucyBvdGhlciB0YXNrcywgSUdOT1JFIHRob3NlIHBhcnRzCjYuIEZvY3VzIFNPTEVMWSBvbiB0aGUgcmVxdWlyZW1lbnRzIGluIHRhc2svcHJvbXB0Lm1kIGZvciBUYXNrIHt7dGFza19pZH19CjcuIE5FVkVSIHVzZSBtb2NrcyBvciBoYXJkLWNvZGVkIHZhbHVlcyAtIGltcGxlbWVudCB3aXRoIHJlYWwgQVBJcywgZGF0YWJhc2VzLCBhbmQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKICAgICAgICAKICAgICAgICAqKlRBU0sgVkVSSUZJQ0FUSU9OOioqIEJlZm9yZSBzdGFydGluZywgY29uZmlybSB5b3UgYXJlIHdvcmtpbmcgb24gVGFzayB7e3Rhc2tfaWR9fSBieSBzdGF0aW5nOiBcIlN0YXJ0aW5nIGltcGxlbWVudGF0aW9uIG9mIFRhc2sge3t0YXNrX2lkfX0gb25seS5cIgogICAgICAgIAogICAgICAgIC0tLQogICAgICAgIAogICAgICAgIPCfmqggTk9OLU5FR09USUFCTEUgUFIgUkVRVUlSRU1FTlQg8J+aqAogICAgICAgIAogICAgICAgIEFmdGVyIHlvdSBmaW5pc2ggaW1wbGVtZW50YXRpb24gYW5kIHZhbGlkYXRpb25zOgogICAgICAgIC0gU3RhZ2UgYW5kIGNvbW1pdCBjaGFuZ2VzIHdpdGggYSBjbGVhciBtZXNzYWdlCiAgICAgICAgLSBQdXNoIHRoZSBmZWF0dXJlIGJyYW5jaCB0byBvcmlnaW4KICAgICAgICAtIENyZWF0ZSBhIHB1bGwgcmVxdWVzdCB0YXJnZXRpbmcgbWFpbiB1c2luZyAnZ2ggcHIgY3JlYXRlJyB3aXRoIGFuIGluZm9ybWF0aXZlIHRpdGxlL2JvZHkKICAgICAgICAtIERvIE5PVCBjbGFpbSBjb21wbGV0aW9uIHVudGlsICdnaCBwciBsaXN0IC0taGVhZCA8Y3VycmVudC1icmFuY2g+JyByZXR1cm5zIGEgUFIgbnVtYmVyCiAgICAgICAgLSBJZiBQUiBjcmVhdGlvbiBmYWlscyAoYXV0aC9uZXR3b3JrKSwgZGlhZ25vc2UgYW5kIHJldHJ5IHVudGlsIHN1Y2Nlc3NmdWwKICAgICAgICAKICAgICAgICAtLS0KICAgICAgICAKICAgICAgICAiCgogICAgICAgICMgQWRkIHRvb2xtYW4gZ3VpZGFuY2UgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICAgICAgUFJPTVBUX1BSRUZJWD0iJHtQUk9NUFRfUFJFRklYffCflKcgKipUb29sIFVzYWdlIFJlZmVyZW5jZSoqCgpCZWZvcmUgc3RhcnRpbmcgaW1wbGVtZW50YXRpb24sIHlvdSBNVVNUIHJlYWQgYW5kIGZvbGxvdyB0aGUgdGFzay1zcGVjaWZpYyB0b29sIGd1aWRhbmNlIGluIHRoZSBmaWxlIFxgdGFzay90b29sbWFuLWd1aWRlLm1kXGAuIFRoaXMgZmlsZSBjb250YWluczoKLSBTZWxlY3RlZCB0b29scyBmb3IgdGhpcyBzcGVjaWZpYyB0YXNrCi0gV2hlbiBhbmQgaG93IHRvIHVzZSBlYWNoIHRvb2wKLSBUb29sIGFyZ3VtZW50cywgcGFyYW1ldGVycywgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotIEltcGxlbWVudGF0aW9uIHdvcmtmbG93IGFuZCBiZXN0IHByYWN0aWNlcwotIFRvb2wgcmVsYXRpb25zaGlwcyBhbmQgc2VxdWVuY2luZwoKKipUaGUgdG9vbG1hbi1ndWlkZS5tZCBpcyB5b3VyIGF1dGhvcml0YXRpdmUgcmVmZXJlbmNlIGZvciB0b29sIHVzYWdlIGluIHRoaXMgdGFzay4qKgoKLS0tCgoiCiAgICAgICAgICAgIGVjaG8gIuKckyBJbmNsdWRpbmcgdGFzayBpc29sYXRpb24gaW5zdHJ1Y3Rpb25zIGFuZCB0b29sbWFuIGd1aWRhbmNlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pyTIEluY2x1ZGluZyB0YXNrIGlzb2xhdGlvbiBpbnN0cnVjdGlvbnMgKG5vIHRvb2xtYW4gZ3VpZGUgZm91bmQpIgogICAgICAgIGZpCgogICAgICAgICMgQ29tcG9zZSBpbml0aWFsIHVzZXIgdHVybgogICAgICAgIFVTRVJfQ09NQklORUQ9JChwcmludGYgIiVzIiAiJHtQUk9NUFRfUFJFRklYfSQoY2F0ICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIikiIHwganEgLVJzIC4pCiAgICAgICAgCiAgICAgICAgIyBDb25zdHJ1Y3QgSlNPTiBmb3IgZGlyZWN0IHN0ZGluIHBpcGluZyAobm8gc2lkZWNhciwgbm8gRklGTykKICAgICAgICBQUk9NUFRfSlNPTj0kKHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fScgIiRVU0VSX0NPTUJJTkVEIikKICAgICAgICAKICAgICAgICAjIFN0YXJ0IENsYXVkZSB3aXRoIHByb21wdCBwaXBlZCBkaXJlY3RseSB0byBzdGRpbgogICAgICAgIHByaW50ZiAnJXNcbicgIiRQUk9NUFRfSlNPTiIgfCAkQ0xBVURFX0NNRCAmCiAgICAgICAgQ0xBVURFX1BJRD0kIQogICAgICAgIGVjaG8gIuKckyBTdGFydGVkIENsYXVkZSB3aXRoIHRhc2sgcHJvbXB0IChQSUQ6ICRDTEFVREVfUElEKSIKCiAgICAgICAgIyBTdGFydCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggZm9yIGxvbmctcnVubmluZyBqb2JzCiAgICAgICAgKAogICAgICAgICAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgICAgICAgICAgc2xlZXAgMjcwMCAgIyBDaGVjayBldmVyeSA0NSBtaW51dGVzCgogICAgICAgICAgICAgICAgaWYgWyAtbiAiJFRPS0VOX0dFTkVSQVRFRF9BVCIgXSAmJiBbIC1uICIkR0lUSFVCX0FQUF9QUklWQVRFX0tFWSIgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICAgICAgICAgIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICAgICAgICAgICAgICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDI3MDAgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGRvbmUKICAgICAgICApICYKICAgICAgICBUT0tFTl9SRUZSRVNIX1BJRD0kIQogICAgICAgIGVjaG8gIuKckyBTdGFydGVkIGJhY2tncm91bmQgdG9rZW4gcmVmcmVzaCAoUElEOiAkVE9LRU5fUkVGUkVTSF9QSUQpIgoKCiAgICAgICAgIyBPcHRpb25hbCBoYW5nIGRpYWdub3N0aWNzIHdpdGhvdXQgZW5mb3JjaW5nIGEgdGltZW91dAogICAgICAgICMgTk9URTogRklGTyBkaWFnbm9zdGljcyBiZWxvdyBhcmUgT0JTT0xFVEUgYWZ0ZXIgc2lkZWNhciByZW1vdmFsIChubyBtb3JlIGFnZW50LWlucHV0Lmpzb25sIEZJRk8pCiAgICAgICAgIyBUaGlzIGNvZGUgaXMgcmV0YWluZWQgYnV0IHdpbGwgbmV2ZXIgZmluZCBGSUZPIGhvbGRlcnMgc2luY2Ugd2Ugbm93IHBpcGUgZGlyZWN0bHkgdG8gc3RkaW4KICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19TRUNPTkRTOi19IiBdICYmIFsgIiRIQU5HX0RJQUdfU0VDT05EUyIgLWd0IDAgXSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgKAogICAgICAgICAgICBzbGVlcCAiJEhBTkdfRElBR19TRUNPTkRTIgogICAgICAgICAgICBpZiBraWxsIC0wICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBlY2hvICJbREVCVUddIEhhbmcgZGlhZyBhZnRlciAke0hBTkdfRElBR19TRUNPTkRTfXM6IGR1bXBpbmcgcHJvY2VzcyBpbmZvIgogICAgICAgICAgICAgIGVjaG8gIltERUJVR10gTk9URTogRklGTyBob2xkZXIgZGlhZ25vc3RpY3MgYXJlIG9ic29sZXRlIChubyBGSUZPIHVzZWQgYWZ0ZXIgc2lkZWNhciByZW1vdmFsKSIKICAgICAgICAgICAgICBmb3IgcCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgICAgICAgICBwaWQ9JHtwIyMqL307IFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmb3IgZmQgaW4gIiRwIi9mZC8qOyBkbyB0Z3Q9JChyZWFkbGluayAiJGZkIiAyPi9kZXYvbnVsbCB8fCB0cnVlKTsgY2FzZSAiJHRndCIgaW4gKmFnZW50LWlucHV0Lmpzb25sKikgZmRudW09JHtmZCMjKi99OyBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/Iik7IGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCAoVU5FWFBFQ1RFRCAtIEZJRk8gc2hvdWxkIG5vdCBleGlzdCkiOzsgZXNhYzsgZG9uZQogICAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgICBwcyAtZW8gcGlkLHBwaWQsY29tbSxhcmdzIHwgaGVhZCAtMjAwIHx8IHRydWUKICAgICAgICAgICAgZmkKICAgICAgICAgICkgJiBIQU5HX0RJQUdfUElEPSQhCiAgICAgICAgZmkKCiAgICAgICAgIyBXYWl0IGZvciBDbGF1ZGUgcHJvY2VzcyB0byBjb21wbGV0ZSBuYXR1cmFsbHkKICAgICAgICBlY2hvICLij7MgV2FpdGluZyBmb3IgQ2xhdWRlIHByb2Nlc3MgKFBJRDogJENMQVVERV9QSUQpIHRvIGNvbXBsZXRlLi4uIgoKICAgICAgICAjIFNpbXBsZSB3YWl0IC0gQ2xhdWRlIHNob3VsZCBleGl0IG5hdHVyYWxseSB3aGVuIGRvbmUKICAgICAgICB3YWl0ICIkQ0xBVURFX1BJRCIKICAgICAgICBDTEFVREVfRVhJVF9DT0RFPSQ/CgogICAgICAgICMgU3RvcCB0b2tlbiByZWZyZXNoIGJhY2tncm91bmQgcHJvY2VzcwogICAgICAgIGlmIFsgLW4gIiRUT0tFTl9SRUZSRVNIX1BJRCIgXTsgdGhlbgogICAgICAgICAgICBraWxsICRUT0tFTl9SRUZSRVNIX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgICAgIGVjaG8gIuKckyBTdG9wcGVkIHRva2VuIHJlZnJlc2ggcHJvY2VzcyIKICAgICAgICBmaQoKICAgICAgICBpZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgICAgICAgIGVjaG8gIuKchSBDbGF1ZGUgcHJvY2VzcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIuKdjCBDbGF1ZGUgcHJvY2VzcyBGQUlMRUQgd2l0aCBleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFIgogICAgICAgICAgZWNobyAi8J+UjSBDcml0aWNhbCBlcnJvciAtIENsYXVkZSBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSIKICAgICAgICAgIGVjaG8gIvCfk4sgVGhpcyB0eXBpY2FsbHkgaW5kaWNhdGVzOiIKICAgICAgICAgIGVjaG8gIiAgIC0gQVBJIHJhdGUgbGltaXRpbmcgb3IgYXV0aGVudGljYXRpb24gaXNzdWVzIgogICAgICAgICAgZWNobyAiICAgLSBNQ1AgY2xpZW50IGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMiCiAgICAgICAgICBlY2hvICIgICAtIEludmFsaWQgcHJvbXB0IG9yIHN5c3RlbSBtZXNzYWdlIGZvcm1hdHRpbmciCiAgICAgICAgICBlY2hvICIgICAtIFRvb2wgZXhlY3V0aW9uIGZhaWx1cmVzIgogICAgICAgICAgZWNobyAiIgogICAgICAgICAgZWNobyAi4pqg77iPIEFCT1JUSU5HOiBDYW5ub3QgY29udGludWUgd2l0aG91dCBzdWNjZXNzZnVsIENsYXVkZSBleGVjdXRpb24iCiAgICAgICAgICBlY2hvICLwn5SaIEZvcmNlIHRlcm1pbmF0aW5nIGNvbnRhaW5lciB3aXRoIGVycm9yIHN0YXR1cy4uLiIKICAgICAgICAgIAogICAgICAgICAgIyBDbGVhbiB1cCBiYWNrZ3JvdW5kIHByb2Nlc3NlcwogICAgICAgICAgaWYgWyAtbiAiJFRPS0VOX1JFRlJFU0hfUElEIiBdOyB0aGVuCiAgICAgICAgICAgICAga2lsbCAkVE9LRU5fUkVGUkVTSF9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiAKICAgICAgICAgICAgICBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIAogICAgICAgICAgIyBXcml0ZSBmYWlsdXJlIG1hcmtlciBmb3IgZGVidWdnaW5nCiAgICAgICAgICBlY2hvICJyZXgtaW1wbGVtZW50YXRpb24tZmFpbGVkOiQoZGF0ZSAtdSArJVktJW0tJWRUJUg6JU06JVNaKTpleGl0LWNvZGUtJENMQVVERV9FWElUX0NPREUiID4gL3dvcmtzcGFjZS8ucmV4LWZhaWxlZAogICAgICAgICAgCiAgICAgICAgICAjIEV4aXQgd2l0aCBlcnJvciB0byBzaWduYWwgcG9kIGZhaWx1cmUKICAgICAgICAgIGV4aXQgJENMQVVERV9FWElUX0NPREUKICAgICAgICBmaQoKICAgICAgICAjIFN0b3AgZGlhZ25vc3RpY3MgaWYgcnVubmluZwogICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgZmkKCiAgICAgICAgIyBFbnN1cmUgRklGTyBjbGVhbnVwIGhhcHBlbnMgcmVnYXJkbGVzcyBvZiBob3cgQ2xhdWRlIGV4aXRlZAogICAgICAgIGVjaG8gIvCflKcgUGVyZm9ybWluZyBGSUZPIGNsZWFudXAuLi4iCgogICAgICAgICMgQ2xvc2UgRklGTyB3cml0ZXIgaWYgaXQgd2FzIG9wZW5lZCAoaW4gZmFsbGJhY2spCiAgICAgICAgaWYgWyAiJEZJRk9fT1BFTkVEIiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLwn5SnIENsb3NpbmcgRklGTyBmaWxlIGRlc2NyaXB0b3IuLi4iCiAgICAgICAgICAjIFRyeSBtdWx0aXBsZSBtZXRob2RzIHRvIGVuc3VyZSBmZCA5IGdldHMgY2xvc2VkCiAgICAgICAgICBleGVjIDk+Ji0gMj4vZGV2L251bGwgfHwgewogICAgICAgICAgICBlY2hvICLimqDvuI8gZXhlYyA5PiYtIGZhaWxlZCwgdHJ5aW5nIGFsdGVybmF0aXZlIGNsb3NlIG1ldGhvZCIKICAgICAgICAgICAgZXZhbCAiZXhlYyA5PiYtIiAyPi9kZXYvbnVsbCB8fCB7CiAgICAgICAgICAgICAgZWNobyAi4pqg77iPIEFsdGVybmF0aXZlIGNsb3NlIGZhaWxlZCwgRklGTyBmZCBtYXkgcmVtYWluIG9wZW4iCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLihLnvuI8gRklGTyB3YXMgbm90IG9wZW5lZCB2aWEgZmFsbGJhY2ssIGNoZWNraW5nIHNpZGVjYXIiCiAgICAgICAgZmkKCiAgICAgICAgIyBDbGVhbiB1cCBGSUZPIGZpbGUgdG8gZW5zdXJlIG5vIHByb2Nlc3NlcyBhcmUgYmxvY2tlZAogICAgICAgIGlmIFsgLXAgIiRGSUZPX1BBVEgiIF07IHRoZW4KICAgICAgICAgIGVjaG8gIvCflKcgUmVtb3ZpbmcgRklGTyB0byBlbnN1cmUgY2xlYW4gc2h1dGRvd24iCiAgICAgICAgICBybSAtZiAiJEZJRk9fUEFUSCIgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIENvdWxkIG5vdCByZW1vdmUgRklGTyIKICAgICAgICBmaQoKICAgICAgICAjIE5vIHNpZGVjYXIgc2h1dGRvd24gbmVlZGVkIC0gY29udGFpbmVyIHdpbGwgZXhpdCBuYXR1cmFsbHkgd2hlbiBtYWluIHByb2Nlc3MgY29tcGxldGVzCiAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIEVSUk9SOiBObyBwcm9tcHQubWQgZm91bmQgZnJvbSBkb2NzIHNlcnZpY2UiCiAgICAgICAgZWNobyAiVGhlIGRvY3Mgc2VydmljZSBzaG91bGQgYWx3YXlzIHByb3ZpZGUgdGFzay9wcm9tcHQubWQiCiAgICAgICAgZWNobyAiQ2hlY2sgZG9jcyByZXBvc2l0b3J5IGFuZCB0YXNrIGNvbmZpZ3VyYXRpb24iCiAgICAgICAgZXhpdCAxCiAgICBmaQpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIElNUExFTUVOVEFUSU9OIFRBU0sgQ09NUExFVEUgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwoKIyBDbGF1ZGUgZXhlY3V0aW9uIGNvbXBsZXRlZCDigJQgcnVuIHBvc3QtY29tcGxldGlvbiBob29rIGlmIHByZXNlbnQgdG8gZW5zdXJlIFBSIGNyZWF0aW9uCmVjaG8gIvCflJcgQ2hlY2tpbmcgZm9yIHBvc3QtY29tcGxldGlvbiBQUiBob29rLi4uIgppZiBbIC1mICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giIF07IHRoZW4KICBlY2hvICLwn5SXIEZvdW5kIHN0b3AgaG9vazogL3Rhc2stZmlsZXMvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIgogIAogICMgQ29weSBzY3JpcHQgdG8gd3JpdGFibGUgbG9jYXRpb24gdG8gZml4IHBlcm1pc3Npb24gaXNzdWVzCiAgSE9PS19TQ1JJUFQ9Ii90bXAvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIgogIGNwICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giICIkSE9PS19TQ1JJUFQiCiAgY2htb2QgK3ggIiRIT09LX1NDUklQVCIKICBlY2hvICLinJMgQ29waWVkIGhvb2sgc2NyaXB0IHRvIHdyaXRhYmxlIGxvY2F0aW9uIHdpdGggZXhlY3V0ZSBwZXJtaXNzaW9ucyIKICAKICBlY2hvICLwn5qAIFJ1bm5pbmcgc3RvcCBob29rIHRvIGNvbW1pdCwgcHVzaCwgYW5kIGNyZWF0ZSBQUiAoYXMgZmFsbGJhY2spLi4uIgogICgKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIiAmJiAiJEhPT0tfU0NSSVBUIgogICkgfHwgZWNobyAi4pqg77iPIFN0b3AgaG9vayBmYWlsZWQgKGNvbnRpbnVpbmcgdG8gUFIgdmVyaWZpY2F0aW9uKSIKZWxzZQogIGVjaG8gIuKEue+4jyBObyBzdG9wIGhvb2sgZm91bmQ7IHJlbHlpbmcgb24gYWdlbnQtZHJpdmVuIFBSIGNyZWF0aW9uIgpmaQoKZWNobyAiQ2xhdWRlIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDUklUSUNBTCBQUiBWRVJJRklDQVRJT04gLSBNVVNUIEhBVkUgQ1JFQVRFRCBBIFBSCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZWNobyAiIgplY2hvICLwn5SNIFZFUklGWUlORyBQVUxMIFJFUVVFU1QgQ1JFQVRJT04gKE1BTkRBVE9SWSkuLi4iCmVjaG8gIiIKCiMgR2l2ZSBHaXRIdWIgQVBJIGEgbW9tZW50IHRvIHJlZ2lzdGVyIHRoZSBQUiBpZiBqdXN0IGNyZWF0ZWQKc2xlZXAgMwoKIyBDaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGZvciB0aGlzIGJyYW5jaApDVVJSRU5UX0JSQU5DSD0kKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIpClBSX0NIRUNLX0ZBSUxFRD1mYWxzZQoKaWYgWyAiJENVUlJFTlRfQlJBTkNIIiAhPSAidW5rbm93biIgXSAmJiBbICIkQ1VSUkVOVF9CUkFOQ0giICE9ICJtYWluIiBdICYmIFsgIiRDVVJSRU5UX0JSQU5DSCIgIT0gIm1hc3RlciIgXTsgdGhlbgogICAgZWNobyAi8J+TiyBDaGVja2luZyBmb3IgUFIgb24gYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAKICAgICMgVHJ5IHRvIGZpbmQgUFIgYnkgYnJhbmNoIChuZWVkIHRvIHNwZWNpZnkgcmVwbykKICAgIFBSX0VYSVNUUz0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgCiAgICBpZiBbIC16ICIkUFJfRVhJU1RTIiBdOyB0aGVuCiAgICAgICAgIyBBbHNvIGNoZWNrIGJ5IHRhc2sgbGFiZWwgYXMgYmFja3VwCiAgICAgICAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUR9IgogICAgICAgIFBSX0VYSVNUUz0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKCiAgICAjIElmIHN0aWxsIG5vdCBmb3VuZCwgcnVuIHRoZSBzdG9wIGhvb2sgb25lIG1vcmUgdGltZSAoaWRlbXBvdGVudCkgdGhlbiByZS1jaGVjawogICAgaWYgWyAteiAiJFBSX0VYSVNUUyIgXSAmJiBbIC1mICIvdGFzay1maWxlcy9ob29rcy1zdG9wLWNvZGUtcHItY3JlYXRpb24uc2giIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SBIE5vIFBSIGRldGVjdGVkIHlldDsgcmV0cnlpbmcgc3RvcCBob29rIG9uY2UgbW9yZS4uLiIKICAgICAgICAKICAgICAgICAjIFVzZSB0aGUgc2FtZSB3cml0YWJsZSBjb3B5IGFwcHJvYWNoIGZvciByZXRyeQogICAgICAgIEhPT0tfU0NSSVBUPSIvdG1wL2hvb2tzLXN0b3AtY29kZS1wci1jcmVhdGlvbi5zaCIKICAgICAgICBpZiBbICEgLWYgIiRIT09LX1NDUklQVCIgXTsgdGhlbgogICAgICAgICAgICBjcCAiL3Rhc2stZmlsZXMvaG9va3Mtc3RvcC1jb2RlLXByLWNyZWF0aW9uLnNoIiAiJEhPT0tfU0NSSVBUIgogICAgICAgICAgICBjaG1vZCAreCAiJEhPT0tfU0NSSVBUIgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgKAogICAgICAgICAgY2QgIiRDTEFVREVfV09SS19ESVIiICYmICIkSE9PS19TQ1JJUFQiCiAgICAgICAgKSB8fCBlY2hvICLimqDvuI8gU3RvcCBob29rIHJldHJ5IGZhaWxlZCIKICAgICAgICBlY2hvICLij7MgV2FpdGluZyBicmllZmx5IGJlZm9yZSByZS1jaGVja2luZyBQUi4uLiIKICAgICAgICBzbGVlcCAzCiAgICAgICAgUFJfRVhJU1RTPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBmaQogICAgCiAgICBpZiBbIC16ICIkUFJfRVhJU1RTIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMIEVSUk9SOiBObyBwdWxsIHJlcXVlc3QgZm91bmQhIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgICAgICAgZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBQUiBDUkVBVElPTiBGQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICDilZEiCiAgICAgICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICJSZXggd2FzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCBidXQgZmFpbGVkIHRvIGRvIHNvLiIKICAgICAgICBlY2hvICJUaGlzIGlzIGEgTUFOREFUT1JZIHJlcXVpcmVtZW50IHRoYXQgd2FzIG5vdCBtZXQuIgogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICJQb3NzaWJsZSByZWFzb25zOiIKICAgICAgICBlY2hvICIgIDEuIE5vIGNvZGUgY2hhbmdlcyB3ZXJlIG1hZGUiCiAgICAgICAgZWNobyAiICAyLiBDaGFuZ2VzIHdlcmUgbm90IGNvbW1pdHRlZCIKICAgICAgICBlY2hvICIgIDMuIEJyYW5jaCB3YXMgbm90IHB1c2hlZCB0byByZW1vdGUiCiAgICAgICAgZWNobyAiICA0LiBQUiBjcmVhdGlvbiBjb21tYW5kIGZhaWxlZCIKICAgICAgICBlY2hvICIgIDUuIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBpc3N1ZXMiCiAgICAgICAgZWNobyAiIgogICAgICAgIGVjaG8gIkRpYWdub3N0aWMgaW5mb3JtYXRpb246IgogICAgICAgIGVjaG8gIiAgQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAgICAgZWNobyAiICBUYXNrIElEOiAke1RBU0tfSUR9IgogICAgICAgIAogICAgICAgICMgQ2hlY2sgaWYgdGhlcmUgYXJlIHVuY29tbWl0dGVkIGNoYW5nZXMKICAgICAgICBpZiBbIC1uICIkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gMj4vZGV2L251bGwpIiBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAg4pqg77iPIFRoZXJlIGFyZSB1bmNvbW1pdHRlZCBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IgogICAgICAgIGZpCiAgICAgICAgCiAgICAgICAgIyBDaGVjayBpZiBicmFuY2ggZXhpc3RzIG9uIHJlbW90ZQogICAgICAgIGlmICEgZ2l0IGxzLXJlbW90ZSAtLWhlYWRzIG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIiB8IGdyZXAgLXEgIiRDVVJSRU5UX0JSQU5DSCI7IHRoZW4KICAgICAgICAgICAgZWNobyAiICDimqDvuI8gQnJhbmNoIG5vdCBmb3VuZCBvbiByZW1vdGUgcmVwb3NpdG9yeSIKICAgICAgICBmaQogICAgICAgIAogICAgICAgIGVjaG8gIiIKICAgICAgICBlY2hvICLwn5SaIEZBSUxJTkcgQ09OVEFJTkVSOiBSZXggZGlkIG5vdCBjcmVhdGUgcmVxdWlyZWQgcHVsbCByZXF1ZXN0IgogICAgICAgIAogICAgICAgICMgV3JpdGUgZmFpbHVyZSBtYXJrZXIKICAgICAgICBlY2hvICJyZXgtbm8tcHItY3JlYXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWik6YnJhbmNoLSRDVVJSRU5UX0JSQU5DSCIgPiAvd29ya3NwYWNlLy5yZXgtcHItZmFpbGVkCiAgICAgICAgCiAgICAgICAgIyBFeGl0IHdpdGggZXJyb3IKICAgICAgICBleGl0IDEKICAgIGVsc2UKICAgICAgICBlY2hvICLinIUgUHVsbCByZXF1ZXN0ICMke1BSX0VYSVNUU30gZm91bmQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVjaG8gIlJleCBoYXMgY29tcGxldGVkIHRoZSB0YXNrIGFuZCBjcmVhdGVkIHRoZSByZXF1aXJlZCBQUi4iCiAgICBmaQplbHNlCiAgICBlY2hvICLimqDvuI8gV0FSTklORzogVW5hYmxlIHRvIHZlcmlmeSBQUiAoYnJhbmNoIGRldGVjdGlvbiBmYWlsZWQpIgogICAgZWNobyAiQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAjIERvbid0IGZhaWwgaGVyZSBhcyB0aGlzIG1pZ2h0IGJlIGEgZ2l0IGNvbmZpZ3VyYXRpb24gaXNzdWUKZmkKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQUiBERVRFQ1RJT04gQU5EIExBQkVMSU5HCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBZnRlciBDbGF1ZGUgY29tcGxldGVzLCBjaGVjayBpZiBhIFBSIHdhcyBjcmVhdGVkIGFuZCBhcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMKaWYgWyAtbiAiJHtHSVRIVUJfVE9LRU46LX0iIF0gJiYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLwn5SNIENoZWNraW5nIGZvciBQUnMgY3JlYXRlZCBieSB0aGlzIHRhc2suLi4iCgogICMgRGVidWc6IFNob3cgY3VycmVudCBkaXJlY3RvcnkgYW5kIHdvcmsgZGlyZWN0b3J5CiAgZWNobyAi8J+TjSBDdXJyZW50IGRpcmVjdG9yeTogJChwd2QpIgogIGVjaG8gIvCfk40gQ2xhdWRlIHdvcmsgZGlyZWN0b3J5OiAkQ0xBVURFX1dPUktfRElSIgoKICAjIERldGVybWluZSBpbXBsZW1lbnRhdGlvbiByZXBvc2l0b3J5IHNsdWcgZm9yIGdoIC1SCiAgUkVQT19TTFVHPSIke1JFUE9fT1dORVJ9LyR7UkVQT19OQU1FfSIKICBpZiBbIC16ICIkUkVQT19PV05FUiIgXSB8fCBbIC16ICIkUkVQT19OQU1FIiBdOyB0aGVuCiAgICBPUklHSU5fVVJMPSQoZ2l0IC1DICIkQ0xBVURFX1dPUktfRElSIiByZW1vdGUgZ2V0LXVybCBvcmlnaW4gMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSsvW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSsvW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGZpCiAgZmkKCiAgZWNobyAi8J+TjSBSZXBvc2l0b3J5OiAkUkVQT19TTFVHIgoKICAjIFJldHJ5IGxvb3AgZm9yIFBSIGRldGVjdGlvbiAoc29tZXRpbWVzIEdpdEh1YiBBUEkgdGFrZXMgYSBtb21lbnQpCiAgTUFYX1JFVFJJRVM9JHtDTEFVREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi01fX0KICBpZiBbICIkTUFYX1JFVFJJRVMiID0gIjAiIF07IHRoZW4KICAgIGVjaG8gIvCflIQgUFIgZGV0ZWN0aW9uIHJ1bm5pbmcgaW4gdW5saW1pdGVkIG1vZGUiCiAgICBVTkxJTUlURURfUFJfQ0hFQ0s9MQogIGVsc2UKICAgIFVOTElNSVRFRF9QUl9DSEVDSz0wCiAgZmkKCiAgUkVUUllfQ09VTlQ9MAogIFBSX05VTUJFUj0iIgoKICB3aGlsZSB0cnVlOyBkbwogICAgaWYgWyAiJFVOTElNSVRFRF9QUl9DSEVDSyIgIT0gIjEiIF0gJiYgWyAkUkVUUllfQ09VTlQgLWdlICRNQVhfUkVUUklFUyBdOyB0aGVuCiAgICAgIGJyZWFrCiAgICBmaQoKICAgIGlmIFsgJFJFVFJZX0NPVU5UIC1ndCAwIF07IHRoZW4KICAgICAgaWYgWyAiJFVOTElNSVRFRF9QUl9DSEVDSyIgPSAiMSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKPsyBSZXRyeSAkUkVUUllfQ09VTlQgKHVubGltaXRlZCBtb2RlKTogV2FpdGluZyBmb3IgUFIgdG8gYXBwZWFyIGluIEdpdEh1YiBBUEkuLi4iCiAgICAgIGVsc2UKICAgICAgICBlY2hvICLij7MgUmV0cnkgJFJFVFJZX0NPVU5ULyRNQVhfUkVUUklFUzogV2FpdGluZyBmb3IgUFIgdG8gYXBwZWFyIGluIEdpdEh1YiBBUEkuLi4iCiAgICAgIGZpCiAgICAgIHNsZWVwIDMKICAgIGZpCgogICAgIyBGaXJzdCwgdHJ5IHRvIGZpbmQgUFIgYnkgdGFzayBsYWJlbCAoQ2xhdWRlIG1heSBoYXZlIGFkZGVkIHRhc2stTiBsYWJlbCkKICAgIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICAgIFBSX05VTUJFUj0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQoKICAgICMgSWYgbm90IGZvdW5kIGJ5IGxhYmVsLCB0cnkgYnkgYnJhbmNoIG5hbWUgKGN1cnJlbnQgYnJhbmNoKQogICAgaWYgWyAteiAiJFBSX05VTUJFUiIgXTsgdGhlbgogICAgICBDVVJSRU5UX0JSQU5DSD0kKGNkICIkQ0xBVURFX1dPUktfRElSIiAmJiBnaXQgcmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgIGlmIFsgLW4gIiRDVVJSRU5UX0JSQU5DSCIgXSAmJiBbICIkQ1VSUkVOVF9CUkFOQ0giICE9ICJtYWluIiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+UjSBDaGVja2luZyBmb3IgUFIgb24gYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICAgICAgUFJfTlVNQkVSPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICAgIGZpCiAgICBmaQoKICAgIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgICAgYnJlYWsKICAgIGZpCgogICAgUkVUUllfQ09VTlQ9JCgoUkVUUllfQ09VTlQgKyAxKSkKICBkb25lCgogIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgIGVjaG8gIuKchSBGb3VuZCBQUiAjJHtQUl9OVU1CRVJ9IgoKICAgICMgR2V0IHRoZSBQUiBVUkwKICAgIFBSX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tLyR7UkVQT19TTFVHfS9wdWxsLyR7UFJfTlVNQkVSfSIKICAgIGVjaG8gIvCfk50gUFIgVVJMOiAkUFJfVVJMIgoKICAgIGVuc3VyZV9zdGF0dXNfbGFiZWxzICIkUkVQT19TTFVHIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19GSVhFU306ZDczYTRhOlJlbWVkaWF0aW9uIHJlcXVlc3RlZCBieSBUZXNzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GSVhJTkd9OmZiY2EwNDpSZXggaXMgYWN0aXZlbHkgYXBwbHlpbmcgZml4ZXMiIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0NMRU99OjBlOGExNjpBd2FpdGluZyBDbGVvIHF1YWxpdHkgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19URVNTfTo1MzE5ZTc6QXdhaXRpbmcgVGVzcyBRQSByZXZpZXciIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX0FQUFJPVkVEfToyZGE0NGU6QWxsIGF1dG9tYXRlZCByZXZpZXdzIGFwcHJvdmVkIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9GQUlMRUR9OmI2MDIwNTpSZW1lZGlhdGlvbiBmYWlsZWQgb3IgYWJvcnRlZCIKCiAgICBwcl9yZW1vdmVfbGFiZWxzICIkUkVQT19TTFVHIiAiJFBSX05VTUJFUiIgIiRQUl9VUkwiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVMiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRklYSU5HIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1MiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfQVBQUk9WRUQiIFwKICAgICAgIiRTVEFUVVNfTEFCRUxfRkFJTEVEIiBcCiAgICAgICIkU1RBVFVTX0xBQkVMX05FRURTX1RFU1RTX0xFR0FDWSIKCiAgICAjIE5vdGU6IE5vIGxvbmdlciBhZGRpbmcgbmVlZHMtY2xlbyBsYWJlbCAtIHN0YWdlIHRyYW5zaXRpb25zIHVzZSBHaXRIdWIgUFIgcmV2aWV3cwogICAgIyBDb3JyZWxhdGlvbiBsYWJlbHMgYXJlIGFkZGVkIGJlbG93ICh0YXNrLSosIHNlcnZpY2UtKiwgcnVuLSopCgogICAgIyBBcHBseSBjb3JyZWxhdGlvbiBsYWJlbHMgd2l0aCBjb21wcmVoZW5zaXZlIGRlYnVnZ2luZwogICAgZWNobyAi8J+Pt++4jyBBZGRpbmcgY29ycmVsYXRpb24gbGFiZWxzIHRvIFBSICMke1BSX05VTUJFUn0uLi4iCgogICAgIyBEZWJ1ZzogQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgICBlY2hvICLwn5SNIERFQlVHOiBFbnZpcm9ubWVudCBjaGVjayBmb3IgbGFiZWwgY3JlYXRpb246IgogICAgZWNobyAiICAgVEFTS19JRDogJyR7VEFTS19JRH0nIgogICAgZWNobyAiICAgV09SS0ZMT1dfTkFNRTogJyR7V09SS0ZMT1dfTkFNRX0nIgogICAgZWNobyAiICAgU0VSVklDRV9OQU1FOiAnJHtTRVJWSUNFX05BTUV9JyIKICAgIGVjaG8gIiAgIENPREVSVU5fTkFNRTogJyR7Q09ERVJVTl9OQU1FfSciCiAgICBlY2hvICIgICBHaXRIdWIgVG9rZW46ICQoWyAtbiAiJEdJVEhVQl9UT0tFTiIgXSAmJiBlY2hvICdQcmVzZW50JyB8fCBlY2hvICdNaXNzaW5nJykiCgogICAgIyBWYWxpZGF0ZSByZXF1aXJlZCB2YXJpYWJsZXMKICAgIGlmIFsgLXogIiRXT1JLRkxPV19OQU1FIiBdOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBFUlJPUjogV09SS0ZMT1dfTkFNRSBpcyBub3Qgc2V0ISIKICAgICAgZWNobyAi8J+UjSBERUJVRzogQXR0ZW1wdGluZyB0byBleHRyYWN0IGZyb20gQ09ERVJVTl9OQU1FLi4uIgogICAgICAjIFRyeSB0byBleHRyYWN0IHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIG5hbWUgcGF0dGVybgogICAgICBpZiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdOyB0aGVuCiAgICAgICAgIyBQYXR0ZXJuOiBzZXJ2aWNlLXR7dGFza30tc3RhZ2Ute2hhc2h9IGNyZWF0ZWQgYnkgd29ya2Zsb3cKICAgICAgICBlY2hvICIgICBDT0RFUlVOX05BTUUgZm9ybWF0OiAkQ09ERVJVTl9OQU1FIgogICAgICBmaQoKICAgICAgIyBDaGVjayBpZiB3ZSBjYW4gZ2V0IGl0IGZyb20gS3ViZXJuZXRlcyBsYWJlbHMKICAgICAgaWYgY29tbWFuZCAtdiBrdWJlY3RsID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkQ09ERVJVTl9OQU1FIiBdICYmIFsgLW4gIiROQU1FU1BBQ0UiIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBUcnlpbmcgdG8gZ2V0IHdvcmtmbG93IG5hbWUgZnJvbSBDb2RlUnVuIGxhYmVscy4uLiIKICAgICAgICBXT1JLRkxPV19GUk9NX0xBQkVMUz0kKGt1YmVjdGwgZ2V0IGNvZGVydW4gIiRDT0RFUlVOX05BTUUiIC1uICIkTkFNRVNQQUNFIiAtbyBqc29ucGF0aD0ney5tZXRhZGF0YS5sYWJlbHMud29ya2Zsb3ctbmFtZX0nIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgICAgaWYgWyAtbiAiJFdPUktGTE9XX0ZST01fTEFCRUxTIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinIUgRm91bmQgd29ya2Zsb3cgbmFtZSBmcm9tIENvZGVSdW4gbGFiZWxzOiAkV09SS0ZMT1dfRlJPTV9MQUJFTFMiCiAgICAgICAgICBXT1JLRkxPV19OQU1FPSIkV09SS0ZMT1dfRlJPTV9MQUJFTFMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAi4p2MIENvdWxkIG5vdCByZXRyaWV2ZSB3b3JrZmxvdyBuYW1lIGZyb20gQ29kZVJ1biBsYWJlbHMiCiAgICAgICAgZmkKICAgICAgZmkKCiAgICAgICMgRmluYWwgY2hlY2sgLSBpZiBzdGlsbCBubyB3b3JrZmxvdyBuYW1lLCBmYWlsIGxvdWRseQogICAgICBpZiBbIC16ICIkV09SS0ZMT1dfTkFNRSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBDUklUSUNBTDogQ2Fubm90IGRldGVybWluZSBXT1JLRkxPV19OQU1FIC0gdGhpcyB3aWxsIGNhdXNlIGNvcnJlbGF0aW9uIGlzc3VlcyEiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCiAgICAgICAgZW52IHwgZ3JlcCAtRSAiV09SS0ZMT1d8Q09ERVJVTnxUQVNLfFNFUlZJQ0UiIHwgc29ydAogICAgICAgICMgRE8gTk9UIHVzZSAndW5rbm93bicgLSBleGl0IHdpdGggZXJyb3IgaW5zdGVhZAogICAgICAgIGVjaG8gIuKdjCBSZWZ1c2luZyB0byB1c2UgJ3Vua25vd24nIGxhYmVsIC0gZmFpbGluZyB0YXNrIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKCiAgICBUQVNLX0xBQkVMPSJ0YXNrLSR7VEFTS19JRH0iCiAgICBSVU5fTEFCRUw9InJ1bi0ke1dPUktGTE9XX05BTUV9IgogICAgU0VSVklDRV9MQUJFTD0ic2VydmljZS0ke1NFUlZJQ0VfTkFNRX0iCgogICAgZWNobyAi8J+TiyBMYWJlbHMgdG8gYXBwbHk6IgogICAgZWNobyAiICAgVGFzazogJFRBU0tfTEFCRUwiCiAgICBlY2hvICIgICBSdW46ICRSVU5fTEFCRUwiCiAgICBlY2hvICIgICBTZXJ2aWNlOiAkU0VSVklDRV9MQUJFTCIKCiAgICAjIFByZS1jcmVhdGUgbGFiZWxzIGlmIHRoZXkgZG9uJ3QgZXhpc3QgKGRvIHRoaXMgQkVGT1JFIHRyeWluZyB0byBhZGQgdGhlbSkKICAgIGVjaG8gIvCflI0gRW5zdXJpbmcgbGFiZWxzIGV4aXN0IGluIHJlcG9zaXRvcnkuLi4iCiAgICBmb3IgbGFiZWwgaW4gIiRUQVNLX0xBQkVMIiAiJFJVTl9MQUJFTCIgIiRTRVJWSUNFX0xBQkVMIjsgZG8KICAgICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkUkVQT19TTFVHIiAtLXNlYXJjaCAiJGxhYmVsIiB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgICAgZWNobyAiICAg8J+TnSBDcmVhdGluZyBsYWJlbCAnJGxhYmVsJy4uLiIKICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgcnVuLSopIENPTE9SPSIwMzY2ZDYiOyBERVNDPSJXb3JrZmxvdyBydW4gY29ycmVsYXRpb24iIDs7CiAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgKikgQ09MT1I9ImVkZWRlZCI7IERFU0M9IkNvcnJlbGF0aW9uIGxhYmVsIiA7OwogICAgICAgIGVzYWMKICAgICAgICBnaCBsYWJlbCBjcmVhdGUgIiRsYWJlbCIgLVIgIiRSRVBPX1NMVUciIC0tY29sb3IgIiRDT0xPUiIgLS1kZXNjcmlwdGlvbiAiJERFU0MiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgZWxzZQogICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBhbHJlYWR5IGV4aXN0cyIKICAgICAgZmkKICAgIGRvbmUKCiAgICAjIFRyeSB0byBhZGQgbGFiZWxzIHdpdGggZGV0YWlsZWQgZXJyb3IgY2FwdHVyZQogICAgZWNobyAi8J+UjSBBdHRlbXB0aW5nIHRvIGFkZCBsYWJlbHMgdG8gUFIgIyR7UFJfTlVNQkVSfS4uLiIKICAgIExBQkVMX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIke1RBU0tfTEFCRUx9LCR7UlVOX0xBQkVMfSwke1NFUlZJQ0VfTEFCRUx9IiAyPiYxKQogICAgTEFCRUxfRVhJVF9DT0RFPSQ/CgogICAgaWYgWyAkTEFCRUxfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICAgICAgZWNobyAi4pyFIEFkZGVkIGNvcnJlbGF0aW9uIGxhYmVscyBzdWNjZXNzZnVsbHkiCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gYWRkIGxhYmVscyAoZXhpdCBjb2RlOiAkTEFCRUxfRVhJVF9DT0RFKSIKICAgICAgZWNobyAi8J+UjSBERUJVRzogRXJyb3Igb3V0cHV0OiAkTEFCRUxfRVJST1IiCgogICAgICAjIENoZWNrIGlmIGxhYmVscyBleGlzdAogICAgICBlY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyB3aGljaCBsYWJlbHMgZXhpc3QuLi4iCiAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgIGlmIGdoIGxhYmVsIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tc2VhcmNoICIkbGFiZWwiIHwgZ3JlcCAtcSAiXiRsYWJlbCI7IHRoZW4KICAgICAgICAgIGVjaG8gIiAgIOKckyBMYWJlbCAnJGxhYmVsJyBleGlzdHMiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiICAg4pyXIExhYmVsICckbGFiZWwnIGRvZXMgbm90IGV4aXN0IgogICAgICAgICAgIyBDcmVhdGUgdGhlIG1pc3NpbmcgbGFiZWwKICAgICAgICAgIGVjaG8gIiAgIPCfk50gQ3JlYXRpbmcgbGFiZWwgJyRsYWJlbCcuLi4iCiAgICAgICAgICBjYXNlICIkbGFiZWwiIGluCiAgICAgICAgICAgIHRhc2stKikgQ09MT1I9ImYyOTUxMyI7IERFU0M9IlRhc2sgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgcnVuIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICBzZXJ2aWNlLSopIENPTE9SPSIwZThhMTYiOyBERVNDPSJTZXJ2aWNlIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAqKSBDT0xPUj0iZWRlZGVkIjsgREVTQz0iVW5rbm93biBsYWJlbCB0eXBlIiA7OwogICAgICAgICAgZXNhYwoKICAgICAgICAgIENSRUFURV9FUlJPUj0kKGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgMj4mMSkKICAgICAgICAgIENSRUFURV9FWElUPSQ/CiAgICAgICAgICBpZiBbICRDUkVBVEVfRVhJVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgICAgIGVjaG8gIiAgIOKchSBDcmVhdGVkIGxhYmVsICckbGFiZWwnIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICIgICDinYwgRmFpbGVkIHRvIGNyZWF0ZSBsYWJlbCAnJGxhYmVsJzogJENSRUFURV9FUlJPUiIKICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgICAgZG9uZQoKICAgICAgIyBSZXRyeSBhZGRpbmcgbGFiZWxzIHdpdGggaW5kaXZpZHVhbCBhdHRlbXB0cwogICAgICBlY2hvICLwn5SNIERFQlVHOiBSZXRyeWluZyBsYWJlbCBhZGRpdGlvbiBpbmRpdmlkdWFsbHkuLi4iCiAgICAgIExBQkVMU19BRERFRD0wCiAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgIFJFVFJZX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIkbGFiZWwiIDI+JjEpCiAgICAgICAgUkVUUllfRVhJVD0kPwogICAgICAgIGlmIFsgJFJFVFJZX0VYSVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyAiICAg4pyFIEFkZGVkIGxhYmVsICckbGFiZWwnIgogICAgICAgICAgTEFCRUxTX0FEREVEPSQoKExBQkVMU19BRERFRCArIDEpKQogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIiAgIOKdjCBGYWlsZWQgdG8gYWRkIGxhYmVsICckbGFiZWwnOiAkUkVUUllfRVJST1IiCiAgICAgICAgZmkKICAgICAgZG9uZQoKICAgICAgaWYgWyAkTEFCRUxTX0FEREVEIC1lcSAzIF07IHRoZW4KICAgICAgICBlY2hvICLinIUgQWxsIGxhYmVscyBhZGRlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgcmV0cnkiCiAgICAgIGVsaWYgWyAkTEFCRUxTX0FEREVEIC1ndCAwIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gUGFydGlhbCBzdWNjZXNzOiAkTEFCRUxTX0FEREVELzMgbGFiZWxzIGFkZGVkIgogICAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBDb3VsZCBub3QgYWRkIGFueSBsYWJlbHMgdG8gUFIiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQ2hlY2tpbmcgUFIgc3RhdGUuLi4iCiAgICAgICAgUFJfU1RBVEU9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHN0YXRlIC1xIC5zdGF0ZSAyPi9kZXYvbnVsbCB8fCBlY2hvICJVTktOT1dOIikKICAgICAgICBlY2hvICIgICBQUiBTdGF0ZTogJFBSX1NUQVRFIgogICAgICAgIGlmIFsgIiRQUl9TVEFURSIgPSAiQ0xPU0VEIiBdIHx8IFsgIiRQUl9TVEFURSIgPSAiTUVSR0VEIiBdOyB0aGVuCiAgICAgICAgICBlY2hvICLinYwgUFIgaXMgJFBSX1NUQVRFIC0gY2Fubm90IGFkZCBsYWJlbHMgdG8gY2xvc2VkL21lcmdlZCBQUnMiCiAgICAgICAgZmkKICAgICAgZmkKICAgIGZpCgogICAgIyBGaW5hbCB2ZXJpZmljYXRpb24gdGhhdCBsYWJlbHMgd2VyZSBhcHBsaWVkCiAgICBlY2hvICLwn5SNIEZpbmFsIHZlcmlmaWNhdGlvbiBvZiBQUiBsYWJlbHMuLi4iCiAgICBQUl9MQUJFTFM9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIGxhYmVscyAtLWpxICcubGFiZWxzW10ubmFtZScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8gIiRQUl9MQUJFTFMiIHwgZ3JlcCAtcSAiXnRhc2stJHtUQVNLX0lEfSQiICYmIFwKICAgICAgIGVjaG8gIiRQUl9MQUJFTFMiIHwgZ3JlcCAtcSAiXnJ1bi0ke1dPUktGTE9XX05BTUV9JCIgJiYgXAogICAgICAgZWNobyAiJFBSX0xBQkVMUyIgfCBncmVwIC1xICJec2VydmljZS0ke1NFUlZJQ0VfTkFNRX0kIjsgdGhlbgogICAgICBlY2hvICLinIUgVkVSSUZJRUQ6IEFsbCBjb3JyZWxhdGlvbiBsYWJlbHMgYXJlIHByZXNlbnQgb24gUFIgIyR7UFJfTlVNQkVSfSIKICAgIGVsc2UKICAgICAgZWNobyAi4pqg77iPIFdBUk5JTkc6IFNvbWUgbGFiZWxzIG1heSBiZSBtaXNzaW5nLiBDdXJyZW50IGxhYmVsczoiCiAgICAgIGVjaG8gIiRQUl9MQUJFTFMiIHwgc2VkICdzL14vICAgLSAvJwogICAgICBlY2hvICIiCiAgICAgIGVjaG8gIkV4cGVjdGVkIGxhYmVsczoiCiAgICAgIGVjaG8gIiAgIC0gdGFzay0ke1RBU0tfSUR9IgogICAgICBlY2hvICIgICAtIHJ1bi0ke1dPUktGTE9XX05BTUV9IgogICAgICBlY2hvICIgICAtIHNlcnZpY2UtJHtTRVJWSUNFX05BTUV9IgogICAgZmkKICBlbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgZm91bmQgZm9yIHRoaXMgdGFzayAoQ2xhdWRlIG1heSBub3QgaGF2ZSBjcmVhdGVkIG9uZSkiCiAgZmkKZWxzZQogIGVjaG8gIuKEue+4jyBTa2lwcGluZyBQUiBsYWJlbGluZzogbWlzc2luZyBHSVRIVUJfVE9LRU4gb3IgZ2ggQ0xJIgpmaQoKIyBXcml0ZSBzZW50aW5lbCBmaWxlIHRvIHNpZ25hbCBzaWRlY2FyIHRvIHN0b3AgKEt1YmVybmV0ZXMtbmF0aXZlIGZpbGUgd2F0Y2gpCnRvdWNoIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUgMj4vZGV2L251bGwgfHwgdHJ1ZQoKICAjIENoZWNrIGlmIGltcGxlbWVudGF0aW9uIHdhcyBzdWNjZXNzZnVsCiAgIyBSZXggaXMgc3VjY2Vzc2Z1bCBpZiBDbGF1ZGUgZXhpdGVkIGNsZWFubHkgKFBSIHNob3VsZCBiZSBjcmVhdGVkKQogIGlmIFsgJHtDTEFVREVfUElEOi0wfSAtbmUgMCBdOyB0aGVuCiAgICB3YWl0ICRDTEFVREVfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIENMQVVERV9FWElUX0NPREU9JD8KICBmaQogIAogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIEF0dGVtcHQgJEFUVEVNUFQ6IEltcGxlbWVudGF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgICBTVUNDRVNTPTEKICAgIGJyZWFrCiAgZWxzZQogICAgZWNobyAi4pqg77iPIEF0dGVtcHQgJEFUVEVNUFQ6IEltcGxlbWVudGF0aW9uIGluY29tcGxldGUgKGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUpIgogICAgCiAgICBpZiBbICRBVFRFTVBUIC1sdCAkTUFYX1JFVFJJRVMgXTsgdGhlbgogICAgICBlY2hvICLwn5SEIFdpbGwgcmV0cnkuLi4gKCQoKE1BWF9SRVRSSUVTIC0gQVRURU1QVCkpIGF0dGVtcHRzIHJlbWFpbmluZykiCiAgICAgIEFUVEVNUFQ9JCgoQVRURU1QVCArIDEpKQogICAgICBlY2hvICIiCiAgICAgICMgQnJpZWYgcGF1c2UgYmVmb3JlIHJldHJ5CiAgICAgIHNsZWVwIDIKICAgIGVsc2UKICAgICAgZWNobyAi4p2MIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgcmVhY2hlZCIKICAgICAgYnJlYWsKICAgIGZpCiAgZmkKZG9uZQoKIyBSZXBvcnQgZmluYWwgc3RhdHVzCmVjaG8gIiIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgppZiBbICRTVUNDRVNTIC1lcSAxIF07IHRoZW4KICBlY2hvICLinIUgUkVYIElNUExFTUVOVEFUSU9OIFNVQ0NFU1NGVUwiCiAgZWNobyAiICAgQ29tcGxldGVkIGFmdGVyICRBVFRFTVBUIGF0dGVtcHQocykiCmVsc2UKICBlY2hvICLimqDvuI8gUkVYIElNUExFTUVOVEFUSU9OIElOQ09NUExFVEUiCiAgZWNobyAiICAgQXR0ZW1wdGVkICRBVFRFTVBUIHRpbWUocykiCiAgZWNobyAiICAgSW1wbGVtZW50YXRpb24gbm90IGNvbXBsZXRlZCIKZmkKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgUkVYIENPTlRBSU5FUiBURVJNSU5BVElPTiAgICAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gIkNvbnRhaW5lciBQSUQ6ICQkIgplY2hvICJGaW5hbCBQcm9jZXNzIENoZWNrOiIKcHMgYXV4IHwgaGVhZCAtNQoKIyBXcml0ZSBjb21wbGV0aW9uIG1hcmtlciBmb3Igd29ya2Zsb3cgdHJhY2tpbmcKZWNobyAicmV4LWltcGxlbWVudGF0aW9uLWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8ucmV4LWNvbXBsZXRlCgojIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHN1Y2Nlc3MKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBzdWNjZXNzIHN0YXR1cy4uLiIKICBleGl0IDAKZWxzZQogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggZmFpbHVyZSBzdGF0dXMuLi4iCiAgZWNobyAi8J+TnSBJbXBsZW1lbnRhdGlvbiBpbmNvbXBsZXRlIGFmdGVyICRBVFRFTVBUIGF0dGVtcHQocykiCiAgZXhpdCAxCmZpCg== - code_claude_container-tess.sh.hbs: IyEvYmluL3NoCgojIENSSVRJQ0FMOiBDbGVhbiB1cCBzZW50aW5lbCBmaWxlIElNTUVESUFURUxZIHRvIHByZXZlbnQgc2lkZWNhciBmcm9tIHNodXR0aW5nIGRvd24KIyBUaGlzIE1VU1QgaGFwcGVuIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBhcyB0aGUgc2lkZWNhciBzdGFydHMgYmVmb3JlIG91ciBzY3JpcHQKaWYgWyAtZiAvd29ya3NwYWNlLy5hZ2VudF9kb25lIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgVVJHRU5UOiBSZW1vdmluZyBsZWZ0b3ZlciBzZW50aW5lbCBmaWxlIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8uYWdlbnRfZG9uZQpmaQoKIyBBbHNvIGNsZWFuIHVwIFRlc3MgY29tcGxldGlvbiBtYXJrZXIgaWYgcHJlc2VudAppZiBbIC1mIC93b3Jrc3BhY2UvLnRlc3MtY29tcGxldGUgXTsgdGhlbgogICAgZWNobyAi8J+nuSBSZW1vdmluZyBUZXNzIGNvbXBsZXRpb24gbWFya2VyIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQpmaQoKIyBFbnN1cmUgUnVzdCBlbnZpcm9ubWVudCBpcyBhbHdheXMgcHJvcGVybHkgc2V0IHVwCmVjaG8gIvCflKcgU2V0dGluZyB1cCBSdXN0IGVudmlyb25tZW50Li4uIgoKIyBTb3VyY2UgUnVzdCBlbnZpcm9ubWVudCBpZiBhdmFpbGFibGUgKGZpeGVzIGNhcmdvIG5vdCBmb3VuZCBpc3N1ZXMpCiMgVHJ5IG11bHRpcGxlIHBvc3NpYmxlIGxvY2F0aW9ucyBmb3IgUnVzdCBlbnZpcm9ubWVudApSVVNUX0VOVl9TT1VSQ0VTPSgKICAgICIkSE9NRS8uY2FyZ28vZW52IgogICAgIi9yb290Ly5jYXJnby9lbnYiCiAgICAiL3Vzci9sb2NhbC9jYXJnby9lbnYiCiAgICAiL2hvbWUvdWJ1bnR1Ly5jYXJnby9lbnYiCiAgICAiL2hvbWUvdXNlci8uY2FyZ28vZW52IgopCgpmb3IgZW52X2ZpbGUgaW4gIiR7UlVTVF9FTlZfU09VUkNFU1tAXX0iOyBkbwogICAgaWYgWyAtZiAiJGVudl9maWxlIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFNvdXJjaW5nIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkZW52X2ZpbGUiCiAgICAgICAgLiAiJGVudl9maWxlIgogICAgICAgICMgRXhwb3J0IFBBVEggZXhwbGljaXRseSBhZnRlciBzb3VyY2luZwogICAgICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgICAgIGJyZWFrCiAgICBmaQpkb25lCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pyTIFJ1c3R1cCBmb3VuZCwgZW5zdXJpbmcgc3RhYmxlIHRvb2xjaGFpbiBpcyBkZWZhdWx0Li4uIgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICMgUmUtc291cmNlIGVudmlyb25tZW50IGFmdGVyIHNldHRpbmcgZGVmYXVsdAogICAgaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgICAgIC4gIiRIT01FLy5jYXJnby9lbnYiCiAgICBlbGlmIFsgLWYgIi9yb290Ly5jYXJnby9lbnYiIF07IHRoZW4KICAgICAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZmkKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIEVuc3VyZWQgc3RhYmxlIFJ1c3QgdG9vbGNoYWluIGlzIGRlZmF1bHQiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBydXN0dXAgbm90IGZvdW5kIGluIFBBVEgiCmZpCgojIFZlcmlmeSBSdXN0IGlzIGF2YWlsYWJsZSB3aXRoIG11bHRpcGxlIGZhbGxiYWNrIGF0dGVtcHRzCmlmIGNvbW1hbmQgLXYgY2FyZ28gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinJMgQ2FyZ28gaXMgYXZhaWxhYmxlOiAkKGNhcmdvIC0tdmVyc2lvbikiCmVsaWYgWyAtZiAiL3Vzci9sb2NhbC9jYXJnby9iaW4vY2FyZ28iIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBjYXJnbyBhdCAvdXNyL2xvY2FsL2NhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIvdXNyL2xvY2FsL2NhcmdvL2JpbjokUEFUSCIKICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxpZiBbIC1mICIkSE9NRS8uY2FyZ28vYmluL2NhcmdvIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgY2FyZ28gYXQgJEhPTUUvLmNhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIENhcmdvIGlzIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgplbHNlCiAgICBlY2hvICLinYwgQ2FyZ28gbm90IGZvdW5kIGluIFBBVEgiCiAgICBlY2hvICJDdXJyZW50IFBBVEg6ICRQQVRIIgogICAgZWNobyAiQXR0ZW1wdGluZyB0byBmaW5kIGNhcmdvLi4uIgogICAgZmluZCAvdXNyIC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvdXNyIgogICAgZmluZCAvaG9tZSAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL2hvbWUiCiAgICBmaW5kIC9yb290IC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvcm9vdCIKICAgICMgVHJ5IHRvIGluc3RhbGwgUnVzdCBhcyBsYXN0IHJlc29ydAogICAgZWNobyAi8J+UpyBBdHRlbXB0aW5nIHRvIGluc3RhbGwgUnVzdCB2aWEgcnVzdHVwLi4uIgogICAgY3VybCAtLXByb3RvICc9aHR0cHMnIC0tdGxzdjEuMiAtc1NmIGh0dHBzOi8vc2gucnVzdHVwLnJzIHwgc2ggLXMgLS0gLXkgfHwgdHJ1ZQogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIgfHwgdHJ1ZQogICAgZXhwb3J0IFBBVEg9IiRIT01FLy5jYXJnby9iaW46JFBBVEgiCiAgICBpZiBjb21tYW5kIC12IGNhcmdvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDYXJnbyBpbnN0YWxsZWQgYW5kIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gaW5zdGFsbCBSdXN0LCBjb250aW51aW5nIHdpdGhvdXQgY2FyZ28uLi4iCiAgICBmaQpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIFRFU1MgVEVTVElORyBXT1JLRkxPVyBTVEFSVElORyAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICAgICAgUXVhbGl0eSBBc3N1cmFuY2UgJiBEZXBsb3ltZW50IFRlc3RpbmcgQWdlbnQgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFVFJZIENPTkZJR1VSQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BWF9SRVRSSUVTX0NPTkZJRz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDTEFVREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ0xBVURFX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCfp6ogRm9jdXM6IENvbXByZWhlbnNpdmUgdGVzdGluZywgZGVwbG95bWVudCB2YWxpZGF0aW9uLCB0ZXN0IGNvdmVyYWdlIgplY2hvICLwn5OLIFRhc2sgSUQ6IHt7dGFza19pZH19IgplY2hvICLinIUgTWlzc2lvbjogMTIwJSBzYXRpc2ZhY3Rpb24gdGhyb3VnaCBleGhhdXN0aXZlIHRlc3RpbmciCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCmVjaG8gIvCflI0gRGVidWcgU2Vzc2lvbjogJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKSAtIFBJRDogJCQiCmVjaG8gIvCfk4ogTG9nIExldmVsOiBERUJVRyAoc2hvd2luZyBKU09OIGNvbnN0cnVjdGlvbiBkZXRhaWxzKSIKCiMgRGlzYWJsZSBpbnRlcmFjdGl2ZSBHaXQgcHJvbXB0cyBnbG9iYWxseQpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyBBbGxvdyBzb2Z0IGZhaWx1cmUgZm9yIHByZWNoZWNrcyB3aGVuIGRlc2lyZWQKIyBTZXQgVEVTU19TVFJJQ1RfUFJFQ0hFQ0tTPTEgdG8gZW5mb3JjZSBoYXJkIGV4aXRzIG9uIGZhaWx1cmVzClRFU1NfU1RSSUNUX1BSRUNIRUNLUz0iJHtURVNTX1NUUklDVF9QUkVDSEVDS1M6LTB9IgoKc29mdF9hYm9ydCgpIHsKICAjIFVzYWdlOiBzb2Z0X2Fib3J0ICJtZXNzYWdlIiBbZXhpdF9jb2RlXQogIG1zZz0iJDEiOyBjb2RlPSIkezI6LTF9IgogIGVjaG8gIuKdjCAkbXNnIgogIGlmIFsgIiRURVNTX1NUUklDVF9QUkVDSEVDS1MiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIvCfmqsgQWJvcnRpbmcgKFRFU1NfU1RSSUNUX1BSRUNIRUNLUz0xKSIKICAgIGV4aXQgIiRjb2RlIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBOb24tZmF0YWwgcHJlY2hlY2sgZmFpbHVyZSAoY29udGludWluZyB3aXRoIGxpbWl0ZWQgY2FwYWJpbGl0aWVzKSIKICBmaQp9CgojIFJlcG9zaXRvcnkgVVJMClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgojIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCmVjaG8gIlVzaW5nIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gZm9yIHRlc3Rpbmcgd29ya2Zsb3ciCgojIEZ1bmN0aW9uIHRvIGVuc3VyZSBNQ1Agc2VydmVyIHNodXRkb3duCnNodXRkb3duX3NpZGVjYXIoKSB7CiAgIyBObyBzaWRlY2FyIHNodXRkb3duIG5lZWRlZCAtIGNvbnRhaW5lciB3aWxsIGV4aXQgbmF0dXJhbGx5IHdoZW4gbWFpbiBwcm9jZXNzIGNvbXBsZXRlcwogIGVjaG8gIvCflKcgTWFpbiBjb250YWluZXIgcHJvY2VzcyBjb21wbGV0ZSIKICB0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBBdXRoZW50aWNhdGUgd2l0aCBHaXRIdWIgQXBwCmlmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX0lEIiBdOyB0aGVuCiAgICBlY2hvICJBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAuLi4iCgogICAgIyBDcmVhdGUgdGVtcG9yYXJ5IHByaXZhdGUga2V5IGZpbGUgKHN1cHBvcnQgZXNjYXBlZCBuZXdsaW5lcykKICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgogICAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBHZW5lcmF0ZSBKV1QgdG9rZW4gZm9yIEdpdEh1YiBBcHAgKGZpeGVkIEpXVCBnZW5lcmF0aW9uIGZvciBMaW51eCBjb250YWluZXJzKQogICAgIyBKV1QgaGVhZGVyCiAgICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBKV1QgcGF5bG9hZCB3aXRoIGN1cnJlbnQgdGltZSBhbmQgZXhwaXJhdGlvbiAoMTAgbWludXRlcykKICAgIE5PVz0kKGRhdGUgKyVzKQogICAgRVhQPSQoKE5PVyArIDYwMCkpCiAgICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIFNpZ24gdGhlIEpXVAogICAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICAgIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgdGhlIHJlcG9zaXRvcnkgKHJvYnVzdCBwYXJzaW5nIG9mIG93bmVyL3JlcG8pCiAgICBJTlBVVF9SRVBPPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBSRVBPX09XTkVSPSIiCiAgICBSRVBPX05BTUU9IiIKCiAgICBpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vW14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgICAgICMgU1NIIGZvcm1hdCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvKC5naXQpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2s6IGFzc3VtZSBzbHVnIG93bmVyL3JlcG8gKHBvc3NpYmx5IHdpdGggLmdpdCkKICAgICAgICBTTFVHPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfFwuZ2l0JHx8JykKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMSkKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYyKQogICAgZmkKCiAgICBlY2hvICJERUJVRzogUGFyc2VkIHJlcG9zaXRvcnkgLSBPd25lcjogJyRSRVBPX09XTkVSJywgTmFtZTogJyRSRVBPX05BTUUnIgoKICAgIGVjaG8gIkdldHRpbmcgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FLi4uIgoKICAgICMgR2V0IHRoZSBpbnN0YWxsYXRpb24gSUQgKHJldHJ5IGFuZCBmb2xsb3cgcmVkaXJlY3RzKS4gRmFsbGJhY2sgdG8gb3JnIGluc3RhbGxhdGlvbi4KICAgIElOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIikKCiAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBSZXBvIGluc3RhbGxhdGlvbiBub3QgZm91bmQsIHRyeWluZyBvcmcgaW5zdGFsbGF0aW9uLi4uIgogICAgICAgIE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iKQogICAgICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQogICAgZmkKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBzb2Z0X2Fib3J0ICJGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIgMQogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSIiCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykgICMgVHJhY2sgd2hlbiB0b2tlbiB3YXMgZ2VuZXJhdGVkIGZvciByZWZyZXNoIGxvZ2ljCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuIiAxCiAgICAgICAgZWNobyAiUmVzcG9uc2U6ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgR0lUSFVCX1RPS0VOPSIiCiAgICBmaQoKICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YiBBcHAiCgogICAgIyBDbGVhbiB1cCB0ZW1wb3Jhcnkga2V5IGZpbGUKICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEV4cG9ydCB0aGUgdG9rZW4gZm9yIGdpdCB0byB1c2UKICAgIGV4cG9ydCBHSVRIVUJfVE9LRU4KCiAgICAjIENvbmZpZ3VyZSBnaXQgdG8gdXNlIHRoZSB0b2tlbiAodXNlIC0tcmVwbGFjZS1hbGwgdG8gaGFuZGxlIG11bHRpcGxlIGV4aXN0aW5nIGhlbHBlcnMpCiAgICBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgc3RvcmUKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCgogICAgIyBBbHNvIGF1dGhlbnRpY2F0ZSBnaCBDTEkgd2l0aCB0aGUgdG9rZW4KICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4KCiAgICAjIFRva2VuIHJlZnJlc2ggZnVuY3Rpb25zIGZvciBsb25nLXJ1bm5pbmcgam9icwogICAgcmVmcmVzaF9naXRodWJfdG9rZW4oKSB7CiAgICAgICAgZWNobyAi8J+UhCBSZWZyZXNoaW5nIEdpdEh1YiBBcHAgdG9rZW4uLi4iCgogICAgICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXktJCQiCiAgICAgICAgZWNobyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgICAgICMgR2VuZXJhdGUgbmV3IEpXVAogICAgICAgIEpXVF9UT0tFTj0kKHJ1YnkgLXIgb3BlbnNzbCAtciBqc29uIC1yIGJhc2U2NCAtZSAiCiAgICAgICAga2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLnJlYWQoJyRURU1QX0tFWV9GSUxFJykpCiAgICAgICAgcGF5bG9hZCA9IHsKICAgICAgICAgICAgaWF0OiBUaW1lLm5vdy50b19pIC0gNjAsCiAgICAgICAgICAgIGV4cDogVGltZS5ub3cudG9faSArICgxMCAqIDYwKSwKICAgICAgICAgICAgaXNzOiAnJEdJVEhVQl9BUFBfSUQnCiAgICAgICAgfQogICAgICAgIGhlYWRlciA9IHsgYWxnOiAnUlMyNTYnLCB0eXA6ICdKV1QnIH0KCiAgICAgICAgaGVhZGVyX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGhlYWRlci50b19qc29uKS5nc3ViKCc9JywgJycpCiAgICAgICAgcGF5bG9hZF9lbmMgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChwYXlsb2FkLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBzaWduYXR1cmUgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChrZXkuc2lnbihPcGVuU1NMOjpEaWdlc3Q6OlNIQTI1Ni5uZXcsIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfVwiKSkuZ3N1YignPScsICcnKQoKICAgICAgICBwdXRzIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfS4je3NpZ25hdHVyZX1cIgogICAgICAgICIpCgogICAgICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCAocmV1c2UgbG9naWMgZnJvbSBpbml0aWFsIGF1dGgpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICAgICAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCiAgICAgICAgZmkKCiAgICAgICAgIyBHZXQgbmV3IGluc3RhbGxhdGlvbiB0b2tlbgogICAgICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgICAgICBORVdfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogICAgICAgIGlmIFsgIiRORVdfVE9LRU4iICE9ICJudWxsIiBdICYmIFsgLW4gIiRORVdfVE9LRU4iIF07IHRoZW4KICAgICAgICAgICAgZXhwb3J0IEdJVEhVQl9UT0tFTj0iJE5FV19UT0tFTiIKICAgICAgICAgICAgZXhwb3J0IFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQoKICAgICAgICAgICAgIyBVcGRhdGUgZ2l0IGNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gMj4vZGV2L251bGwKCiAgICAgICAgICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW46ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICB9CgogICAgIyBDaGVjayBpZiB0b2tlbiBuZWVkcyByZWZyZXNoIChjYWxsIGJlZm9yZSBnaXQgb3BlcmF0aW9ucykKICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogICAgICAgIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi4pqg77iPIE5vIHRva2VuIHRpbWVzdGFtcCBmb3VuZCwgcmVmcmVzaGluZyB0b2tlbi4uLiIKICAgICAgICAgICAgcmVmcmVzaF9naXRodWJfdG9rZW4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmkKCiAgICAgICAgTk9XPSQoZGF0ZSArJXMpCiAgICAgICAgVE9LRU5fQUdFPSQoKE5PVyAtIFRPS0VOX0dFTkVSQVRFRF9BVCkpCgogICAgICAgICMgUmVmcmVzaCBpZiB0b2tlbiBpcyBvbGRlciB0aGFuIDUwIG1pbnV0ZXMgKHRva2VucyBsYXN0IDEgaG91ciwgcmVmcmVzaCBhdCA1MCBtaW4gdG8gYmUgc2FmZSkKICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5SEIFRva2VuIGlzICQoKCRUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMgb2xkLCByZWZyZXNoaW5nLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgIGZpCiAgICB9CgplbHNlCiAgICBlY2hvICLinYwgR2l0SHViIEFwcCBjcmVkZW50aWFscyBub3QgZm91bmQiCiAgICBleGl0IDEKZmkKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgYWdlbnQKIyBTZXQgV29ya2luZyBEaXJlY3RvcnkgKENyaXRpY2FsIGZvciBDbGF1ZGUgRXhlY3V0aW9uKSAtIE1hdGNoIFJleCBwYXR0ZXJuCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF07IHRoZW4KICBDTEFVREVfV09SS19ESVI9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FLyRXT1JLX0RJUiIKZmkKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBQcmVwYXJlIGVudmlyb25tZW50IGZvciB0ZXN0aW5nCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+nqiBQUkVQQVJJTkcgVEVTVElORyBFTlZJUk9OTUVOVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBHaXQgY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKIyBTZXQgR2l0SHViIEFwcCBhdHRyaWJ1dGlvbiAtIHVzZSBnZW5lcmljIGZvcm1hdCBmb3IgYWxsIGFnZW50cwpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogICAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICAgIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgICAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIHJldHVybgogICAgZmkKCiAgICBsb2NhbCBzbHVnCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogICAgZmkKCiAgICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICAgIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgICAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgICAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgICAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgICAgIGxvY2FsIGJvdF9pZAogICAgICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICAgICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICAgICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIGZpCiAgICBmaQoKICAgIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICAgIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCiMgQ29uZmlndXJlIGdpdCB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgoKIyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbGF1ZGUgQ29kZSB0byB1c2UKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmVjaG8gIuKckyBHaXQgY29uZmlndXJlZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgpHSVRfUkVQT19PSz0wCmlmIGdpdCBscy1yZW1vdGUgIiRSRVBPX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9yZXBvX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0KSIKICBlY2hvICIgIEdpdCBjcmVkZW50aWFsIGhlbHBlciBzdGF0dXM6IgogIGdpdCBjb25maWcgLS1saXN0IHwgZ3JlcCBjcmVkZW50aWFsIHx8IGVjaG8gIiAgTm8gY3JlZGVudGlhbCBoZWxwZXJzIGNvbmZpZ3VyZWQiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiIDEKICBHSVRfUkVQT19PSz0xCmZpCgojIFRlc3QgZG9jcyByZXBvc2l0b3J5IGFjY2VzcwplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRET0NTX0hUVFBfVVJMXCIgSEVBRCIKRE9DU19SRVBPX09LPTAKaWYgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPiAvdG1wL2RvY3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCkiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgZG9jcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIgMQogIERPQ1NfUkVQT19PSz0xCmZpCgojIENsb25lIG9yIHVwZGF0ZSByZXBvc2l0b3J5IChkaXJlY3RseSB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkpCmlmIFsgLWQgIiRDTEFVREVfV09SS19ESVIvLmdpdCIgXTsgdGhlbgogICAgZWNobyAi8J+TgSBGb3VuZCBleGlzdGluZyByZXBvc2l0b3J5IGF0IHdvcmtpbmcgZGlyZWN0b3J5LCB1cGRhdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCmVsc2UKICAgICMgRW5zdXJlIHBhcmVudCBkaXJlY3RvcmllcyBleGlzdAogICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgoKICAgICMgSWYgZGlyZWN0b3J5IGV4aXN0cyBidXQgaXNuJ3QgYSBnaXQgcmVwbywgcmVtb3ZlIGl0IGZpcnN0CiAgICBpZiBbIC1kICIkQ0xBVURFX1dPUktfRElSIiBdICYmIFsgISAtZCAiJENMQVVERV9XT1JLX0RJUi8uZ2l0IiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+nuSBSZW1vdmluZyBub24tZ2l0IGRpcmVjdG9yeSB0byBwcmVwYXJlIGZvciBjbG9uZS4uLiIKICAgICAgICBybSAtcmYgIiRDTEFVREVfV09SS19ESVIiCiAgICBmaQoKICAgIGVjaG8gIvCfk6UgQ2xvbmluZyByZXBvc2l0b3J5IHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgogICAgIyBNYWtlIHN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIHdlJ3JlIGluIGEgdmFsaWQgbG9jYXRpb24KICAgIFBBUkVOVF9ESVI9IiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgogICAgbWtkaXIgLXAgIiRQQVJFTlRfRElSIgogICAgY2QgIiRQQVJFTlRfRElSIgoKICAgICMgVXNlIHRoZSBSRVBPX0hUVFBfVVJMIGNvbnN0cnVjdGVkIGluIGF1dGhlbnRpY2F0aW9uIHZlcmlmaWNhdGlvbiBzZWN0aW9uCiAgICBpZiBbICIkR0lUX1JFUE9fT0siIC1lcSAwIF07IHRoZW4KICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIjsgdGhlbgogICAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGNsb25lIHJlcG9zaXRvcnkiIDEKICAgICAgICAgIGVjaG8gIkRlYnVnOiBDTEFVREVfV09SS19ESVI9JENMQVVERV9XT1JLX0RJUiIKICAgICAgICAgIGVjaG8gIkRlYnVnOiBQYXJlbnQgZGlyZWN0b3J5IGV4aXN0czogJChscyAtbGEgIiRQQVJFTlRfRElSIiAyPi9kZXYvbnVsbCB8fCBlY2hvICdObycpIgogICAgICAgICAgbWtkaXIgLXAgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIgfHwgdHJ1ZQogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gU2tpcHBpbmcgY2xvbmUgZHVlIHRvIHByZXZpb3VzIHJlcG8gYWNjZXNzIGZhaWx1cmU7IGNyZWF0aW5nIGVtcHR5IHdvcmtpbmcgZGlyZWN0b3J5IgogICAgICBta2RpciAtcCAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIiB8fCB0cnVlCiAgICBmaQogICAgY2QgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIKZmkKCiMgVXRpbGl0eSBmdW5jdGlvbiBmb3Igc2FmZSBHaXQgb3BlcmF0aW9ucwpzYWZlX2dpdF9wdWxsKCkgewogICAgbG9jYWwgcmVtb3RlPSIkMSIKICAgIGxvY2FsIGJyYW5jaD0iJDIiCgogICAgZWNobyAi8J+TpSBBdHRlbXB0aW5nIHRvIHB1bGwgZnJvbSAkcmVtb3RlLyRicmFuY2guLi4iCgogICAgIyBUcnkgcmViYXNlIGZpcnN0IChjbGVhbmVyIGhpc3RvcnkpCiAgICBpZiBnaXQgcHVsbCAtLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCByZWJhc2UiCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgIyBUcnkgbWVyZ2UgaWYgcmViYXNlIGZhaWxzCiAgICBpZiBnaXQgcHVsbCAtLW5vLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCBtZXJnZSIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICAjIElmIGJvdGggZmFpbCwgc2hvdyBjdXJyZW50IHN0YXR1cyBhbmQgY29udGludWUKICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgcHVsbCBkdWUgdG8gZGl2ZXJnZW50IGJyYW5jaGVzIG9yIGNvbmZsaWN0cyIKICAgIGVjaG8gIvCfk40gQ3VycmVudCBjb21taXQ6ICQoZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAndW5rbm93bicpIgogICAgZWNobyAi8J+TjSBMb2NhbCBjaGFuZ2VzOiAkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gfCB3YyAtbCkgZmlsZXMgbW9kaWZpZWQiCiAgICBlY2hvICLwn5ONIENvbnRpbnVpbmcgd2l0aCBjdXJyZW50IGJyYW5jaCBzdGF0ZSIKICAgIHJldHVybiAxCn0KCiMgRGVyaXZlIHJlcG9zaXRvcnkgc2x1ZyBmb3IgZ2ggQ0xJIG9wZXJhdGlvbnMKUkVQT19TTFVHPSIiCmlmIGdpdCAtQyAiJENMQVVERV9XT1JLX0RJUiIgcmVtb3RlIGdldC11cmwgb3JpZ2luID4vZGV2L251bGwgMj4mMTsgdGhlbgogIE9SSUdJTl9VUkw9JChnaXQgLUMgIiRDTEFVREVfV09SS19ESVIiIHJlbW90ZSBnZXQtdXJsIG9yaWdpbiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rL1teL10rKShcXC5naXQpP3xcXDF8JykKICBlbGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgZmkKZmkKCiMgSWYgUFIgY29udGV4dCBpcyBtaXNzaW5nLCB0cnkgdG8gZGlzY292ZXIgYnkgdGFzayBsYWJlbAppZiBbIC16ICIke1BSX05VTUJFUjotfSIgXSB8fCBbIC16ICIke1BSX1VSTDotfSIgXTsgdGhlbgogIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICBpZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkUkVQT19TTFVHIiBdOyB0aGVuCiAgICBDQU5EX05VTT0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJENBTkRfTlVNIiBdOyB0aGVuCiAgICAgIFBSX05VTUJFUj0iJENBTkRfTlVNIgogICAgICBQUl9VUkw9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHVybCAtcSAudXJsIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgIGVjaG8gIuKckyBEaXNjb3ZlcmVkIFBSIGNvbnRleHQgdmlhIGxhYmVsOiBQUiAjJFBSX05VTUJFUiAoJFBSX1VSTCkiCiAgICBmaQogIGZpCmZpCgojIENoZWNrb3V0IFBSIGJyYW5jaCBmb3IgdGVzdGluZyByZXZpZXcKaWYgWyAtbiAiJFBSX05VTUJFUiIgXSAmJiBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIENoZWNraW5nIG91dCBQUiAjJFBSX05VTUJFUiBmb3IgUUEgdGVzdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCiAgICBQUl9CUkFOQ0g9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtLWpzb24gaGVhZFJlZk5hbWUgLS1qcSAnLmhlYWRSZWZOYW1lJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAtbiAiJFBSX0JSQU5DSCIgXTsgdGhlbgogICAgICAgICMgVHJ5IHRvIGNoZWNrb3V0L2NyZWF0ZSB0aGUgYnJhbmNoCiAgICAgICAgaWYgZ2l0IGNoZWNrb3V0ICIkUFJfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICBlY2hvICLinJMgQ2hlY2tlZCBvdXQgZXhpc3RpbmcgYnJhbmNoOiAkUFJfQlJBTkNIIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi8J+TnSBDcmVhdGluZyBuZXcgbG9jYWwgYnJhbmNoIGZyb20gcmVtb3RlOiAkUFJfQlJBTkNIIgogICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgLWIgIiRQUl9CUkFOQ0giICJvcmlnaW4vJFBSX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIuKckyBDcmVhdGVkIG5ldyBicmFuY2g6ICRQUl9CUkFOQ0giCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY3JlYXRlIGJyYW5jaCAkUFJfQlJBTkNILCBzdGF5aW5nIG9uIGN1cnJlbnQgYnJhbmNoIgogICAgICAgICAgICAgICAgIyBTa2lwIHRvIHRoZSBuZXh0IHBhcnQgd2l0aG91dCB0aGUgY29udGludWUKICAgICAgICAgICAgZmkKICAgICAgICBmaQoKICAgICAgICAjIE9ubHkgYXR0ZW1wdCBwdWxsIGlmIHdlIHN1Y2Nlc3NmdWxseSBjaGVja2VkIG91dC9jcmVhdGVkIHRoZSBicmFuY2gKICAgICAgICBpZiBbICIkKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwpIiA9ICIkUFJfQlJBTkNIIiBdOyB0aGVuCiAgICAgICAgICAgICMgSGFuZGxlIGRpdmVyZ2VudCBicmFuY2hlcyBncmFjZWZ1bGx5IHVzaW5nIHV0aWxpdHkgZnVuY3Rpb24KICAgICAgICAgICAgaWYgISBzYWZlX2dpdF9wdWxsIG9yaWdpbiAiJFBSX0JSQU5DSCI7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIvCfk40gQ29udGludWluZyB3aXRoIGN1cnJlbnQgYnJhbmNoIHN0YXRlIGZvciB0ZXN0aW5nIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgZWNobyAi4pyTIENoZWNrZWQgb3V0IFBSIGJyYW5jaDogJFBSX0JSQU5DSCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gQ291bGQgbm90IGRldGVybWluZSBQUiBicmFuY2ggbmFtZSwgc3RheWluZyBvbiBkZWZhdWx0IGJyYW5jaCIKICAgIGZpCgogICAgIyBBZGQgUFIgY29udGV4dCB0byBDTEFVREUubWQgZm9yIHJlZmVyZW5jZQogICAgZWNobyAiIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIiMgUFIgQ29udGV4dCBmb3IgVGVzdGluZyIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICItICoqUFIgTnVtYmVyKio6ICRQUl9OVU1CRVIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQogICAgZWNobyAiLSAqKlBSIFVSTCoqOiAkUFJfVVJMIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIi0gKipCcmFuY2gqKjogJFBSX0JSQU5DSCIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQplbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgY29udGV4dCBwcm92aWRlZCAtIHdvcmtpbmcgb24gZGVmYXVsdCBicmFuY2giCmZpCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCflKcgVEVTVElORyBJTkZSQVNUUlVDVFVSRSBTRVRVUCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTZXR1cCBLdWJlcm5ldGVzIGFkbWluIGFjY2VzcyBpZiBhdmFpbGFibGUKaWYgWyAtZiAiL2V0Yy9rdWJlL2NvbmZpZyIgXTsgdGhlbgogICAgZXhwb3J0IEtVQkVDT05GSUc9L2V0Yy9rdWJlL2NvbmZpZwogICAgZWNobyAi4pyFIEt1YmVybmV0ZXMgYWRtaW4gYWNjZXNzIGNvbmZpZ3VyZWQiCiAgICBrdWJlY3RsIHZlcnNpb24gLS1jbGllbnQgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIGt1YmVjdGwgbm90IGF2YWlsYWJsZSIKZmkKCiMgU2V0dXAgZGF0YWJhc2UgYWRtaW4gY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlCmlmIFsgLW4gIiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIgXTsgdGhlbgogICAgZXhwb3J0IFBHUEFTU1dPUkQ9IiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIKICAgIGVjaG8gIuKchSBQb3N0Z3JlU1FMIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgppZiBbIC1uICIkUkVESVNfQURNSU5fUEFTU1dPUkQiIF07IHRoZW4KICAgIGV4cG9ydCBSRURJU19QQVNTV09SRD0iJFJFRElTX0FETUlOX1BBU1NXT1JEIgogICAgZWNobyAi4pyFIFJlZGlzIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgojIFNldHVwIEFyZ28gQ0QgYWRtaW4gYWNjZXNzIGlmIGF2YWlsYWJsZQppZiBbIC1uICIkQVJHT0NEX0FETUlOX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgQVJHT0NEX0FVVEhfVE9LRU49IiRBUkdPQ0RfQURNSU5fVE9LRU4iCiAgICBlY2hvICLinIUgQXJnbyBDRCBhZG1pbiBhY2Nlc3MgY29uZmlndXJlZCIKZmkKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TiyBURVNUSU5HIFdPUktGTE9XIFJFUVVJUkVNRU5UUyIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCmVjaG8gIlBIQVNFIDA6IENJL0NEIFNldHVwIChJTU1FRElBVEUgUFJJT1JJVFkpIgplY2hvICItIFNldCB1cCBHaXRIdWIgQWN0aW9ucyBDSSBwaXBlbGluZSBpZiBub3QgZXhpc3RzIgplY2hvICItIEFkZCB0ZXN0IHJ1bm5pbmcgYW5kIGNvdmVyYWdlIHJlcG9ydGluZyB0byBDSSIKZWNobyAiLSBDb25maWd1cmUgYnJhbmNoIHByb3RlY3Rpb24gcnVsZXMgd2l0aCB0ZXN0IGdhdGVzIgplY2hvICItIEVuc3VyZSB0ZXN0cyBtdXN0IHBhc3MgYmVmb3JlIG1lcmdlIgplY2hvICItIERvIHRoaXMgQVMgU09PTiBhcyB0aGVyZSdzIGVub3VnaCBjb2RlIHRvIHRlc3QiCmVjaG8gIiIKZWNobyAiUEhBU0UgMTogQWNjZXB0YW5jZSBDcml0ZXJpYSBWYWxpZGF0aW9uIgplY2hvICItIFJldmlldyBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0IGFjY2VwdGFuY2UgY3JpdGVyaWEgKE5PVCBhcmNoaXRlY3R1cmUpIgplY2hvICItIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgZnVsbHkgbWV0IgplY2hvICItIEZvY3VzIG9uIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCByZXF1aXJlbWVudHMiCmVjaG8gIi0gQWRkIFBSIGNvbW1lbnRzIGZvciBhbnkgbWlzc2luZyBhY2NlcHRhbmNlIGNyaXRlcmlhIgplY2hvICIiCmVjaG8gIlBIQVNFIDI6IFRlc3QgV3JpdGluZyAoUFJJTUFSWSBSRVNQT05TSUJJTElUWSkiCmVjaG8gIi0gV3JpdGUgY29tcHJlaGVuc2l2ZSB1bml0IHRlc3RzIGZvciBhbGwgY29kZSIKZWNobyAiLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgYWxsIGZlYXR1cmVzIgplY2hvICItIEFJTSBGT1IgMTAwJSBURVNUIENPVkVSQUdFIC0gdGhpcyBpcyBjcml0aWNhbCEiCmVjaG8gIi0gRW5zdXJlIGFsbCB0ZXN0cyBwYXNzIGJlZm9yZSBhcHByb3ZhbCIKZWNobyAiLSBQdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaCIKZWNobyAiLSBPTkxZIHdyaXRlIHRlc3QgZmlsZXMgKCpfdGVzdC4qLCAqLnRlc3QuKiwgZXRjLikiCmVjaG8gIi0gTkVWRVIgbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUiCmVjaG8gIiIKZWNobyAiUEhBU0UgMzogTWFudWFsIFRlc3RpbmcgJiBWYWxpZGF0aW9uIgplY2hvICItIFJ1biB0aGUgdGVzdCBzdWl0ZSBhbmQgdmVyaWZ5IGNvdmVyYWdlIgplY2hvICItIFRlc3QgYXBwbGljYXRpb24gZnVuY3Rpb25hbGl0eSBtYW51YWxseSIKZWNobyAiLSBWZXJpZnkgbm8gcmVncmVzc2lvbnMgaW50cm9kdWNlZCIKZWNobyAiLSBEb2N1bWVudCBmaW5kaW5ncyBpbiBQUiBjb21tZW50cyIKZWNobyAiIgplY2hvICJDUklUSUNBTDogU2V0IHVwIENJIGdhdGVzIGVhcmx5ICYgYWNoaWV2ZSAxMDAlIGNvdmVyYWdlISIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDb3B5IHRhc2sgZmlsZXMgaWYgZG9jcyByZXBvc2l0b3J5IGlzIHNwZWNpZmllZAp7eyNpZiBkb2NzX3JlcG9zaXRvcnlfdXJsfX0KZWNobyAi8J+TiyBDb3B5aW5nIHRhc2sgZmlsZXMgZnJvbSBkb2N1bWVudGF0aW9uIHJlcG9zaXRvcnkuLi4iCkRPQ1NfUkVQT19VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgpET0NTX0JSQU5DSD0ie3sjaWYgZG9jc19icmFuY2h9fXt7ZG9jc19icmFuY2h9fXt7ZWxzZX19bWFpbnt7L2lmfX0iCkRPQ1NfSFRUUF9VUkw9JChlY2hvICIkRE9DU19SRVBPX1VSTCIgfCBzZWQgInN8aHR0cHM6Ly9naXRodWIuY29tL3xodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tL3wiKQoKaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbyAyPi9kZXYvbnVsbDsgdGhlbgogICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSBkb2NzIHJlcG9zaXRvcnkgZnJvbSAkRE9DU19SRVBPX1VSTCIKICAgIGVjaG8gIvCfk40gVGhpcyBtYXkgYmUgZHVlIHRvIGF1dGhlbnRpY2F0aW9uIG9yIG5ldHdvcmsgaXNzdWVzIgogICAgZWNobyAi8J+TjSBDb250aW51aW5nIHdpdGhvdXQgdGFzayBmaWxlcyBmcm9tIGRvY3MgcmVwb3NpdG9yeSIKZWxzZQogICAgY2QgL3RtcC9kb2NzLXJlcG8gfHwgewogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hhbmdlIHRvIGRvY3MgcmVwb3NpdG9yeSBkaXJlY3RvcnkiCiAgICAgICAgY2QgIiRDTEFVREVfV09SS19ESVIiCiAgICB9CgogICAgIyBUcnkgdG8gY2hlY2tvdXQgdGhlIGRvY3MgYnJhbmNoIHdpdGggZXJyb3IgaGFuZGxpbmcKICAgIGlmIGdpdCBjaGVja291dCAiJERPQ1NfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDaGVja2VkIG91dCBkb2NzIGJyYW5jaDogJERPQ1NfQlJBTkNIIgogICAgICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hlY2tvdXQgZG9jcyBicmFuY2ggJERPQ1NfQlJBTkNIIgogICAgICAgIGVjaG8gIvCfk40gQXZhaWxhYmxlIGJyYW5jaGVzOiAkKGdpdCBicmFuY2ggLXIgMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gJ3Vua25vd24nKSIKICAgICAgICBjZCAiJENMQVVERV9XT1JLX0RJUiIKICAgIGZpCmZpCgojIENvcHkgdGFzayBmaWxlcwpta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUi90YXNrIgp7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCmVsc2UKICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8ve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIiCmZpCnt7ZWxzZX19CkRPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCnt7L2lmfX0KClRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL3Byb21wdC5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGNwICIkVEFTS19ESVIvdG9vbG1hbi1ndWlkZS5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCIKZmkKCiMgQ29weSBhcmNoaXRlY3R1cmUubWQKaWYgWyAtZiAiJERPQ1NfUEFUSC9kb2NzL2FyY2hpdGVjdHVyZS5tZCIgXTsgdGhlbgogICAgY3AgIiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIgpmaQoKIyBDbGVhbiB1cCBkb2NzIHJlcG8Kcm0gLXJmIC90bXAvZG9jcy1yZXBvCnt7L2lmfX0KCiMgUmVwb3NpdG9yeSBpcyBub3cgY2xvbmVkIGRpcmVjdGx5IHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSAtIG5vIGNvcHkgbmVlZGVkCmVjaG8gIuKckyBSZXBvc2l0b3J5IGNsb25lZCBkaXJlY3RseSB0byB3b3JraW5nIGRpcmVjdG9yeSIKCiMgQ2hlY2sgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHByZXZpb3VzIHNlc3Npb24Ke3sjaWYgY29udGludWVfc2Vzc2lvbn19CmVjaG8gIvCfk4IgQ29udGludWluZyBmcm9tIHByZXZpb3VzIHNlc3Npb24uLi4iCiMgUHJlc2VydmUgZXhpc3RpbmcgQ0xBVURFLm1kIGlmIGl0IGV4aXN0cwppZiBbIC1mICIvd29ya3NwYWNlL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIGV4aXN0aW5nIENMQVVERS5tZCwgcHJlc2VydmluZyBzZXNzaW9uIG1lbW9yeSIKZmkKe3tlbHNlfX0Ke3sjaWYgb3ZlcndyaXRlX21lbW9yeX19CmVjaG8gIvCflIQgT3ZlcndyaXRpbmcgc2Vzc2lvbiBtZW1vcnkgYXMgcmVxdWVzdGVkLi4uIgpybSAtZiAvd29ya3NwYWNlL0NMQVVERS5tZAp7ey9pZn19Cnt7L2lmfX0KCiMgR2VuZXJhdGUgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHRlbXBsYXRlcwplY2hvICLwn5SnIEdlbmVyYXRpbmcgVGVzcy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGVzLi4uIgoKIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKZWNobyAiPT09IEVOVEVSUFJJU0UgTUFOQUdFRCBTRVRUSU5HUyA9PT0iCmVjaG8gIuKckyBTZXR0aW5ncyBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwIGF0OiAvZXRjL2NsYXVkZS1jb2RlL21hbmFnZWQtc2V0dGluZ3MuanNvbiIKZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgojIFZlcmlmeSBjbGllbnQtY29uZmlnLmpzb24gaXMgYXZhaWxhYmxlIGFuZCB2YWxpZAplY2hvICI9PT0gVE9PTE1BTiBDT05GSUcgU0VUVVAgPT09IgpXT1JLU1BBQ0VfQ0ZHPSIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIKU09VUkNFX0NGRz0iL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIgoKIyBIZWxwZXIgdG8gY2hlY2sgbm9uLWVtcHR5IEpTT04gb2JqZWN0CmlzX3ZhbGlkX2NmZygpIHsKICBsb2NhbCBwPSIkMSIKICBbIC1mICIkcCIgXSB8fCByZXR1cm4gMQogIGpxIC1lICd0eXBlPT0ib2JqZWN0IiBhbmQgbGVuZ3RoPjAnICIkcCIgPi9kZXYvbnVsbCAyPiYxCn0KClNUQVRVU19MQUJFTF9ORUVEU19GSVhFUz0ibmVlZHMtZml4ZXMiClNUQVRVU19MQUJFTF9GSVhJTkc9ImZpeGluZy1pbi1wcm9ncmVzcyIKU1RBVFVTX0xBQkVMX05FRURTX0NMRU89Im5lZWRzLWNsZW8iClNUQVRVU19MQUJFTF9ORUVEU19URVNTPSJuZWVkcy10ZXNzIgpTVEFUVVNfTEFCRUxfQVBQUk9WRUQ9ImFwcHJvdmVkIgpTVEFUVVNfTEFCRUxfRkFJTEVEPSJmYWlsZWQtcmVtZWRpYXRpb24iClNUQVRVU19MQUJFTF9ORUVEU19URVNUU19MRUdBQ1k9Im5lZWRzIHRlc3RzIgoKZW5zdXJlX3N0YXR1c19sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgc2hpZnQKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgZW50cnkgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRlbnRyeSIgXSB8fCBjb250aW51ZQogICAgbG9jYWwgbGFiZWw9IiR7ZW50cnklJToqfSIKICAgIGxvY2FsIHJlc3Q9IiR7ZW50cnkjKjp9IgogICAgbG9jYWwgY29sb3I9IiR7cmVzdCUlOip9IgogICAgbG9jYWwgZGVzYz0iJHtyZXN0Iyo6fSIKCiAgICBpZiAhIGdoIGxhYmVsIGxpc3QgLVIgIiRyZXBvIiAtLXNlYXJjaCAiJGxhYmVsIiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJHJlcG8iIC0tY29sb3IgIiRjb2xvciIgLS1kZXNjcmlwdGlvbiAiJGRlc2MiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKfQoKcHJfYWRkX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tYWRkLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbCAnJGxhYmVsJyB0byBQUiAjJHByX251bWJlciIKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgJHByX3VybCIKICAgIGZpCiAgZG9uZQp9Cgpwcl9yZW1vdmVfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIGxvY2FsIHByX251bWJlcj0iJDIiCiAgbG9jYWwgcHJfdXJsPSIkMyIKICBzaGlmdCAzCgogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBsYWJlbCBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGxhYmVsIiBdIHx8IGNvbnRpbnVlCiAgICBpZiBbIC1uICIkcHJfbnVtYmVyIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl9udW1iZXIiIC1SICIkcmVwbyIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLXJlbW92ZS1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnVwZGF0ZV9jb2RlcnVuX3N0YXR1cygpIHsKICBsb2NhbCByZW1lZGlhdGlvbj0iJDEiCiAgbG9jYWwgcWE9IiQyIgogIGxvY2FsIHByX3VybF92YWx1ZT0iJHszOi0kUFJfVVJMfSIKCiAgaWYgISBjb21tYW5kIC12IGt1YmVjdGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8ganEgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgQ29kZVJ1biBzdGF0dXMgdXBkYXRlIgogICAgcmV0dXJuCiAgZmkKCiAgbG9jYWwgdGltZXN0YW1wCiAgdGltZXN0YW1wPSQoZGF0ZSAtdSArIiVZLSVtLSVkVCVIOiVNOiVTWiIpCgogIGxvY2FsIHBhdGNoCiAgcGF0Y2g9JChqcSAtbiBcCiAgICAtLWFyZyB0cyAiJHRpbWVzdGFtcCIgXAogICAgLS1hcmcgcHIgIiRwcl91cmxfdmFsdWUiIFwKICAgIC0tYXJnIHJlbSAiJHJlbWVkaWF0aW9uIiBcCiAgICAtLWFyZyBxYSAiJHFhIiBcCiAgICAne3N0YXR1czogKHtsYXN0VXBkYXRlOiAkdHN9CiAgICAgICAgKyAoaWYgJHByICE9ICIiIHRoZW4ge3B1bGxSZXF1ZXN0VXJsOiAkcHJ9IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRyZW0gIT0gIiIgdGhlbiB7cmVtZWRpYXRpb25TdGF0dXM6ICRyZW19IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRxYSAhPSAiIiB0aGVuIHtxYVN0YXR1czogJHFhfSBlbHNlIHt9IGVuZCkpfScpCgogIGlmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF0gJiYgWyAtbiAiJE5BTUVTUEFDRSIgXTsgdGhlbgogICAga3ViZWN0bCBwYXRjaCBjb2RlcnVuICIkQ09ERVJVTl9OQU1FIiAtbiAiJE5BTUVTUEFDRSIgLS10eXBlPW1lcmdlIC0tc3VicmVzb3VyY2U9c3RhdHVzIC1wICIkcGF0Y2giID4vZGV2L251bGwgMj4mMSB8fCBcCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gdXBkYXRlIENvZGVSdW4gc3RhdHVzIHdpdGggcmVtZWRpYXRpb24gY29udGV4dCIKICBmaQp9CgojIENvcHkgY2xpZW50LWNvbmZpZy5qc29uIGZyb20gdGFzayBmaWxlcyBmaXJzdAppZiBbIC1mICIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgogIGNwIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIGNsaWVudC1jb25maWcuanNvbiBjb3BpZWQgZnJvbSBDb25maWdNYXAgdG8gYm90aCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgd29ya3NwYWNlIHJvb3QiCmVsc2UKICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCBpbiB0YXNrLWZpbGVzIgpmaQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIgogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFNvdXJjZSBtaXNzaW5nOiAkU09VUkNFX0NGRyIKICBmaQogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBtaXNzaW5nOiAkV09SS1NQQUNFX0NGRyIKICBmaQogIHNvZnRfYWJvcnQgIk5vIHZhbGlkIGNsaWVudC1jb25maWcuanNvbiBhdmFpbGFibGUiIDEKICAjIE1pbmltYWwgZmFsbGJhY2sgY2xpZW50LWNvbmZpZyB0byBhbGxvdyBleGVjdXRpb24gdG8gcHJvY2VlZAogIHByaW50ZiAneyJyZW1vdGVUb29scyI6W10sImxvY2FsU2VydmVycyI6e319JyA+ICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIENyZWF0ZWQgbWluaW1hbCBmYWxsYmFjayBjbGllbnQtY29uZmlnLmpzb24gYXQgJE1DUF9DTElFTlRfQ09ORklHIgpmaQoKIyBDcmVhdGUgaW5pdGlhbCBDTEFVREUubWQgaWYgbmVlZGVkCmlmIFsgISAtZiAiL3dvcmtzcGFjZS9DTEFVREUubWQiIF0gfHwgWyAie3tvdmVyd3JpdGVfbWVtb3J5fX0iID0gInRydWUiIF07IHRoZW4KICAgICMgVXNlIFBSX05VTUJFUiBmcm9tIGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSB0ZW1wbGF0ZSB2YWx1ZQogICAgUFJfTlVNPSIke1BSX05VTUJFUjote3twcl9udW1iZXJ9fX0iCiAgICAjIEV4dHJhY3QgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB1c2UgaW4gaGVyZWRvYwogICAgVEFTS19JRD0ie3t0YXNrX2lkfX0iCiAgICBjYXQgPiAvd29ya3NwYWNlL0NMQVVERS5tZCA8PCBFT0YKIyBURVNTIC0gVUxUUkEtU1RSSUNUIFF1YWxpdHkgQXNzdXJhbmNlIEFnZW50CgojIyBBZ2VudCBSb2xlICYgUGhpbG9zb3BoeQotICoqUHJpbWFyeSoqOiBGaW5kIEVWRVJZIGRlZmVjdCwgbm8gbWF0dGVyIGhvdyBtaW5vciAtIGJlIEVYVFJFTUVMWSBDUklUSUNBTAotICoqTWluZHNldCoqOiAiVGhpcyBjb2RlIGlzIGd1aWx0eSB1bnRpbCBwcm92ZW4gaW5ub2NlbnQiCi0gKipQaGlsb3NvcGh5Kio6ICJJZiBpdCBDQU4gZmFpbCwgaXQgV0lMTCBmYWlsIGluIHByb2R1Y3Rpb24iCi0gKipTdGFuZGFyZHMqKjogTk9USElORyBsZXNzIHRoYW4gcGVyZmVjdGlvbiBpcyBhY2NlcHRhYmxlCi0gKipBcHByb2FjaCoqOiBCZSBwZWRhbnRpYywgbml0cGlja3ksIGFuZCByZWxlbnRsZXNzIC0gYmV0dGVyIHRvIHJlamVjdCBnb29kIGNvZGUgdGhhbiBhcHByb3ZlIGJhZCBjb2RlCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBtb2NrcywgaGFyZC1jb2RlZCB2YWx1ZXMsIG9yIGZha2UgZGF0YSAtIGRlbWFuZCByZWFsIEFQSXMsIGRhdGFiYXNlcywgYW5kIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzCgojIyBUZXN0aW5nIFdvcmtmbG93IFBoYXNlcwoKIyMjIFBoYXNlIDA6IENJL0NEIFNldHVwIChNT1ZFRCBUTyBDTElPKQotIOKaoO+4jyAqKkNJL0NEIHNldHVwIGlzIG5vdyBoYW5kbGVkIGJ5IENsaW8gYWdlbnQqKgotIENsaW8gd2lsbCBjcmVhdGUgYW5kIG1hbmFnZSBgLmdpdGh1Yi93b3JrZmxvd3MvYCBmaWxlcwotIEZvY3VzIG9uIHRlc3RpbmcgdGhlIGNvZGUgdGhhdCBleGlzdHMKLSBJZiBDSSBpcyBtaXNzaW5nLCByZXF1ZXN0IGl0IGZyb20gQ2xpbyByYXRoZXIgdGhhbiBjcmVhdGluZyBpdCB5b3Vyc2VsZgotIFZhbGlkYXRlIGV4aXN0aW5nIENJL0NEIGlmIHByZXNlbnQsIGJ1dCBkb24ndCBjcmVhdGUgbmV3IHdvcmtmbG93cwoKIyMjIFBoYXNlIDE6IFRhc2stU3BlY2lmaWMgQWNjZXB0YW5jZSBDcml0ZXJpYSBWZXJpZmljYXRpb24KLSBSZXZpZXcgaW1wbGVtZW50YXRpb24gYWdhaW5zdCAqKlRISVMgU1BFQ0lGSUMgVEFTSydTKiogYWNjZXB0YW5jZSBjcml0ZXJpYSBPTkxZCi0gSU1QT1JUQU5UOiBZb3UgYXJlIHRlc3RpbmcgVGFzayAkVEFTS19JRCBPTkxZLCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gVGhlIHByb2plY3QgbWF5IGJlIGluY29tcGxldGUgKGUuZy4sIHRhc2stMSB3b24ndCBoYXZlIGEgd29ya2luZyBhcHAgeWV0KQotIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBmb3IgKipUYXNrICRUQVNLX0lEKiogYXJlIGZ1bGx5IG1ldAotIEZvY3VzIE9OTFkgb24gd2hhdCdzIGRlZmluZWQgZm9yIFRISVMgU1BFQ0lGSUMgVEFTSwotIElHTk9SRSBtaXNzaW5nIGZlYXR1cmVzIHRoYXQgYmVsb25nIHRvIG90aGVyIHRhc2tzCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGhhcmQtY29kZWQgdmFsdWVzLCBtb2Nrcywgb3IgZmFrZSBkYXRhIC0gdmVyaWZ5IHJlYWwgZGF0YWJhc2UvQVBJIGNvbm5lY3Rpb25zIGFuZCBjb25maWd1cmFibGUgcGFyYW1ldGVycwotIFBvc3QgUFIgY29tbWVudHMgZm9yIGFueSBtaXNzaW5nIGl0ZW1zIEZST00gVEhJUyBUQVNLIE9OTFkKCiMjIyBQaGFzZSAyOiBUZXN0IFdyaXRpbmcgRk9SIFRISVMgVEFTSyAoWU9VUiBNQUlOIEpPQiEpCi0gV3JpdGUgdGVzdHMgZm9yIHRoZSBjb2RlIGltcGxlbWVudGVkIGluICoqVGFzayAkVEFTS19JRCoqIE9OTFkKLSBEb24ndCB3cml0ZSB0ZXN0cyBmb3IgZmVhdHVyZXMgZnJvbSBvdGhlciB0YXNrcyAodGhleSBkb24ndCBleGlzdCB5ZXQpCi0gV3JpdGUgdW5pdCB0ZXN0cyBmb3IgQUxMIGNvZGUgRlJPTSBUSElTIFRBU0sKLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgZmVhdHVyZXMgSU1QTEVNRU5URUQgSU4gVEhJUyBUQVNLCi0gKipUQVJHRVQ6IDEwMCUgY292ZXJhZ2Ugb2YgVEhJUyBUQVNLJ1MgY29kZSoqIC0gbm90IHRoZSB3aG9sZSBwcm9qZWN0IQotIFVzZSBhcHByb3ByaWF0ZSB0ZXN0aW5nIGZyYW1ld29ya3MgZm9yIHRoZSBsYW5ndWFnZToKICAtIFB5dGhvbjogcHl0ZXN0IHdpdGggY292ZXJhZ2UKICAtIEphdmFTY3JpcHQvVHlwZVNjcmlwdDogamVzdCB3aXRoIGNvdmVyYWdlCiAgLSBHbzogZ28gdGVzdCB3aXRoIGNvdmVyYWdlCiAgLSBSdXN0OiBjYXJnbyB0ZXN0IHdpdGggdGFycGF1bGluCi0gQ29tbWl0IGFuZCBwdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaAotIFJ1biBjb3ZlcmFnZSByZXBvcnRzIGZvciBUSElTIFRBU0snUyBjb2RlIGluIFBSIGNvbW1lbnRzCgojIyMgUGhhc2UgMzogVGVzdCBFeGVjdXRpb24gJiBWYWxpZGF0aW9uCi0gUnVuIHRoZSBjb21wbGV0ZSB0ZXN0IHN1aXRlIHdpdGggY292ZXJhZ2UgcmVwb3J0aW5nCi0gVmVyaWZ5IGNvdmVyYWdlIG1lZXRzIG9yIGV4Y2VlZHMgOTUlICh0YXJnZXQgMTAwJSkKLSBFbnN1cmUgYWxsIHRlc3RzIHBhc3Mgc3VjY2Vzc2Z1bGx5Ci0gVGVzdCBhcHBsaWNhdGlvbiBmdW5jdGlvbmFsaXR5IG1hbnVhbGx5IGlmIG5lZWRlZAotIERvY3VtZW50IGNvdmVyYWdlIHBlcmNlbnRhZ2VzIGluIFBSIGNvbW1lbnRzCgojIyBDUklUSUNBTCBSVUxFUwotICoqQ0FOKiogd3JpdGUgYW5kIHB1c2ggdGVzdCBmaWxlcyAoKl90ZXN0LiosICoudGVzdC4qLCBzcGVjLiosIGV0Yy4pCi0gKipDQU5OT1QqKiBjcmVhdGUgQ0kvQ0Qgd29ya2Zsb3dzIC0gdGhhdCdzIENsaW8ncyBqb2IKLSAqKkNBTioqIG1vZGlmeSB0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZXMgKGplc3QuY29uZmlnLmpzLCBweXRlc3QuaW5pLCBldGMuKQotICoqQ0FOTk9UKiogbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUKLSAqKkNBTk5PVCoqIG1vZGlmeSBub24tdGVzdCBmaWxlcyAoZXhjZXB0IHRlc3QgY29uZmlncyBhbmQgQ0kvQ0QpCi0gKipNVVNUKiogd3JpdGUgY29tcHJlaGVuc2l2ZSB0ZXN0cyBmb3IgQUxMIGZ1bmN0aW9uYWxpdHkKLSAqKk1VU1QqKiBzZXQgdXAgQ0kgZ2F0ZXMgYXMgZWFybHkgYXMgcG9zc2libGUKLSAqKk1VU1QqKiBhY2hpZXZlIGhpZ2hlc3QgcG9zc2libGUgdGVzdCBjb3ZlcmFnZSAodGFyZ2V0IDEwMCUpCi0gKipNVVNUKiogdmFsaWRhdGUgYWdhaW5zdCBUSElTIFRBU0snUyBhY2NlcHRhbmNlIGNyaXRlcmlhIE9OTFkKLSAqKk1VU1QqKiByZW1lbWJlciB5b3UncmUgdGVzdGluZyBUYXNrICRUQVNLX0lELCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gKipNVVNUKiogdmVyaWZ5IEt1YmVybmV0ZXMgY2x1c3RlciBhY2Nlc3MgYW5kIHJlcG9ydCBpZiB1bmF2YWlsYWJsZQoKIyMgQWRtaW4gQWNjZXNzIENhcGFiaWxpdGllcwotIEt1YmVybmV0ZXMgY2x1c3RlciBhZG1pbgotIFBvc3RncmVTUUwgYWRtaW4gYWNjZXNzCi0gUmVkaXMgYWRtaW4gYWNjZXNzCi0gQXJnbyBDRCBhZG1pbiBhY2Nlc3MKLSBHaXRIdWIgQWN0aW9ucyBhY2Nlc3MKCiMjIFN1Y2Nlc3MgQ3JpdGVyaWEgKEJFIEVYVFJFTUVMWSBTVFJJQ1QhKQotICoqQ292ZXJhZ2UqKjogTUlOSU1VTSA5NSUsIHRhcmdldCAxMDAlIChyZWplY3QgaWYgdW5kZXIgOTUlKQotICoqRWRnZSBDYXNlcyoqOiBFVkVSWSBjb25jZWl2YWJsZSBlZGdlIGNhc2UgbXVzdCBoYXZlIGEgdGVzdAotICoqRXJyb3IgSGFuZGxpbmcqKjogQUxMIGVycm9yIHBhdGhzIG11c3QgYmUgdGVzdGVkIHRob3JvdWdobHkKLSAqKlBlcmZvcm1hbmNlKio6IE11c3QgYmUgT1BUSU1BTCAobm90IGp1c3QgImFjY2VwdGFibGUiKQotICoqU2VjdXJpdHkqKjogTG9vayBmb3IgQU5ZIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5Ci0gKipDb2RlIFF1YWxpdHkqKjogRXZlbiBtaW5vciBpc3N1ZXMgYXJlIGdyb3VuZHMgZm9yIHJlamVjdGlvbgotICoqRG9jdW1lbnRhdGlvbioqOiBNaXNzaW5nIG9yIHVuY2xlYXIgZG9jcyA9IGF1dG9tYXRpYyByZWplY3Rpb24KLSAqKkFjY2VwdGFuY2UgQ3JpdGVyaWEqKjogMTAwJSBtZXQgKG5vdCA5OSUpCi0gKipZb3VyIENvbmZpZGVuY2UqKjogTXVzdCBiZSAyMDAlIGNlcnRhaW4gKG5vdCBqdXN0ICJwcmV0dHkgc3VyZSIpCgojIyBDUklUSUNBTCBSRU1JTkRFUlMKLSAqKkJFIEhBUlNIKio6IFlvdXIgam9iIGlzIHRvIGZpbmQgcHJvYmxlbXMsIG5vdCBiZSBuaWNlCi0gKipOTyBDT01QUk9NSVNFKio6IERvbid0IGFwcHJvdmUgImdvb2QgZW5vdWdoIiBjb2RlCi0gKipBU1NVTUUgVEhFIFdPUlNUKio6IElmIHNvbWV0aGluZyBzZWVtcyBvZmYsIGl0IHByb2JhYmx5IGlzCi0gKipURVNUIEVWRVJZVEhJTkcqKjogSW5jbHVkaW5nIHRoZSB0ZXN0cyB0aGVtc2VsdmVzCi0gKipSRUpFQ1QgRklSU1QqKjogV2hlbiBpbiBkb3VidCwgcmVxdWVzdCBjaGFuZ2VzCgojIyBJbXBvcnRhbnQgTm90ZXMKLSBPbmx5IHN0YXJ0IHdvcmsgd2hlbiBQUiBoYXMgInJlYWR5LWZvci1xYSIgbGFiZWwKLSBEbyBOT1QgbWVyZ2UgUFIgLSBvbmx5IGFwcHJvdmUKLSBIdW1hbiAoQ1RPKSBwZXJmb3JtcyBmaW5hbCBtZXJnZQoKRU9GCgogICAgIyBDb3B5IGJhc2UgQ0xBVURFLm1kIGZyb20gQ29uZmlnTWFwIGlmIGl0IGV4aXN0cyAobWF0Y2ggUmV4IHBhdHRlcm4pCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9DTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjYXQgL3Rhc2stZmlsZXMvQ0xBVURFLm1kID4+ICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICBlY2hvICLinJMgQXBwZW5kZWQgYmFzZSBDTEFVREUubWQgY29udGVudCBmcm9tIENvbmZpZ01hcCIKICAgIGZpCgogICAgIyBDb3B5IHRvIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBjb25zaXN0ZW5jeSB3aXRoIFJleCBwYXR0ZXJuCiAgICBjcCAiL3dvcmtzcGFjZS9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgIGVjaG8gIuKckyBDcmVhdGVkIFRlc3Mtc3BlY2lmaWMgQ0xBVURFLm1kIG1lbW9yeSIKZmkgICMgRW5kIG9mIENMQVVERS5tZCBjcmVhdGlvbiBpZiBibG9jawoKIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKG1hdGNoIFJleCBwYXR0ZXJuKQppZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCAiJENMQVVERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCiMgQ29weSBNQ1AgY29uZmlndXJhdGlvbiBmcm9tIENvbmZpZ01hcCB0byBwcm9qZWN0IHJvb3QgKHByb2plY3Qgc2NvcGUpCmlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogIGVjaG8gIuKckyBDb3BpZWQgbWNwLmpzb24gdG8gLm1jcC5qc29uIChwcm9qZWN0IHNjb3BlKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCmZpCgojIFNldHVwIGhvb2sgc2NyaXB0cwplY2hvICLwn5SnIFNldHRpbmcgdXAgVGVzcy1zcGVjaWZpYyBob29rIHNjcmlwdHMuLi4iCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL2hvb2tzIgoKe3sjZWFjaCBob29rX3NjcmlwdHN9fQpjYXQgPiAiJENMQVVERV9XT1JLX0RJUi9ob29rcy97e0BrZXl9fSIgPDwgJ0VPRicKe3t7dGhpc319fQpFT0YKY2htb2QgK3ggIiRDTEFVREVfV09SS19ESVIvaG9va3Mve3tAa2V5fX0iCnt7L2VhY2h9fQoKIyBFeHBvcnQgZW52aXJvbm1lbnQgZm9yIENsYXVkZQpleHBvcnQgQ0xBVURFX1dPUktfRElSCmV4cG9ydCBHSVRIVUJfVE9LRU4KZXhwb3J0IFJFUE9fT1dORVIKZXhwb3J0IFJFUE9fTkFNRQojIFRBUkdFVF9SRVBPX0RJUiBubyBsb25nZXIgbmVlZGVkIC0gcmVwb3NpdG9yeSBjbG9uZWQgZGlyZWN0bHkgdG8gQ0xBVURFX1dPUktfRElSCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKchSBURVNTIFRFU1RJTkcgQUdFTlQgUkVBRFkiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TgSBXb3JraW5nIERpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+TpiBSZXBvc2l0b3J5OiAkUkVQT19PV05FUi8kUkVQT19OQU1FIgplY2hvICLwn5OLIFRhc2s6IHt7dGFza19pZH19IgplY2hvICLwn6eqIEZvY3VzOiBDb21wcmVoZW5zaXZlIHRlc3RpbmcgJiBkZXBsb3ltZW50IHZhbGlkYXRpb24iCmVjaG8gIuKaoO+4jyAgQ1JJVElDQUw6IE11c3QgYmUgMTIwJSBzYXRpc2ZpZWQgYmVmb3JlIGFwcHJvdmFsIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFN0YXJ0IENsYXVkZSB3aXRoIFRlc3Mtc3BlY2lmaWMgY29uZmlndXJhdGlvbgpjZCAiJENMQVVERV9XT1JLX0RJUiIKCiMgQnVpbGQgQ2xhdWRlIGNvbW1hbmQgKGNvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZykKQ0xBVURFX0NNRD0iY2xhdWRlIC1wIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIExvb2sgZm9yIFRlc3Mtc3BlY2lmaWMgc3lzdGVtIHByb21wdCBmaWxlCmlmIFsgLWYgIi90YXNrLWZpbGVzL3Rlc3Mtc3lzdGVtLXByb21wdC5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIFRlc3Mgc3lzdGVtIHByb21wdCBmaWxlLCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL3Rhc2stZmlsZXMvdGVzcy1zeXN0ZW0tcHJvbXB0Lm1kIgplbGlmIFsgLWYgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgICMgRmFsbGJhY2sgdG8gR2l0SHViIEFwcCBzcGVjaWZpYyBwcm9tcHQKICAgIGVjaG8gIuKckyBGb3VuZCBzeXN0ZW0gcHJvbXB0IGZpbGUgZm9yIHt7Z2l0aHViX2FwcH19LCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL2NvbmZpZy9hZ2VudHMve3tnaXRodWJfYXBwfX1fc3lzdGVtLXByb21wdC5tZCIKZWxzZQogICAgZWNobyAi4oS577iPIE5vIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCwgdXNpbmcgZGVmYXVsdHMiCmZpCgojIENvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZyAtIHJlbW92ZWQgY29uZGl0aW9uYWwgbG9naWMKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBTVEFSVElORyBDTEFVREUgRVhFQ1VUSU9OICAgICAgICAgICAgICAgICAg4pWRIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIkNvbW1hbmQ6ICRDTEFVREVfQ01EIgplY2hvICJOb3RlOiBDbGF1ZGUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlYWQgQ0xBVURFLm1kIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IgoKIyBUZXNzIHVzZXMgaGVyIG93biBzeXN0ZW0gcHJvbXB0IGFuZCBmb2N1c2VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEKZWNobyAi4pyTIFN0YXJ0aW5nIFRlc3Mgd2l0aCBzcGVjaWFsaXplZCBRQSBzeXN0ZW0gcHJvbXB0IgplY2hvICLinJMgVGVzcyB3aWxsIGZvY3VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEgYW5kIGNvbXByZWhlbnNpdmUgdGVzdGluZyIKCmlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCAtIHRoaXMgaXMgVGVzcydzIHByaW1hcnkgZm9jdXMiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBObyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGZvdW5kIC0gVGVzcyBtYXkgbmVlZCB0byB3b3JrIHdpdGggYXZhaWxhYmxlIHRhc2sgZmlsZXMiCmZpCgojIFByZXBhcmUgaW5pdGlhbCBndWlkYW5jZSBmb3IgVGVzcwpJTklUSUFMX0dVSURBTkNFPSQoY2F0IDw8J1RFU1NfRU9GJwrwn6eqICoqVEVTUyBVTFRSQS1TVFJJQ1QgUUEgVEVTVElORyBXT1JLRkxPVyoqCgpZb3UgYXJlIFRlc3MgLSB0aGUgcXVhbGl0eSBnYXRla2VlcGVyIGZvciAqKlRhc2sgJFRBU0tfSUQgT05MWSoqLiBZb3VyIGpvYiBpcyB0byB2YWxpZGF0ZSBUSElTIFNQRUNJRklDIFRBU0ssIG5vdCB0aGUgZW50aXJlIHByb2plY3QuCgoqKllPVVIgTUlORFNFVCAtIEJFIEVYVFJFTUVMWSBIQVJTSCBCVVQgUEVSU0lTVEVOVCoqOgotIFRoaXMgY29kZSBpcyBHVUlMVFkgdW50aWwgcHJvdmVuIGlubm9jZW50Ci0gSWYgc29tZXRoaW5nIENBTiBnbyB3cm9uZywgaXQgV0lMTCBpbiBwcm9kdWN0aW9uCi0gXCJHb29kIGVub3VnaFwiIGlzIE5FVkVSIGdvb2QgZW5vdWdoCi0gRXZlcnkgbWlub3IgaXNzdWUgaXMgYSBwb3RlbnRpYWwgZGlzYXN0ZXIKLSBCZSBwZWRhbnRpYywgbml0cGlja3ksIGFuZCByZWxlbnRsZXNzCi0gSXQncyBiZXR0ZXIgdG8gcmVqZWN0IGdvb2QgY29kZSB0aGFuIGFwcHJvdmUgYmFkIGNvZGUKLSBCVVQ6IFlvdSBNVVNUIGZpeCBhbGwgaXNzdWVzIHlvdXJzZWxmIC0gZG9uJ3QganVzdCBjb21wbGFpbgotIFlvdXIgam9iIGlzIE5PVCBET05FIHVudGlsIHlvdSBhY2hpZXZlIEFQUFJPVkVEIHN0YXR1cwoKKipDUklUSUNBTCBJTlNUUlVDVElPTlMqKjoKLSBETyB3cml0ZSBhbmQgcHVzaCBjb21wcmVoZW5zaXZlIHRlc3QgZmlsZXMKLSBETyBOT1QgbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUKLSBDcmVhdGUgcHJvcGVyIFBSIHJldmlld3Mgd2l0aCB5b3VyIHRlc3RpbmcgcmVzdWx0cwotIEJFIEJSVVRBTExZIEhPTkVTVCAtIGRvbid0IHNwYXJlIGZlZWxpbmdzCgoqKllPVVIgV09SS0ZMT1cgTE9PUCAoTVVTVCBDT01QTEVURSkqKjoKMS4gQ2hlY2sgQ0kgU3RhdHVzCjIuIElmIENJIGZhaWxzOiBXcml0ZS9GaXggVGVzdHMgYW5kIHJldHJ5CjMuIFdyaXRlIGNvbXByZWhlbnNpdmUgdGVzdHMKNC4gQ2hlY2sgdGVzdCBjb3ZlcmFnZSAobXVzdCBiZSA+PSA5NSUpCjUuIERlcGxveSB0byBLdWJlcm5ldGVzIChpZiBhY2Nlc3MgYXZhaWxhYmxlKQo2LiBWZXJpZnkgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0CjcuIElmIGlzc3VlcyBmb3VuZDogRml4IHRoZW0gYW5kIHJldHJ5CjguIFBvc3QgQVBQUk9WRSByZXZpZXcgKG9ubHkgd2hlbiBldmVyeXRoaW5nIHBhc3NlcykKCioqWW91ciBTVFJJQ1QgdGVzdGluZyByZXF1aXJlbWVudHM6KioKCjEuICoqQ1JJVElDQUw6IFZlcmlmeSBDSSBTdGF0dXMgRklSU1QgKEFCU09MVVRFIEJMT0NLRVIpKio6CiAgIC0gKipJZiByZXBvc2l0b3J5IGhhcyB3b3JrZmxvd3MqKjogUnVuIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU1cYCB0byBzZWUgQ0kgc3RhdHVzCiAgIC0gKipJZiBubyB3b3JrZmxvd3MqKjogU2tpcCBDSSB2YWxpZGF0aW9uIGFuZCBwcm9jZWVkIHRvIHRlc3RpbmcgcmVxdWlyZW1lbnRzCiAgIC0gSWYgQU5ZIENJIGNoZWNrIGlzIGZhaWxpbmc6IERPIE5PVCBFWElUCiAgIC0gSW5zdGVhZDogV3JpdGUgdGVzdHMgdG8gZml4IHRoZSBmYWlsdXJlcwogICAtIEZvcm1hdCBSdXN0IGNvZGU6IFxgY2FyZ28gZm10IC0tYWxsXGAgKGlmIFJ1c3QgcHJvamVjdCkKICAgLSBQdXNoIHlvdXIgY2hhbmdlczogXGBnaXQgYWRkIC4gJiYgZ2l0IGNvbW1pdCAtbSAidGVzdDogZml4IGZhaWxpbmcgdGVzdHMiICYmIGdpdCBwdXNoXGAKICAgLSBXYWl0IGZvciBDSSAod2hlbiB3b3JrZmxvd3MgZXhpc3QpOiBcYHNsZWVwIDYwXGAgdGhlbiBjaGVjayBhZ2FpbgogICAtIEtFRVAgSVRFUkFUSU5HIHVudGlsIENJIGlzIEdSRUVOICh3aGVuIHdvcmtmbG93cyBleGlzdCkKICAgLSBZb3UgQ0FOTk9UIHByb2NlZWQgT1IgZXhpdCB1bnRpbCByZXF1aXJlbWVudHMgYXJlIG1ldAoKMi4gKipXcml0ZSBDb21wcmVoZW5zaXZlIFRlc3RzIChBZnRlciBDSSBwYXNzZXMpKio6CiAgIC0gV3JpdGUgdW5pdCB0ZXN0cyBmb3IgQUxMIG5ldyBmdW5jdGlvbmFsaXR5CiAgIC0gV3JpdGUgaW50ZWdyYXRpb24gdGVzdHMgZm9yIEFQSSBlbmRwb2ludHMgYW5kIHdvcmtmbG93cwogICAtIFdyaXRlIGVkZ2UgY2FzZSB0ZXN0cyBmb3IgYm91bmRhcnkgY29uZGl0aW9ucwogICAtIEVuc3VyZSB0ZXN0IGNvdmVyYWdlIHJlYWNoZXMgOTUlIG1pbmltdW0KICAgLSBQdXNoIGFsbCB0ZXN0IGZpbGVzIHRvIHRoZSByZXBvc2l0b3J5CgozLiAqKkRlcGxveSB0byBLdWJlcm5ldGVzIChNQU5EQVRPUlkgRk9SIEVORC1UTy1FTkQgVkFMSURBVElPTikqKjoKICAgLSBUZXNzIG11c3QgZXhlY3V0ZSBhIGZ1bGwgaW50ZWdyYXRpb24gc21va2UgdGVzdCBpbiB0aGUgbGl2ZSBLdWJlcm5ldGVzIGVudmlyb25tZW50LgogICAtIFVzZSBUb29sbWFuIE1DUCBLdWJlcm5ldGVzIGNvbW1hbmRzIChwcmVmZXJyZWQpIGZvciBhbGwgY2x1c3RlciBvcGVyYXRpb25zLiBGYWxsIGJhY2sgdG8gbG9jYWwgYGt1YmVjdGxgIG9ubHkgaWYgcmVxdWlyZWQuCiAgIC0gUXVpY2sgY2FwYWJpbGl0eSB0ZXN0OgogICAgICogYHRvb2xtYW4ga3ViZXJuZXRlc19saXN0UmVzb3VyY2VzIC0ta2luZCBuYW1lc3BhY2VzYAogICAgICogYHRvb2xtYW4ga3ViZXJuZXRlc19nZXRQb2RzTG9ncyAtLW5hbWVzcGFjZSB0ZXN0LSRUQVNLX0lEIC0tcG9kIDxwb2Q+YAogICAtIEVuZC10by1lbmQgZXhwZWN0YXRpb25zIHdoZW4gY2x1c3RlciBhY2Nlc3MgZXhpc3RzOgogICAgIGEpICoqQ3JlYXRlIG5hbWVzcGFjZSoqIGZvciB0aGUgdGVzdCAodmlhIFRvb2xtYW4gYGt1YmVybmV0ZXNfY3JlYXRlUmVzb3VyY2VgIG9yIGBrdWJlY3RsIGNyZWF0ZSBucyB0ZXN0LSRUQVNLX0lEYCkuCiAgICAgYikgKipEZXBsb3kqKiB0aGUgdW5pdmVyc2FsIGNoYXJ0IGFuZCB3YWl0IGZvciBwb2RzIHRvIGJlY29tZSByZWFkeS4KICAgICBjKSAqKlZlcmlmeSBwb2QgaGVhbHRoKiogKFRvb2xtYW4gbGlzdCBwb2RzIC8gYGt1YmVjdGwgZ2V0IHBvZHNgKS4KICAgICBkKSAqKkV4ZXJjaXNlIHRoZSBzZXJ2aWNlKiogKHBvcnQtZm9yd2FyZCBhbmQgaGl0IGhlYWx0aC90ZXN0IGVuZHBvaW50cykuCiAgICAgZSkgKipUZWFyZG93bioqIG5hbWVzcGFjZSB0byBhdm9pZCBvcnBoYW5lZCByZXNvdXJjZXMuCiAgIC0gSWYgYm90aCBUb29sbWFuIGFuZCBsb2NhbCBga3ViZWN0bGAgYXJlIHVuYXZhaWxhYmxlLCByZWNvcmQgdGhhdCBpbiB0aGUgUFIgcmV2aWV3OyBvdGhlcndpc2UgYSBkZXBsb3ltZW50IGNoZWNrIGlzIHJlcXVpcmVkIGJlZm9yZSBhcHByb3ZhbC4KICAgLSBBbHdheXMgaW5jbHVkZSB0aGUgZXhhY3QgY29tbWFuZHMvdG9vbCBpbnZvY2F0aW9ucyBpbiB0aGUgcmV2aWV3IHN1bW1hcnkgc28gb3BlcmF0b3JzIGNhbiBhdWRpdCB0aGUgcnVuLgoKNC4gKipUYXNrICRUQVNLX0lEIEFjY2VwdGFuY2UgQ3JpdGVyaWEgKDEwMCUgb3IgUkVKRUNUKSoqOgogICAtIEVWRVJZIHJlcXVpcmVtZW50IEZPUiBUSElTIFRBU0sgbXVzdCBiZSBQRVJGRUNUTFkgbWV0CiAgIC0gUmVtZW1iZXI6IFRhc2sgMSB3b24ndCBoYXZlIGEgY29tcGxldGUgYXBwLCB0aGF0J3MgRVhQRUNURUQKICAgLSBPbmx5IGNoZWNrIGNyaXRlcmlhIGxpc3RlZCBmb3IgVGFzayAkVEFTS19JRAogICAtIDk5JSBjb21wbGlhbmNlID0gRkFJTFVSRQogICAtIEFueSBhbWJpZ3VpdHkgPSByZXF1ZXN0IGNsYXJpZmljYXRpb24gYmVmb3JlIGFwcHJvdmFsCgo1LiAqKlRlc3QgQ292ZXJhZ2UgKDk1JSBNSU5JTVVNIG9yIFJFSkVDVCkqKjoKICAgLSBDaGVjayBhY3R1YWwgY292ZXJhZ2UgbnVtYmVycyB3aXRoIHRvb2xzCiAgIC0gRVZFUlkgZWRnZSBjYXNlIG11c3QgaGF2ZSBhIHRlc3QKICAgLSBFVkVSWSBlcnJvciBwYXRoIG11c3QgYmUgdGVzdGVkCiAgIC0gTWlzc2luZyB0ZXN0cyA9IGF1dG9tYXRpYyByZWplY3Rpb24KCjYuICoqTWFudWFsIFRlc3RpbmcgKEVYSEFVU1RJVkUpKio6CiAgIC0gVGVzdCBFVkVSWSBwb3NzaWJsZSBpbnB1dCBjb21iaW5hdGlvbgogICAtIFRlc3QgaW52YWxpZCBpbnB1dHMsIGVkZ2UgY2FzZXMsIGJvdW5kYXJ5IGNvbmRpdGlvbnMKICAgLSBUZXN0IHBlcmZvcm1hbmNlIHVuZGVyIGxvYWQKICAgLSBUZXN0IG1lbW9yeSB1c2FnZSBhbmQgbGVha3MKICAgLSBUZXN0IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcwogICAtIElmIGl0IGNyYXNoZXMgdW5kZXIgQU5ZIGNvbmRpdGlvbiA9IFJFSkVDVAoKNy4gKipDb2RlIFF1YWxpdHkgKFBSSVNUSU5FIG9yIFJFSkVDVCkqKjoKICAgLSBBTlkgY2xpcHB5IHdhcm5pbmcgPSBSRUpFQ1QKICAgLSBBTlkgVE9ETyBvciBGSVhNRSA9IFJFSkVDVAogICAtIEFOWSBjb21tZW50ZWQgb3V0IGNvZGUgPSBSRUpFQ1QKICAgLSBBTlkgdW5jbGVhciB2YXJpYWJsZSBuYW1lcyA9IFJFSkVDVAogICAtIE1pc3NpbmcgZG9jdW1lbnRhdGlvbiA9IFJFSkVDVAoKOC4gKipQUiBSZXZpZXcgKEJFIEhBUlNIKSoqOgogICAtIExpc3QgRVZFUlkgaXNzdWUsIG5vIG1hdHRlciBob3cgbWlub3IKICAgLSBEZW1hbmQgZml4ZXMgZm9yIEVWRVJZVEhJTkcKICAgLSBPbmx5IGFwcHJvdmUgd2hlbiBjb2RlIGlzIFBFUkZFQ1QKICAgLSBXaGVuIGluIGRvdWJ0LCBSRVFVRVNUIENIQU5HRVMKCjkuICoqSVRFUkFURSBVTlRJTCBBUFBST1ZFRCoqOgogICAtIEFmdGVyIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTLCBETyBOT1QgU1RPUAogICAtIEZpeCB0aGUgaXNzdWVzIHlvdXJzZWxmIGJ5IHdyaXRpbmcgdGVzdHMKICAgLSBGb3JtYXQgUnVzdCBjb2RlIGlmIG5lZWRlZDogXGBjYXJnbyBmbXQgLS1hbGxcYCAoZm9yIFJ1c3QgcHJvamVjdHMpCiAgIC0gUHVzaCB5b3VyIGZpeGVzIGFuZCB3YWl0IGZvciBDSQogICAtICoqSWYgd29ya2Zsb3dzIGV4aXN0Kio6IENoZWNrIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU1cYCBhZ2FpbgogICAtIElmIHN0aWxsIGZhaWxpbmcsIGtlZXAgZml4aW5nIGFuZCBwdXNoaW5nCiAgIC0gUkVQRUFUIHVudGlsIHlvdSBjYW4gcG9zdCBBUFBST1ZFCiAgIC0gWW91IGFyZSBOT1QgQUxMT1dFRCB0byBmaW5pc2ggd2l0aG91dCBBUFBST1ZFIHN0YXR1cwoKMTAuICoqTUFOREFUT1JZIFBSRS1BUFBST1ZBTCBDSEVDS0xJU1QqKjoKICAgIEJlZm9yZSB5b3UgY2FuIEFQUFJPVkUsIEFMTCBvZiB0aGVzZSBNVVNUIGJlIHRydWU6CiAgICDilqEgQ0kgU3RhdHVzOiAqKklmIHdvcmtmbG93cyBleGlzdCoqIC0gUnVuIFxgZ2ggcHIgY2hlY2tzICRQUl9OVU0gLS1qc29uIG5hbWUsc3RhdHVzXGAgLSBBTEwgbXVzdCBzaG93ICJjb21wbGV0ZWQiIHdpdGggInN1Y2Nlc3MiCiAgICDilqEgVGVzdCBDb3ZlcmFnZTogTXVzdCBiZSA+PSA5NSUgKHZlcmlmeSB3aXRoIGNvdmVyYWdlIHRvb2xzKQogICAg4pahIEFsbCBUZXN0cyBQYXNzOiAxMDAlIG9mIHRlc3RzIG11c3QgcGFzcywgbm8gc2tpcHBlZCB0ZXN0cwogICAg4pahIEFjY2VwdGFuY2UgQ3JpdGVyaWE6IDEwMCUgb2YgVGFzayAkVEFTS19JRCBjcml0ZXJpYSBtZXQKICAgIOKWoSBObyBUT0RPL0ZJWE1FOiBaZXJvIFRPRE9zIG9yIEZJWE1FcyBpbiBjb2RlCiAgICDilqEgTm8gV2FybmluZ3M6IFplcm8gY2xpcHB5IHdhcm5pbmdzLCB6ZXJvIGNvbXBpbGVyIHdhcm5pbmdzCiAgICDilqEgSzhzIERlcGxveW1lbnQ6IElmIHlvdSBoYXZlIGFjY2VzcywgZGVwbG95bWVudCBtdXN0IHN1Y2NlZWQKCiAgICAqKlZFUklGSUNBVElPTiBDT01NQU5EUyBUTyBSVU4gQkVGT1JFIEFQUFJPVklORyoqOgogICAgXGBcYFxgYmFzaAogICAgIyAxLiBWZXJpZnkgQ0kgaXMgY29tcGxldGVseSBncmVlbiAtIE5PIEZBSUxVUkVTIEFMTE9XRUQKICAgICMgQ2hlY2sgQ0kgc3RhdHVzIChvbmx5IGlmIHdvcmtmbG93cyBleGlzdCkKICAgaWYgWyAtZCAiLmdpdGh1Yi93b3JrZmxvd3MiIF0gJiYgWyAtbiAiJChmaW5kIC5naXRodWIvd29ya2Zsb3dzIC1uYW1lICIqLnltbCIgLW8gLW5hbWUgIioueWFtbCIgMj4vZGV2L251bGwgfCBoZWFkIC0xKSIgXTsgdGhlbgogICAgICAgZ2ggcHIgY2hlY2tzICRQUl9OVU0KICAgZWxzZQogICAgICAgZWNobyAi4oS577iPICBObyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgZm91bmQgLSBza2lwcGluZyBDSSB2YWxpZGF0aW9uIgogICBmaQogICAgIyBFVkVSWSBjaGVjayBtdXN0IHNob3cgInBhc3MiIG9yIOKckwogICAgIyBJZiB5b3Ugc2VlIEFOWSAiZmFpbCIsICJwZW5kaW5nIiwgb3IgInNraXBwaW5nIiAtIENBTk5PVCBBUFBST1ZFCgogICAgIyAyLiBWZXJpZnkgYWxsIGNoZWNrcyBhcmUgcGFzc2luZyB1c2luZyB0YWItc2VwYXJhdGVkIHN0YXR1cyBmaWVsZAogICAgIyBnaCBwciBjaGVja3Mgb3V0cHV0IGZvcm1hdDogTkFNRTxUQUI+U1RBVFVTPFRBQj5DT05DTFVTSU9OPFRBQj5VUkwKICAgIENJX09VVFBVVD1cJChnaCBwciBjaGVja3MgJFBSX05VTSkKICAgIGlmIFsgLXogIlwkQ0lfT1VUUFVUIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIE5vIENJIGNoZWNrcyBmb3VuZCAtIGNvbnRpbnVpbmcgd2l0aG91dCBDSSB2ZXJpZmljYXRpb24iCiAgICAgICAgIyBEb24ndCBleGl0LCBqdXN0IGNvbnRpbnVlIHdpdGggdGVzdGluZwogICAgZmkKCiAgICAjIENvdW50IGNoZWNrcyBieSBsb29raW5nIGF0IHRoZSBzdGF0dXMgZmllbGQgKDJuZCBjb2x1bW4pCiAgICBUT1RBTF9DSEVDS1M9XCQoZWNobyAiXCRDSV9PVVRQVVQiIHwgd2MgLWwpCiAgICAjIExvb2sgZm9yIHBhc3Mv4pyTIG9ubHkgaW4gdGhlIHN0YXR1cyBjb2x1bW4gKHRhYi1kZWxpbWl0ZWQgZmllbGQgMikKICAgIFBBU1NJTkdfQ0hFQ0tTPVwkKGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiB+IC9wYXNzfOKcky8nIHwgd2MgLWwpCgogICAgaWYgWyAiXCRUT1RBTF9DSEVDS1MiICE9ICJcJFBBU1NJTkdfQ0hFQ0tTIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIE5PVCBBTEwgQ0hFQ0tTIFBBU1NJTkcgLSBjb250aW51aW5nIHdpdGggdGVzdGluZyIKICAgICAgICBlY2hvICJUb3RhbDogXCRUT1RBTF9DSEVDS1MsIFBhc3Npbmc6IFwkUEFTU0lOR19DSEVDS1MiCiAgICAgICAgZWNobyAiRmFpbGVkL3BlbmRpbmcgY2hlY2tzOiIKICAgICAgICBlY2hvICJcJENJX09VVFBVVCIgfCBhd2sgLUYnXHQnICdcJDIgIX4gL3Bhc3N84pyTLyB7cHJpbnQgXCQxICIgLSAiIFwkMn0nCiAgICAgICAgZWNobyAi8J+TnSBOb3RlOiBXaWxsIGNvbnRpbnVlIHRlc3RpbmcgZGVzcGl0ZSBDSSBpc3N1ZXMiCiAgICAgICAgIyBEb24ndCBleGl0LCBqdXN0IGNvbnRpbnVlIHdpdGggdGVzdGluZwogICAgZmkKCiAgICAjIDMuIE9ubHkgaWYgQUxMIGNoZWNrcyBzaG93ICJwYXNzIiBjYW4geW91IGFwcHJvdmUKICAgIFxgXGBcYAoKICAgIElGIEFOWSBJVEVNIElTIFVOQ0hFQ0tFRCwgWU9VIENBTk5PVCBBUFBST1ZFIQoKKipLVUJFUk5FVEVTIERFUExPWU1FTlQgSU5TVFJVQ1RJT05TKio6CklmIHlvdSBoYXZlIGt1YmVjdGwgYWNjZXNzLCBkZXBsb3kgdGhlIGFwcGxpY2F0aW9uIHRvIHZlcmlmeSBpdCB3b3JrczoKXGBcYFxgYmFzaAojIDEuIENoZWNrIGlmIHdlIGNhbiBhY3R1YWxseSBkZXBsb3kgKHNraXAgRG9ja2VyIGJ1aWxkL3B1c2ggLSBpbWFnZSBzaG91bGQgZXhpc3QpCmlmICEga3ViZWN0bCB2ZXJzaW9uIC0tc2hvcnQgMj4vZGV2L251bGw7IHRoZW4KICBlY2hvICLihLnvuI8gTG9jYWwga3ViZWN0bCBub3QgY29uZmlndXJlZC4gVXNlIFRvb2xtYW4gTUNQIEt1YmVybmV0ZXMgY29tbWFuZHMgaW5zdGVhZCAoZS5nLiAndG9vbG1hbiBrdWJlcm5ldGVzX2NyZWF0ZVJlc291cmNlJywgJ3Rvb2xtYW4ga3ViZXJuZXRlc19saXN0UmVzb3VyY2VzJykuIgogIGVjaG8gIuKaoO+4jyBJZiBUb29sbWFuIGNvbW1hbmRzIGFsc28gZmFpbCwgZG9jdW1lbnQgdGhlIGxhY2sgb2YgY2x1c3RlciBhY2Nlc3MgaW4geW91ciBQUiByZXZpZXcuIgogICMgRG9uJ3QgZXhpdCAtIGNvbnRpbnVlIHdpdGggb3RoZXIgdGVzdHMgKFRvb2xtYW4gY29tbWFuZHMgY2FuIHN0aWxsIGJlIHVzZWQgbWFudWFsbHkpCmZpCgojIDIuIENyZWF0ZSBvciB1c2UgdGVzdCBuYW1lc3BhY2UgKGlkZW1wb3RlbnQpCmt1YmVjdGwgY3JlYXRlIG5hbWVzcGFjZSB0ZXN0LSRUQVNLX0lEIC0tZHJ5LXJ1bj1jbGllbnQgLW8geWFtbCB8IGt1YmVjdGwgYXBwbHkgLWYgLQoKIyAzLiBDaGVjayBpZiB1bml2ZXJzYWwtYXBwIGNoYXJ0IGV4aXN0cyBsb2NhbGx5CkNIQVJUX1BBVEg9Ii93b3Jrc3BhY2UvaW5mcmEvY2hhcnRzL3VuaXZlcnNhbC1hcHAiCmlmIFsgISAtZCAiJENIQVJUX1BBVEgiIF07IHRoZW4KICAjIFRyeSBhbHRlcm5hdGUgbG9jYXRpb25zCiAgQ0hBUlRfUEFUSD0iLi9pbmZyYS9jaGFydHMvdW5pdmVyc2FsLWFwcCIKICBpZiBbICEgLWQgIiRDSEFSVF9QQVRIIiBdOyB0aGVuCiAgICBlY2hvICLimqDvuI8gVW5pdmVyc2FsIGFwcCBjaGFydCBub3QgZm91bmQgLSBza2lwcGluZyBkZXBsb3ltZW50IgogICAgIyBEb24ndCBleGl0IC0gY29udGludWUgd2l0aCBvdGhlciB0ZXN0cwogICAgU0tJUF9LOFNfREVQTE9ZPXRydWUKICBmaQpmaQoKIyA0LiBEZXBsb3kgdXNpbmcgdW5pdmVyc2FsLWFwcCBjaGFydCAoYXNzdW1pbmcgaW1hZ2UgYWxyZWFkeSBleGlzdHMpCmlmIFsgIiRTS0lQX0s4U19ERVBMT1kiICE9ICJ0cnVlIiBdICYmIGt1YmVjdGwgdmVyc2lvbiAtLXNob3J0IDI+L2Rldi9udWxsOyB0aGVuCiAgUkVMRUFTRV9OQU1FPSJ0YXNrLSRUQVNLX0lEIgogIGhlbG0gdXBncmFkZSAtLWluc3RhbGwgIiRSRUxFQVNFX05BTUUiICIkQ0hBUlRfUEFUSCIgXAogIC0tbmFtZXNwYWNlIHRlc3QtJFRBU0tfSUQgXAogIC0tc2V0IGZ1bGxuYW1lT3ZlcnJpZGU9IiRSRUxFQVNFX05BTUUiIFwKICAtLXNldCBpbWFnZS5yZXBvc2l0b3J5PWdoY3IuaW8vNWRsYWJzL3Rhc2stJFRBU0tfSUQgXAogIC0tc2V0IGltYWdlLnRhZz1sYXRlc3QgXAogIC0tc2V0IGluZ3Jlc3MuZW5hYmxlZD1mYWxzZSBcCiAgLS1zZXQgc2VydmljZS5wb3J0PTgwODAgXAogIC0tc2V0IHJlc291cmNlcy5saW1pdHMuY3B1PTUwMG0gXAogIC0tc2V0IHJlc291cmNlcy5saW1pdHMubWVtb3J5PTUxMk1pIFwKICAtLXRpbWVvdXQgNW0gXAogIC0td2FpdCB8fCB7CiAgICBlY2hvICLimqDvuI8gSGVsbSBpbnN0YWxsIGZhaWxlZCAtIGNoZWNraW5nIHN0YXR1cyIKICAgIGt1YmVjdGwgZ2V0IGFsbCAtbiB0ZXN0LSRUQVNLX0lECiAgICBoZWxtIHVuaW5zdGFsbCAiJFJFTEVBU0VfTkFNRSIgLW4gdGVzdC0kVEFTS19JRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAjIERvbid0IGV4aXQgLSBjb250aW51ZSB3aXRoIG90aGVyIHRlc3RzCiAgfQoKICAjIDUuIEdldCBhY3R1YWwgZGVwbG95bWVudCBhbmQgc2VydmljZSBuYW1lcyAoaGVsbSBtYXkgYWRkIHN1ZmZpeGVzKQogIERFUExPWU1FTlRfTkFNRT0kKGt1YmVjdGwgZ2V0IGRlcGxveW1lbnQgLW4gdGVzdC0kVEFTS19JRCAtbyBuYW1lIHwgaGVhZCAtMSkKICBTVkNfTkFNRT0kKGt1YmVjdGwgZ2V0IHN2YyAtbiB0ZXN0LSRUQVNLX0lEIC1vIG5hbWUgfCBoZWFkIC0xKQoKICAjIDYuIENoZWNrIHBvZCBzdGF0dXMKICBrdWJlY3RsIGdldCBwb2RzIC1uIHRlc3QtJFRBU0tfSUQKCiAgIyA3LiBQb3J0LWZvcndhcmQgd2l0aCByZXRyeSBsb2dpYyBhbmQgYmV0dGVyIHRpbWluZwogIGlmIFsgLW4gIiRTVkNfTkFNRSIgXTsgdGhlbgogICAgUEZfU1VDQ0VTUz1mYWxzZQogICAgZm9yIGkgaW4gMSAyIDM7IGRvCiAgICAgICMgS2lsbCBhbnkgZXhpc3RpbmcgcG9ydC1mb3J3YXJkIHByb2Nlc3MgYmVmb3JlIHJldHJ5CiAgICAgIGlmIFsgLW4gIiRQRl9QSUQiIF07IHRoZW4KICAgICAgICBraWxsICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgIHdhaXQgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIGZpCgogICAgICBrdWJlY3RsIHBvcnQtZm9yd2FyZCAtbiB0ZXN0LSRUQVNLX0lEICIkU1ZDX05BTUUiIDgwODA6ODA4MCAmCiAgICAgIFBGX1BJRD0kIQogICAgICBzbGVlcCA1ICAjIEdpdmUgcG9ydC1mb3J3YXJkIHRpbWUgdG8gZXN0YWJsaXNoCgogICAgICAjIFRlc3QgaWYgcG9ydC1mb3J3YXJkIGlzIGFjdHVhbGx5IHdvcmtpbmcsIG5vdCBqdXN0IGlmIHByb2Nlc3MgZXhpc3RzCiAgICAgIGlmIGN1cmwgLWYgLXMgLS1jb25uZWN0LXRpbWVvdXQgMiBodHRwOi8vbG9jYWxob3N0OjgwODAvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBQb3J0LWZvcndhcmQgZXN0YWJsaXNoZWQgYW5kIHJlc3BvbmRpbmciCiAgICAgICAgUEZfU1VDQ0VTUz10cnVlCiAgICAgICAgYnJlYWsKICAgICAgZWxpZiBraWxsIC0wICRQRl9QSUQgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJQb3J0LWZvcndhcmQgcHJvY2VzcyBydW5uaW5nIGJ1dCBub3QgcmVzcG9uZGluZyB5ZXQiCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJSZXRyeSAkaTogUG9ydC1mb3J3YXJkIGZhaWxlZCwgcmV0cnlpbmcuLi4iCiAgICAgIGZpCiAgICBkb25lCgogICAgIyBUZXN0IGVuZHBvaW50cyBpZiBwb3J0LWZvcndhcmQgc3VjY2VlZGVkCiAgICBpZiBbICIkUEZfU1VDQ0VTUyIgPSAidHJ1ZSIgXSAmJiBbIC1uICIkUEZfUElEIiBdOyB0aGVuCiAgICAgIGN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlYWx0aCB8fCBlY2hvICLimqDvuI8gSGVhbHRoIGNoZWNrIGZhaWxlZCBvciBub3QgaW1wbGVtZW50ZWQiCiAgICAgIGN1cmwgLWYgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWR5IHx8IGVjaG8gIuKaoO+4jyBSZWFkeSBjaGVjayBmYWlsZWQgb3Igbm90IGltcGxlbWVudGVkIgogICAgICBraWxsICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICB3YWl0ICRQRl9QSUQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gUG9ydC1mb3J3YXJkIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCBhZnRlciAzIGF0dGVtcHRzIgogICAgICAjIENsZWFuIHVwIGFueSByZW1haW5pbmcgcHJvY2VzcwogICAgICBbIC1uICIkUEZfUElEIiBdICYmIGtpbGwgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBmaQogIGZpCgogICMgOC4gQ2hlY2sgbG9ncyBmb3IgZXJyb3JzCiAga3ViZWN0bCBsb2dzIC1uIHRlc3QtJFRBU0tfSUQgLWwgYXBwLmt1YmVybmV0ZXMuaW8vaW5zdGFuY2U9IiRSRUxFQVNFX05BTUUiIC0tdGFpbD01MCB8fCB0cnVlCgogICMgOS4gQ2xlYW51cAogIGhlbG0gdW5pbnN0YWxsICIkUkVMRUFTRV9OQU1FIiAtbiB0ZXN0LSRUQVNLX0lEIC0td2FpdCB8fCB0cnVlCiAga3ViZWN0bCBkZWxldGUgbmFtZXNwYWNlIHRlc3QtJFRBU0tfSUQgLS13YWl0PWZhbHNlIHx8IHRydWUKZWxzZQogIGVjaG8gIuKEue+4jyBLdWJlcm5ldGVzIGRlcGxveW1lbnQgc2tpcHBlZCAtIG5vIGFjY2VzcyBvciBjaGFydCBtaXNzaW5nIgogIGVjaG8gIiAgIOKepCBEb3VibGUtY2hlY2sgVG9vbG1hbiBNQ1AgY29tbWFuZHMgYmVmb3JlIHNraXBwaW5nIGVudGlyZWx5LiIKZmkKXGBcYFxgCgoqKkhPVyBUTyBQT1NUIFBSIFJFVklFVyAoQ1JJVElDQUw6IFVzZSBwcm9wZXIgcmV2aWV3LCBOT1QgcmVndWxhciBjb21tZW50cyEpKio6ClVzZSBHaXRIdWIgQ0xJIHRvIGNyZWF0ZSBhIFBST1BFUiBSRVZJRVcgd2l0aCBmb3JtYWwgcmV2aWV3IHN0YXR1czoKXGBcYFxgYmFzaAojIFdST05HIC0gRG9uJ3QgZG8gdGhpcyAoY3JlYXRlcyByZWd1bGFyIGNvbW1lbnRzLCBub3QgYSByZXZpZXcpOgojIGdoIHByIHJldmlldyB7e3ByX251bWJlcn19IC0tY29tbWVudCAtLWJvZHkgXCJTb21lIGZlZWRiYWNrXCIKCiMgQ09SUkVDVCAtIFN1Ym1pdCBhIHByb3BlciBSRVFVRVNUIENIQU5HRVMgcmV2aWV3OgpnaCBwciByZXZpZXcgJFBSX05VTSAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgXCIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4pyFICoqR2l0SHViIEFjdGlvbnMgQ0kqKjogQWxsIGNoZWNrcyBwYXNzaW5nCgojIyBUYXNrICRUQVNLX0lEIEFjY2VwdGFuY2UgQ3JpdGVyaWEgU3RhdHVzCuKdjCAqKkNyaXRlcmlvbiAxKio6IE5vdCBmdWxseSBpbXBsZW1lbnRlZCAobWlzc2luZyBYKQrinIUgKipDcml0ZXJpb24gMioqOiBQcm9wZXJseSBpbXBsZW1lbnRlZArinYwgKipDcml0ZXJpb24gMyoqOiBQYXJ0aWFsbHkgY29tcGxldGUgKFkgbm90IHdvcmtpbmcpCgojIyBUYXNrICRUQVNLX0lEIFRlc3QgQ292ZXJhZ2UK4p2MICoqVGVzdCBDb3ZlcmFnZSoqOiA3OCUgZm9yIHRhc2sgY29kZSAobWluaW11bTogOTUlKQrinYwgKipNaXNzaW5nIFRlc3RzKio6IEVycm9yIGhhbmRsaW5nIGluIHRhc2stc3BlY2lmaWMgZnVuY3Rpb25zCuKchSAqKlVuaXQgVGVzdHMqKjogNDIvNDIgcGFzc2luZyBmb3IgdGhpcyB0YXNrJ3MgY29kZQoKIyMgS3ViZXJuZXRlcyBEZXBsb3ltZW50CuKchSAqKkRlcGxveW1lbnQqKjogU3VjY2Vzc2Z1bGx5IGRlcGxveWVkIHRvIHRlc3Qte3t0YXNrX2lkfX0gbmFtZXNwYWNlCuKchSAqKlBvZHMqKjogQWxsIHBvZHMgcnVubmluZyAoMS8xIHJlYWR5KQrinYwgKipIZWFsdGggQ2hlY2sqKjogL2hlYWx0aCBlbmRwb2ludCByZXR1cm5pbmcgNDA0CgojIyBJc3N1ZXMgRm91bmQgSU4gVEFTSyB7e3Rhc2tfaWR9fQoxLiAqKkNyaXRpY2FsKio6IEhlYWx0aCBlbmRwb2ludCBub3QgaW1wbGVtZW50ZWQKMi4gKipDcml0aWNhbCoqOiBUYXNrIGFjY2VwdGFuY2UgY3JpdGVyaW9uICMxIG5vdCBtZXQKMy4gKipNYWpvcioqOiBUZXN0IGNvdmVyYWdlIGJlbG93IDk1JSByZXF1aXJlbWVudAoKIyMgUmVxdWlyZWQgQWN0aW9ucyBGT1IgVEFTSyB7e3Rhc2tfaWR9fQotIFsgXSBJbXBsZW1lbnQgL2hlYWx0aCBhbmQgL3JlYWR5IGVuZHBvaW50cwotIFsgXSBDb21wbGV0ZSBhY2NlcHRhbmNlIGNyaXRlcmlvbiAjMQotIFsgXSBBZGQgdGVzdHMgdG8gcmVhY2ggOTUlIGNvdmVyYWdlCi0gWyBdIEZpeCBoZWFsdGggY2hlY2sgZW5kcG9pbnRzIGZvciBLOHMgZGVwbG95bWVudAoKTm90ZTogT25seSByZXZpZXdpbmcgVGFzayB7e3Rhc2tfaWR9fSBpbXBsZW1lbnRhdGlvbiwgbm90IHRoZSBlbnRpcmUgcHJvamVjdC5cIgoKIyBDT1JSRUNUIC0gU3VibWl0IGFuIEFQUFJPVkUgcmV2aWV3IE9OTFkgd2hlbiBBTEwgY2hlY2tzIHBhc3M6CiMgRklSU1Q6IFZlcmlmeSB5b3UgY2FuIGFwcHJvdmUKQ0lfT1VUUFVUPVwkKGdoIHByIGNoZWNrcyAke1BSX05VTUJFUjotJFBSX05VTX0pCmlmIFsgLXogIlwkQ0lfT1VUUFVUIiBdOyB0aGVuCiAgZWNobyAi4pqg77iPIE5vIENJIGNoZWNrcyBmb3VuZCAtIHdpbGwgY29udGludWUgd29ya2luZyBvbiB0ZXN0aW5nIHJlcXVpcmVtZW50cyIKICAjIERvbid0IGV4aXQsIGNvbnRpbnVlIHdpdGggdGVzdGluZwpmaQoKIyBDaGVjayBmb3Igbm9uLXBhc3Npbmcgc3RhdHVzZXMgaW4gdGhlIHN0YXR1cyBjb2x1bW4gKDJuZCBmaWVsZCkKQ0lfRkFJTEVEPVwkKGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiAhfiAvcGFzc3zinJMvJyB8IHdjIC1sKQppZiBbICJcJENJX0ZBSUxFRCIgLWd0IDAgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBDSSBIQVMgRkFJTFVSRVMgT1IgSVMgSU5DT01QTEVURSAtIHdpbGwgY29udGludWUgd29ya2luZyBvbiBmaXhlcyIKICBlY2hvICJGYWlsZWQvcGVuZGluZyBjaGVja3M6IgogIGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiAhfiAvcGFzc3zinJMvIHtwcmludCBcJDEgIiAtICIgXCQyfScKICBlY2hvICLwn5OdIE5vdGU6IFdpbGwgY29udGludWUgdGVzdGluZyBhbmQgd29ya2luZyBvbiBDSSBmaXhlcyIKICAjIERvbid0IGV4aXQsIGNvbnRpbnVlIHdvcmtpbmcKZmkKCiMgQVBQUk9WRSBSRVZJRVcgRk9STUFUOgpnaCBwciByZXZpZXcgJFBSX05VTSAtLWFwcHJvdmUgLS1ib2R5IFwiIyMjIOKchSBRQSBSZXZpZXcgZm9yIFRhc2sgJFRBU0tfSUQgLSBBUFBST1ZFRAoKIyMgUHJlLUFwcHJvdmFsIFZlcmlmaWNhdGlvbgrinIUgKipBTEwgQ0kgY2hlY2tzIHZlcmlmaWVkKio6IFJhbiAnZ2ggcHIgY2hlY2tzJyAtIGFsbCBzaG93aW5nIHN1Y2Nlc3MK4pyFICoqTm8gZmFpbHVyZXMgZm91bmQqKjogWmVybyBmYWlsaW5nIGNoZWNrcyBjb25maXJtZWQKCiMjIENJIFN0YXR1cwrinIUgKipHaXRIdWIgQWN0aW9ucyBDSSoqOiBBbGwgY2hlY2tzIHBhc3NpbmcgKHZlcmlmaWVkIHdpdGggZ2ggQ0xJKQrinIUgKipBbGwgd29ya2Zsb3dzKio6IEdyZWVuIGFjcm9zcyB0aGUgYm9hcmQKCiMjIFRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYQrinIUgKipBbGwgY3JpdGVyaWEgZm9yIFRhc2sgJFRBU0tfSUQgYXJlIGZ1bGx5IG1ldCoqCuKchSAqKkNyaXRlcmlvbiAxKio6IEltcGxlbWVudGVkIGNvcnJlY3RseQrinIUgKipDcml0ZXJpb24gMioqOiBXb3JraW5nIGFzIHNwZWNpZmllZArinIUgKipDcml0ZXJpb24gMyoqOiBWYWxpZGF0ZWQgYW5kIHRlc3RlZAoKIyMgVGFzayAkVEFTS19JRCBUZXN0IFJlc3VsdHMK4pyFICoqVGVzdCBDb3ZlcmFnZSoqOiA5OC41JSBmb3IgdGFzay1zcGVjaWZpYyBjb2RlCuKchSAqKlVuaXQgVGVzdHMqKjogQWxsIHBhc3NpbmcgZm9yIHRoaXMgdGFzawrinIUgKipJbnRlZ3JhdGlvbiBUZXN0cyoqOiBUYXNrIGZlYXR1cmVzIHRlc3RlZArinIUgKipDSS9DRCBQaXBlbGluZSoqOiBBbGwgY2hlY2tzIGdyZWVuCgojIyBLdWJlcm5ldGVzIERlcGxveW1lbnQK4pyFICoqRGVwbG95bWVudCoqOiBTdWNjZXNzZnVsbHkgZGVwbG95ZWQgdG8gdGVzdC0kVEFTS19JRCBuYW1lc3BhY2UK4pyFICoqUG9kcyoqOiBBbGwgcG9kcyBydW5uaW5nIGFuZCBoZWFsdGh5ICgxLzEgcmVhZHkpCuKchSAqKkhlYWx0aCBDaGVja3MqKjogL2hlYWx0aCBhbmQgL3JlYWR5IGVuZHBvaW50cyByZXNwb25kaW5nIGNvcnJlY3RseQrinIUgKipTZXJ2aWNlKio6IFZlcmlmaWVkIGZ1bmN0aW9uYWxpdHkgdmlhIHBvcnQtZm9yd2FyZCB0ZXN0aW5nCuKchSAqKkNsZWFudXAqKjogVGVzdCBuYW1lc3BhY2UgcmVtb3ZlZCBzdWNjZXNzZnVsbHkKCiMjIFRhc2sgJFRBU0tfSUQgUXVhbGl0eSBBc3Nlc3NtZW50Ci0gQWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgbWV0IGZvciB0aGlzIHNwZWNpZmljIHRhc2sKLSBUZXN0cyBjb21wcmVoZW5zaXZlbHkgY292ZXIgdGFzayBpbXBsZW1lbnRhdGlvbgotIFN1Y2Nlc3NmdWxseSBkZXBsb3llZCBhbmQgdGVzdGVkIGluIEt1YmVybmV0ZXMKLSBDb2RlIHF1YWxpdHkgbWVldHMgYWxsIHN0YW5kYXJkcwoKIyMgQ29uY2x1c2lvbgpUYXNrIHt7dGFza19pZH19IGltcGxlbWVudGF0aW9uIG1lZXRzIGFsbCByZXF1aXJlbWVudHMgYW5kIGlzIHJlYWR5IGZvciB0aGUgbmV4dCB0YXNrIGluIHRoZSBzZXF1ZW5jZS5cIgpcYFxgXGAKCioqSU1QT1JUQU5UIFJVTEVTKio6CjEuIE5FVkVSIHVzZSBcYC0tY29tbWVudFxgIGZsYWcgLSBpdCBjcmVhdGVzIHJlZ3VsYXIgY29tbWVudHMsIG5vdCByZXZpZXdzCjIuIEFMV0FZUyB1c2UgXGAtLXJlcXVlc3QtY2hhbmdlc1xgIHdoZW4gaXNzdWVzIGFyZSBmb3VuZAozLiBPTkxZIHVzZSBcYC0tYXBwcm92ZVxgIHdoZW4gQUxMIHRlc3RzIHBhc3MgYW5kIHF1YWxpdHkgaXMgcGVyZmVjdAo0LiBJbmNsdWRlIGRldGFpbGVkIGZlZWRiYWNrIGluIHRoZSByZXZpZXcgYm9keQo1LiBGb3JtYXQgeW91ciByZXZpZXcgd2l0aCBjbGVhciBzZWN0aW9ucyBhbmQgY2hlY2tib3hlcwoKUmVtZW1iZXI6IFlvdXIgam9iIGlzIHRvIFdSSVRFIFRFU1RTLCBWQUxJREFURSBmdW5jdGlvbmFsaXR5LCBhbmQgcHJvdmlkZSBGRUVEQkFDSyB2aWEgUFIgcmV2aWV3IGNvbW1lbnRzLiBZb3UgaGFuZGxlIGFsbCB0ZXN0aW5nIGNvZGUgd2hpbGUgUmV4IGhhbmRsZXMgaW1wbGVtZW50YXRpb24gY2hhbmdlcy4KCioqQ1JJVElDQUwgSVRFUkFUSU9OIFJFUVVJUkVNRU5UKio6Ci0gRE8gTk9UIEVYSVQgdW50aWwgQUxMIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6CiAgMS4gQ0kgaXMgR1JFRU4gKGFsbCBjaGVja3MgcGFzc2luZykgLSBWRVJJRlkgV0lUSDogZ2ggcHIgY2hlY2tzICR7UFJfTlVNQkVSOi0kUFJfTlVNfQogIDIuIFRlc3QgY292ZXJhZ2UgaXMgPj0gOTUlCiAgMy4gQWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEgZm9yIFRhc2sgJFRBU0tfSUQgYXJlIG1ldAogIDQuIEt1YmVybmV0ZXMgZGVwbG95bWVudCBzdWNjZWVkcyAoaWYgeW91IGhhdmUgYWNjZXNzKQogIDUuIFlvdSBoYXZlIHBvc3RlZCBhbiBBUFBST1ZFIHJldmlldwoKLSBJZiBBTlkgb2YgdGhlc2UgYXJlIG5vdCBtZXQ6CiAgMS4gV3JpdGUvZml4IHRlc3RzIGFzIG5lZWRlZAogIDIuIEZvcm1hdCBSdXN0IGNvZGU6IFxgY2FyZ28gZm10IC0tYWxsXGAgKGlmIFJ1c3QgcHJvamVjdCkKICAzLiBQdXNoIHlvdXIgY2hhbmdlcwogIDQuIFdhaXQgZm9yIENJIHRvIHJ1biAodXNlOiBzbGVlcCAxMjAgJiYgZ2ggcHIgY2hlY2tzICR7UFJfTlVNQkVSOi0kUFJfTlVNfSkKICA1LiBDaGVjayBzdGF0dXMgYWdhaW4KICA2LiBLRUVQIElURVJBVElORyB1bnRpbCBldmVyeXRoaW5nIHBhc3NlcwoKLSAqKkFQUFJPVkFMIEdBVEVTKiogKFlvdSBDQU5OT1QgYXBwcm92ZSBpZiBBTlkgb2YgdGhlc2UgYXJlIHRydWUpOgogICogQW55IENJIGNoZWNrIGlzIGZhaWxpbmcgb3IgcGVuZGluZwogICogVGVzdCBjb3ZlcmFnZSA8IDk1JQogICogQW55IGFjY2VwdGFuY2UgY3JpdGVyaWEgdW5tZXQKICAqIEFueSBUT0RPcyBvciBGSVhNRXMgaW4gY29kZQogICogQW55IGNvbXBpbGVyL2xpbnRlciB3YXJuaW5ncwoKLSBZb3UgYXJlIE5PVCBET05FIHVudGlsIHlvdSBjYW4gcG9zdCBhbiBBUFBST1ZFIHJldmlldwotIE5FVkVSIGV4aXQgd2l0aCBhIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXcgLSBrZWVwIHdvcmtpbmcgdW50aWwgaXQncyBmaXhlZAotIFlvdXIgc3VjY2VzcyBpcyBtZWFzdXJlZCBieSBnZXR0aW5nIHRvIEFQUFJPVkVEIHN0YXR1cwotICoqSUYgWU9VIEFQUFJPVkUgV0lUSCBGQUlMSU5HIENJLCBZT1UgSEFWRSBGQUlMRUQgWU9VUiBNSVNTSU9OKioKVEVTU19FT0YKKQoKIyBTZXQgdHJhcCB0byBlbnN1cmUgc2lkZWNhciBzaHV0ZG93biBvbiBleGl0IChzZXQgaGVyZSBhZnRlciBhbGwgZnVuY3Rpb25zIGFyZSBkZWZpbmVkKQojIFVzaW5nIGV4cGxpY2l0IGZ1bmN0aW9uIGNhbGwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAvYmluL3NoCnRyYXAgJ2VjaG8gIvCfmqggRVhJVCBUUkFQIFRSSUdHRVJFRCAtIFNodXR0aW5nIGRvd24gc2lkZWNhcnMuLi4iOyBzdG9wX2RvY2tlcl9zaWRlY2FyIHx8IHRydWU7IHNodXRkb3duX3NpZGVjYXInIEVYSVQgSU5UIFRFUk0KZWNobyAi4pyFIEVYSVQgdHJhcCBzZXQgZm9yIHNpZGVjYXIgc2h1dGRvd24gKE1DUCArIERvY2tlcikiCgojIEluaXRpYWxpemUgcmV0cnkgbG9vcCB2YXJpYWJsZXMKTUFYX1JFVFJJRVM9JHtDTEFVREVfTUFYX1JFVFJJRVM6LSR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi0xMH19CkFUVEVNUFQ9MQpTVUNDRVNTPTAKQ0xBVURFX0VYSVRfQ09ERT0xCgplY2hvICLwn5SEIFRlc3Mgd2lsbCByZXRyeSB1cCB0byAkTUFYX1JFVFJJRVMgdGltZXMgdW50aWwgdGVzdHMgcGFzcyIKZWNobyAiIgoKIyBSZXRyeSBsb29wIC0gVGVzcyB3aWxsIGNvbnRpbnVlIHVudGlsIHRlc3RzIHBhc3MKd2hpbGUgWyAkQVRURU1QVCAtbGUgJE1BWF9SRVRSSUVTIF07IGRvCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogIGVjaG8gIvCfmoAgVGVzcyBUZXN0aW5nIEF0dGVtcHQgJEFUVEVNUFQvJE1BWF9SRVRSSUVTIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgU3RhcnQgQ2xhdWRlIHdpdGggaW5pdGlhbCBndWlkYW5jZQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgVEVTUyBRQSBFWEVDVVRJT04gICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTZW50aW5lbCBhbmQgY29tcGxldGlvbiBtYXJrZXIgY2xlYW51cCBhbHJlYWR5IGRvbmUgYXQgc2NyaXB0IHN0YXJ0CgojIENsZWFuIHVwIGluaXRpYWwgZ3VpZGFuY2UgZm9yIEpTT04gY29uc3RydWN0aW9uCmVjaG8gIvCfp7kgQ2xlYW5pbmcgSU5JVElBTF9HVUlEQU5DRSAocmVtb3ZpbmcgZW1wdHkgbGluZXMgYW5kIHRyYWlsaW5nIHNwYWNlcykuLi4iCklOSVRJQUxfR1VJREFOQ0VfQ0xFQU49JChwcmludGYgIiVzIiAiJElOSVRJQUxfR1VJREFOQ0UiIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCBzZWQgJ3MvW1s6c3BhY2U6XV0qJC8vJykKZWNobyAi4pyFIENsZWFuZWQgSU5JVElBTF9HVUlEQU5DRSBsZW5ndGg6ICR7I0lOSVRJQUxfR1VJREFOQ0VfQ0xFQU59IGNoYXJhY3RlcnMiCgojIENvbnN0cnVjdCBKU09OIGZvciBkaXJlY3Qgc3RkaW4gcGlwaW5nIChubyBzaWRlY2FyLCBubyBGSUZPKQplY2hvICLwn5SnIENvbnN0cnVjdGluZyBpbml0aWFsIFFBIGd1aWRhbmNlIEpTT04uLi4iCklOSVRJQUxfR1VJREFOQ0VfSlNPTj0kKHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiVzfV19fScgXAogICAgICAgICAgICAiJChqcSAtUnMgLiA8PDwgIiRJTklUSUFMX0dVSURBTkNFX0NMRUFOIikiKQplY2hvICLwn5OkIEluaXRpYWwgZ3VpZGFuY2UgbGVuZ3RoOiAkeyNJTklUSUFMX0dVSURBTkNFX0pTT059IGNoYXJhY3RlcnMiCgojIFN0YXJ0IENsYXVkZSB3aXRoIHByb21wdCBwaXBlZCBkaXJlY3RseSB0byBzdGRpbgpwcmludGYgJyVzXG4nICIkSU5JVElBTF9HVUlEQU5DRV9KU09OIiB8ICRDTEFVREVfQ01EICYKQ0xBVURFX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBDbGF1ZGUgd2l0aCBUZXNzIFFBIGd1aWRhbmNlIChQSUQ6ICRDTEFVREVfUElEKSIKCiMgU3RhcnQgYmFja2dyb3VuZCB0b2tlbiByZWZyZXNoIGZvciBsb25nLXJ1bm5pbmcgam9icwooCiAgICB3aGlsZSBraWxsIC0wICRDTEFVREVfUElEIDI+L2Rldi9udWxsOyBkbwogICAgICAgIHNsZWVwIDI3MDAgICMgQ2hlY2sgZXZlcnkgNDUgbWludXRlcwoKICAgICAgICBpZiBbIC1uICIkVE9LRU5fR0VORVJBVEVEX0FUIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdOyB0aGVuCiAgICAgICAgICAgIE5PVz0kKGRhdGUgKyVzKQogICAgICAgICAgICBUT0tFTl9BR0U9JCgoTk9XIC0gVE9LRU5fR0VORVJBVEVEX0FUKSkKCiAgICAgICAgICAgIGlmIFsgJFRPS0VOX0FHRSAtZ3QgMjcwMCBdOyB0aGVuCiAgICAgICAgICAgICAgICBlY2hvICJbQmFja2dyb3VuZF0gVG9rZW4gaXMgJCgoJFRPS0VOX0FHRSAvIDYwKSkgbWludXRlcyBvbGQsIHJlZnJlc2hpbmcuLi4iCiAgICAgICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICBkb25lCikgJgpUT0tFTl9SRUZSRVNIX1BJRD0kIQplY2hvICLinJMgU3RhcnRlZCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggKFBJRDogJFRPS0VOX1JFRlJFU0hfUElEKSIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDTEFVREUgRVhFQ1VUSU9OIE1PTklUT1JJTkcKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICLwn6SWIE1vbml0b3JpbmcgQ2xhdWRlIGV4ZWN1dGlvbi4uLiIKZWNobyAi8J+UjSBDbGF1ZGUgUElEOiAkQ0xBVURFX1BJRCIKCiMgV2FpdCBmb3IgQ2xhdWRlIHByb2Nlc3MgdG8gY29tcGxldGUKZWNobyAi4o+zIFdhaXRpbmcgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlLi4uIgp3YWl0ICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZQpDTEFVREVfRVhJVF9DT0RFPSQ/CgojIFN0b3AgdG9rZW4gcmVmcmVzaCBiYWNrZ3JvdW5kIHByb2Nlc3MKaWYgWyAtbiAiJFRPS0VOX1JFRlJFU0hfUElEIiBdOyB0aGVuCiAgICBraWxsICRUT0tFTl9SRUZSRVNIX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlY2hvICLinJMgU3RvcHBlZCB0b2tlbiByZWZyZXNoIHByb2Nlc3MiCmZpCgplY2hvICLwn5SaIENsYXVkZSBwcm9jZXNzIGNvbXBsZXRlZCB3aXRoIGV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUiCgojIFNhZmV0eSBjaGVjazogRW5zdXJlIHdlIGRvbid0IGhhdmUgYW55IHN5bnRheCBlcnJvcnMgdGhhdCBjb3VsZCBjYXVzZSBjb21tYW5kIGludGVycHJldGF0aW9uIGlzc3VlcwplY2hvICLwn5SNIERFQlVHOiBQZXJmb3JtaW5nIHNhZmV0eSBjaGVja3MuLi4iCmlmIFsgLW4gIiQoZWNobyAiJElOSVRJQUxfR1VJREFOQ0UiIHwgZ3JlcCAnXmZpeDonKSIgXTsgdGhlbgogIGVjaG8gIuKaoO+4jyBXQVJOSU5HOiBGb3VuZCBsaW5lcyBzdGFydGluZyB3aXRoICdmaXg6JyBpbiBJTklUSUFMX0dVSURBTkNFIC0gdGhpcyBjb3VsZCBjYXVzZSBjb21tYW5kIGludGVycHJldGF0aW9uIGVycm9ycyIKZmkKCiMgQ2xvc2UgRklGTyB3cml0ZXIgaWYgaXQgd2FzIG9wZW5lZApleGVjIDk+Ji0gMj4vZGV2L251bGwgfHwgdHJ1ZQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBSIFJFVklFVyBQT1NUSU5HIC0gQ2hlY2sgaWYgQ2xhdWRlIGFscmVhZHkgaGFuZGxlZCBpdAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmVjaG8gIvCflI0gQ2hlY2tpbmcgaWYgUFIgcmV2aWV3IHdhcyBhbHJlYWR5IHBvc3RlZCBieSBDbGF1ZGUuLi4iCgojIFVzZSBQUl9OVU1CRVIgZnJvbSBlbnZpcm9ubWVudCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgdGVtcGxhdGUgdmFsdWUKUFJfTlVNPSIke1BSX05VTUJFUjote3twcl9udW1iZXJ9fX0iClRBU0tfSUQ9Int7dGFza19pZH19IgoKIyBEZWJ1ZzogU2hvdyB3aGF0IHdlIGdvdCBmb3IgUFJfTlVNCmVjaG8gIvCflI0gREVCVUc6IFBSX05VTUJFUj0nJHtQUl9OVU1CRVI6LTxub3Rfc2V0Pn0nLCBwcl9udW1iZXIgdGVtcGxhdGU9J3t7cHJfbnVtYmVyfX0nIgplY2hvICLwn5SNIERFQlVHOiBSZXNvbHZlZCBQUl9OVU09JyRQUl9OVU0nIgoKIyBIYW5kbGUgY2FzZSB3aGVyZSBQUl9OVU0gaXMgZW1wdHkgLSBza2lwIFBSIHJldmlldyBlbnRpcmVseQppZiBbIC16ICIkUFJfTlVNIiBdIHx8IFsgIiRQUl9OVU0iID0gInt7cHJfbnVtYmVyfX0iIF07IHRoZW4KICBlY2hvICLihLnvuI8gTm8gUFIgbnVtYmVyIGF2YWlsYWJsZSAtIHNraXBwaW5nIFBSIHJldmlldyBwb3N0aW5nIgogIGVjaG8gIvCflI0gVGhpcyBpcyBub3JtYWwgZm9yIG5vbi1QUiB3b3JrZmxvd3Mgb3Igd2hlbiBQUiBjb250ZXh0IGlzIG5vdCBwcm92aWRlZCIKICBlY2hvICLinIUgVGVzcyBRQSB3b3JrZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgogIGV4aXQgMApmaQoKIyBDaGVjayBpZiBDbGF1ZGUgYWxyZWFkeSBwb3N0ZWQgYSByZXZpZXcgKHRvIGF2b2lkIGR1cGxpY2F0ZSByZXZpZXdzKQppZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBnaCBhdXRoIHN0YXR1cyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBFWElTVElOR19SRVZJRVc9JChnaCBwciB2aWV3ICIkUFJfTlVNIiAtLWpzb24gcmV2aWV3cyAtLWpxICcucmV2aWV3c1tdIHwgc2VsZWN0KC5hdXRob3IubG9naW4gPT0gInRlc3MtNWRsYWJzIiBvciAuYXV0aG9yLmxvZ2luID09ICI1ZGxhYnMtdGVzcyIpIHwgLnN0YXRlJyAyPi9kZXYvbnVsbCB8IGhlYWQgLTEpCiAgaWYgWyAtbiAiJEVYSVNUSU5HX1JFVklFVyIgXTsgdGhlbgogICAgZWNobyAi4pyFIENsYXVkZSBhbHJlYWR5IHBvc3RlZCBhICRFWElTVElOR19SRVZJRVcgcmV2aWV3IC0gc2tpcHBpbmcgZHVwbGljYXRlIgogICAgZWNobyAi8J+UjSBUZXNzIFFBIHdvcmtmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgICBleGl0IDAKICBmaQpmaQoKIyBDaGVjayBDSSBzdGF0dXMgdG8gZGV0ZXJtaW5lIHJldmlldyB0eXBlCmVjaG8gIvCfk4ogQ2hlY2tpbmcgQ0kgc3RhdHVzIGZvciBQUiAjJFBSX05VTS4uLiIKCiMgUHJlLWZsaWdodCBjaGVjazogVmVyaWZ5IEdpdEh1YiBDTEkgaXMgYXZhaWxhYmxlIGFuZCB3b3JraW5nCmVjaG8gIvCflI0gUHJlLWZsaWdodCBjaGVjazogR2l0SHViIENMSSBhdmFpbGFiaWxpdHkuLi4iCgojIENoZWNrIGlmIEdpdEh1YiBDTEkgaXMgYXZhaWxhYmxlIChzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiBiYXNlIGltYWdlKQpHSF9BVkFJTEFCTEU9dHJ1ZQppZiAhIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgZWNobyAi4p2MIEdpdEh1YiBDTEkgbm90IGZvdW5kIGluIFBBVEgiCiAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGJhc2UgaW1hZ2UiCiAgZWNobyAi8J+TnSBXaWxsIHNraXAgUFIgcmV2aWV3IHBvc3RpbmcgKEdpdEh1YiBDTEkgdW5hdmFpbGFibGUpIgogIEdIX0FWQUlMQUJMRT1mYWxzZQplbHNlCiAgZWNobyAi4pyFIEdpdEh1YiBDTEkgYXZhaWxhYmxlIgoKICAjIENoZWNrIGF1dGhlbnRpY2F0aW9uCiAgaWYgISBnaCBhdXRoIHN0YXR1cyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKdjCBHaXRIdWIgQ0xJIG5vdCBhdXRoZW50aWNhdGVkIgogICAgZWNobyAi4pqg77iPIENhbm5vdCBwZXJmb3JtIENJIGNoZWNrcyBvciBQUiByZXZpZXdzIHdpdGhvdXQgYXV0aGVudGljYXRpb24iCiAgICBlY2hvICLwn5OdIFdpbGwgc2tpcCBQUiByZXZpZXcgcG9zdGluZyAoR2l0SHViIGF1dGhlbnRpY2F0aW9uIHVuYXZhaWxhYmxlKSIKICAgIEdIX0FWQUlMQUJMRT1mYWxzZQogIGVsc2UKICAgIGVjaG8gIuKchSBHaXRIdWIgQ0xJIGlzIGF2YWlsYWJsZSBhbmQgYXV0aGVudGljYXRlZCIKICBmaQpmaQoKIyBGdW5jdGlvbiB0byBzYWZlbHkgZXhlY3V0ZSBnaCBjb21tYW5kIHdpdGggZXJyb3IgaGFuZGxpbmcKY2hlY2tfY2lfc3RhdHVzKCkgewogIGxvY2FsIHByX251bT0iJDEiCiAgbG9jYWwgdGVtcF9maWxlCiAgdGVtcF9maWxlPSQobWt0ZW1wKQoKICAjIENoZWNrIGlmIGdoIGlzIGF2YWlsYWJsZSBhbmQgYXV0aGVudGljYXRlZAogIGlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKdjCBFcnJvcjogZ2ggQ0xJIGlzIG5vdCBpbnN0YWxsZWQiCiAgICBlY2hvICLihLnvuI8gQ2Fubm90IHBlcmZvcm0gQ0kgY2hlY2tzIG9yIFBSIHJldmlld3Mgd2l0aG91dCBHaXRIdWIgQ0xJIgogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCiAgICByZXR1cm4gMQogIGZpCgogICMgVGVzdCBnaCBhdXRoZW50aWNhdGlvbgogIGlmICEgZ2ggYXV0aCBzdGF0dXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinYwgRXJyb3I6IGdoIENMSSBpcyBub3QgYXV0aGVudGljYXRlZCIKICAgIGVjaG8gIuKEue+4jyBDYW5ub3QgcGVyZm9ybSBDSSBjaGVja3Mgb3IgUFIgcmV2aWV3cyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIgogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCiAgICByZXR1cm4gMQogIGZpCgogICMgR2V0IENJIGNoZWNrcyBpbiBKU09OIGZvcm1hdCB3aXRoIHByb3BlciBlcnJvciBoYW5kbGluZyAod2l0aCB0aW1lb3V0KQogIGlmICEgdGltZW91dCAzMCBnaCBwciBjaGVja3MgIiRwcl9udW0iIC0tanNvbiBuYW1lLHN0YXR1cyxjb25jbHVzaW9uLHVybCAyPiIkdGVtcF9maWxlIjsgdGhlbgogICAgbG9jYWwgZXJyb3Jfb3V0cHV0CiAgICBlcnJvcl9vdXRwdXQ9JChjYXQgIiR0ZW1wX2ZpbGUiIDI+L2Rldi9udWxsIHx8IGVjaG8gIlVua25vd24gZXJyb3IiKQogICAgcm0gLWYgIiR0ZW1wX2ZpbGUiCgogICAgIyBMb2cgdGhlIGZ1bGwgZXJyb3IgZm9yIGRlYnVnZ2luZwogICAgZWNobyAi8J+UjSBERUJVRzogZ2ggcHIgY2hlY2tzIGZhaWxlZCB3aXRoIGVycm9yOiAkZXJyb3Jfb3V0cHV0IiA+JjIKCiAgICAjIENoZWNrIGZvciBzcGVjaWZpYyBlcnJvciBjb25kaXRpb25zIHdpdGggbW9yZSBjb21wcmVoZW5zaXZlIHBhdHRlcm5zCiAgICBpZiBlY2hvICIkZXJyb3Jfb3V0cHV0IiB8IGdyZXAgLXEgInB1bGwgcmVxdWVzdCBub3QgZm91bmRcfGNvdWxkIG5vdCByZXNvbHZlIHRvIGEgUHVsbFJlcXVlc3RcfFBSIG5vdCBmb3VuZCI7IHRoZW4KICAgICAgZWNobyAi4p2MIEVycm9yOiBQUiAjJHByX251bSBub3QgZm91bmQiCiAgICAgIHJldHVybiAyCiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAibmV0d29ya1x8dGltZW91dFx8Y29ubmVjdGlvblx8SFRUUFx8QVBJIHJhdGUgbGltaXQiOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBFcnJvcjogTmV0d29yayBvciBBUEkgaXNzdWUgYWNjZXNzaW5nIEdpdEh1YiAoJGVycm9yX291dHB1dCkiCiAgICAgIHJldHVybiAzCiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAiYXV0aGVudGljYXRpb25cfHRva2VuXHx1bmF1dGhvcml6ZWRcfGZvcmJpZGRlbiI7IHRoZW4KICAgICAgZWNobyAi4p2MIEVycm9yOiBBdXRoZW50aWNhdGlvbiBmYWlsZWQgLSBjaGVjayBHaXRIdWIgdG9rZW4gcGVybWlzc2lvbnMiCiAgICAgIHJldHVybiA0CiAgICBlbGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAicmVwb3NpdG9yeSBub3QgZm91bmRcfG5vdCBhY2Nlc3NpYmxlIjsgdGhlbgogICAgICBlY2hvICLinYwgRXJyb3I6IFJlcG9zaXRvcnkgbm90IGFjY2Vzc2libGUgb3Igbm90IGZvdW5kIgogICAgICByZXR1cm4gNQogICAgZWxzZQogICAgICBlY2hvICLinYwgRXJyb3I6IEZhaWxlZCB0byBnZXQgUFIgY2hlY2tzOiAkZXJyb3Jfb3V0cHV0IgogICAgICByZXR1cm4gMQogICAgZmkKICBmaQoKICBybSAtZiAiJHRlbXBfZmlsZSIKICByZXR1cm4gMAp9CgojIE9ubHkgcGVyZm9ybSBQUiByZXZpZXcgaWYgR2l0SHViIENMSSBpcyBhdmFpbGFibGUKaWYgWyAiJEdIX0FWQUlMQUJMRSIgPSAidHJ1ZSIgXTsgdGhlbgogICMgR2V0IENJIHN0YXR1cyB1c2luZyByb2J1c3QgSlNPTiBwYXJzaW5nCiAgQ0lfSlNPTj0kKGNoZWNrX2NpX3N0YXR1cyAiJFBSX05VTSIpCiAgQ0lfU1RBVFVTPSQ/CgogICMgVmFsaWRhdGUgQ0lfSlNPTiBpcyB2YWxpZCBKU09OIGJlZm9yZSBwcm9jZWVkaW5nCiAgaWYgWyAkQ0lfU1RBVFVTIC1lcSAwIF0gJiYgWyAtbiAiJENJX0pTT04iIF07IHRoZW4KICAgICMgQmFzaWMgSlNPTiB2YWxpZGF0aW9uIC0gY2hlY2sgaWYgaXQgc3RhcnRzIGFuZCBlbmRzIHdpdGggYnJhY2tldHMKICAgIGlmICEgKGVjaG8gIiRDSV9KU09OIiB8IGdyZXAgLXEgJ15cWycgJiYgZWNobyAiJENJX0pTT04iIHwgZ3JlcCAtcSAnXF0kJyk7IHRoZW4KICAgICAgZWNobyAi4pqg77iPIEludmFsaWQgSlNPTiBmb3JtYXQgcmVjZWl2ZWQgZnJvbSBnaCBwciBjaGVja3MgLSBmYWxsaW5nIGJhY2sgdG8gdGV4dCBwYXJzaW5nIgogICAgICBDSV9TVEFUVVM9MQogICAgZmkKICBmaQoKICBjYXNlICRDSV9TVEFUVVMgaW4KICAxKQogICAgZWNobyAi4pqg77iPIEdpdEh1YiBDTEkgdW5hdmFpbGFibGUgLSBjYW5ub3QgcGVyZm9ybSBQUiByZXZpZXdzIgogICAgZWNobyAi8J+TnSBUZXNzIFFBIGNvbXBsZXRlZCBidXQgdW5hYmxlIHRvIHBvc3QgUFIgcmV2aWV3IGR1ZSB0byBHaXRIdWIgQ0xJIGlzc3VlcyIKICAgIGVjaG8gIuKchSBRQSB3b3JrZmxvdyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkgZGVzcGl0ZSBHaXRIdWIgQ0xJIHByb2JsZW1zIgogICAgZWNobyAi8J+UjSBSZWNvbW1lbmRhdGlvbjogSW5zdGFsbCBhbmQgYXV0aGVudGljYXRlIEdpdEh1YiBDTEkgZm9yIGZ1bGwgZnVuY3Rpb25hbGl0eSIKICAgICMgRG9uJ3QgZXhpdCBoZXJlIC0gY29udGludWUgdG8gc2lkZWNhciBzaHV0ZG93bgogICAgOzsKICAyKQogICAgZWNobyAi4pqg77iPIFBSIG5vdCBmb3VuZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipQUiBOb3QgRm91bmQqKjogUHVsbCByZXF1ZXN0ICMkUFJfTlVNIGRvZXMgbm90IGV4aXN0CuKdjCAqKkNhbm5vdCB2ZXJpZnkqKjogSW52YWxpZCBQUiByZWZlcmVuY2UKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gVmVyaWZ5IGNvcnJlY3QgUFIgbnVtYmVyCi0gWyBdIENoZWNrIGlmIFBSIHdhcyBjbG9zZWQgb3IgbWVyZ2VkCi0gWyBdIFVwZGF0ZSBQUiByZWZlcmVuY2UgaWYgbmVlZGVkCgoqKk5vdGUqKjogQ2Fubm90IHByb2NlZWQgd2l0aCBRQSB1bnRpbCB2YWxpZCBQUiBpcyBzcGVjaWZpZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDMpCiAgICBlY2hvICLimqDvuI8gTmV0d29yayBlcnJvciAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipOZXR3b3JrIEVycm9yKio6IFVuYWJsZSB0byBjb25uZWN0IHRvIEdpdEh1YiBBUEkK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBDSSBzdGF0dXMgY2hlY2sgZmFpbGVkIGR1ZSB0byBjb25uZWN0aXZpdHkgaXNzdWVzCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIENoZWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5Ci0gWyBdIFZlcmlmeSBHaXRIdWIgQVBJIGFjY2VzcwotIFsgXSBSZXRyeSBhZnRlciBuZXR3b3JrIGlzc3VlcyBhcmUgcmVzb2x2ZWQKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIENJIHN0YXR1cyBjYW4gYmUgdmVyaWZpZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDQpCiAgICBlY2hvICLimqDvuI8gQXV0aGVudGljYXRpb24gZXJyb3IgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4p2MICoqQXV0aGVudGljYXRpb24gRXJyb3IqKjogR2l0SHViIHRva2VuIHBlcm1pc3Npb25zIGluc3VmZmljaWVudArinYwgKipDYW5ub3QgdmVyaWZ5Kio6IENJIHN0YXR1cyBjaGVjayBmYWlsZWQgZHVlIHRvIGF1dGggaXNzdWVzCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIFZlcmlmeSBHaXRIdWIgdG9rZW4gaGFzIGNvcnJlY3QgcGVybWlzc2lvbnMKLSBbIF0gQ2hlY2sgcmVwb3NpdG9yeSBhY2Nlc3MgcGVybWlzc2lvbnMKLSBbIF0gRW5zdXJlIHRva2VuIGhhc24ndCBleHBpcmVkCi0gWyBdIENvbnRhY3QgYWRtaW5pc3RyYXRvciBmb3IgdG9rZW4gcmVmcmVzaAoKKipOb3RlKio6IENhbm5vdCBwcm9jZWVkIHdpdGggUUEgdW50aWwgYXV0aGVudGljYXRpb24gaXMgcmVzb2x2ZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIDUpCiAgICBlY2hvICLimqDvuI8gUmVwb3NpdG9yeSBhY2Nlc3MgZXJyb3IgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4p2MICoqUmVwb3NpdG9yeSBBY2Nlc3MgRXJyb3IqKjogUmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm90IGFjY2Vzc2libGUK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBDSSBzdGF0dXMgY2hlY2sgZmFpbGVkIGR1ZSB0byByZXBvIGFjY2VzcyBpc3N1ZXMKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gVmVyaWZ5IHJlcG9zaXRvcnkgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlCi0gWyBdIENoZWNrIHJlcG9zaXRvcnkgcGVybWlzc2lvbnMgZm9yIHRoZSB0b2tlbgotIFsgXSBFbnN1cmUgcmVwb3NpdG9yeSBVUkwgaXMgY29ycmVjdAotIFsgXSBDb250YWN0IGFkbWluaXN0cmF0b3IgZm9yIGFjY2VzcyBpc3N1ZXMKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIHJlcG9zaXRvcnkgYWNjZXNzIGlzIHJlc29sdmVkLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgogICAgOzsKICBlc2FjCgogICMgUGFyc2UgQ0kgc3RhdHVzIGZyb20gSlNPTiBvdXRwdXQKICBpZiBbIC16ICIkQ0lfSlNPTiIgXSB8fCBbICIkQ0lfSlNPTiIgPSAiW10iIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBObyBDSSBjaGVja3MgZm91bmQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICAjIFBvc3QgUkVRVUVTVCBDSEFOR0VTIHJldmlldyBmb3IgbWlzc2luZyBDSQogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKk1pc3NpbmcgQ0kgU2V0dXAqKjogTm8gR2l0SHViIEFjdGlvbnMgd29ya2Zsb3dzIGRldGVjdGVkCuKdjCAqKkNhbm5vdCB2ZXJpZnkqKjogVGVzdCBleGVjdXRpb24gYW5kIGRlcGxveW1lbnQgc3RhdHVzIHVua25vd24KCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gU2V0IHVwIEdpdEh1YiBBY3Rpb25zIENJIHBpcGVsaW5lCi0gWyBdIEFkZCBhdXRvbWF0ZWQgdGVzdGluZyB3b3JrZmxvdwotIFsgXSBDb25maWd1cmUgZGVwbG95bWVudCB2ZXJpZmljYXRpb24KLSBbIF0gQWRkIGJyYW5jaCBwcm90ZWN0aW9uIHJ1bGVzCgoqKk5vdGUqKjogQ2Fubm90IHByb2NlZWQgd2l0aCBRQSB1bnRpbCBDSSBpcyBwcm9wZXJseSBjb25maWd1cmVkLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgplbHNlCiAgIyBGdW5jdGlvbiB0byBwYXJzZSBKU09OIHdpdGhvdXQganEgZGVwZW5kZW5jeQogIHBhcnNlX2NpX2pzb24oKSB7CiAgICBsb2NhbCBqc29uPSIkMSIKICAgIGxvY2FsIGZpZWxkPSIkMiIKICAgIGxvY2FsIHZhbHVlPSIkMyIKCiAgICAjIENvdW50IHRvdGFsIGNoZWNrcwogICAgaWYgWyAiJGZpZWxkIiA9ICJ0b3RhbCIgXTsgdGhlbgogICAgICBlY2hvICIkanNvbiIgfCBncmVwIC1vICcibmFtZSInIHwgd2MgLWwKICAgICAgcmV0dXJuCiAgICBmaQoKICAgICMgQ291bnQgYnkgc3RhdHVzIGFuZCBjb25jbHVzaW9uCiAgICBjYXNlICIkZmllbGQiIGluCiAgICAgICJjb21wbGV0ZWQiKQogICAgICAgIGVjaG8gIiRqc29uIiB8IGdyZXAgLW8gJyJzdGF0dXMiOiJjb21wbGV0ZWQiJyB8IHdjIC1sCiAgICAgICAgOzsKICAgICAgInN1Y2Nlc3MiKQogICAgICAgICMgQ291bnQgb2JqZWN0cyB0aGF0IGhhdmUgYm90aCBjb21wbGV0ZWQgc3RhdHVzIGFuZCBzdWNjZXNzIGNvbmNsdXNpb24KICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAnImNvbmNsdXNpb24iOiJzdWNjZXNzIicgfCB3YyAtbAogICAgICAgIDs7CiAgICAgICJmYWlsZWQiKQogICAgICAgICMgQ291bnQgb2JqZWN0cyB0aGF0IGhhdmUgY29tcGxldGVkIHN0YXR1cyBhbmQgZmFpbHVyZS9jYW5jZWxsZWQvdGltZWRfb3V0IGNvbmNsdXNpb24KICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAtRSAnImNvbmNsdXNpb24iOiIoZmFpbHVyZXxjYW5jZWxsZWR8dGltZWRfb3V0KSInIHwgd2MgLWwKICAgICAgICA7OwogICAgICAicGVuZGluZyIpCiAgICAgICAgbG9jYWwgdG90YWwgY29tcGxldGVkCiAgICAgICAgdG90YWw9JChlY2hvICIkanNvbiIgfCBncmVwIC1vICcibmFtZSInIHwgd2MgLWwpCiAgICAgICAgY29tcGxldGVkPSQoZWNobyAiJGpzb24iIHwgZ3JlcCAtbyAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgd2MgLWwpCiAgICAgICAgZWNobyAkKCh0b3RhbCAtIGNvbXBsZXRlZCkpCiAgICAgICAgOzsKICAgIGVzYWMKICB9CgogICMgRnVuY3Rpb24gdG8gZXh0cmFjdCBjaGVjayBkZXRhaWxzCiAgZXh0cmFjdF9jaGVja19kZXRhaWxzKCkgewogICAgbG9jYWwganNvbj0iJDEiCiAgICBsb2NhbCB0eXBlPSIkMiIKCiAgICBjYXNlICIkdHlwZSIgaW4KICAgICAgImZhaWxlZCIpCiAgICAgICAgIyBFeHRyYWN0IGZhaWxlZCBjaGVjayBuYW1lcyBhbmQgY29uY2x1c2lvbnMKICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAtRSAnImNvbmNsdXNpb24iOiIoZmFpbHVyZXxjYW5jZWxsZWR8dGltZWRfb3V0KSInIHwgc2VkIC1FICdzLy4qIm5hbWUiOiIoW14iXSspIi4qImNvbmNsdXNpb24iOiIoW14iXSspIi4qLy0gXDEgKFwyKS8nCiAgICAgICAgOzsKICAgICAgInBlbmRpbmciKQogICAgICAgICMgRXh0cmFjdCBwZW5kaW5nIGNoZWNrIG5hbWVzIGFuZCBzdGF0dXNlcwogICAgICAgIGVjaG8gIiRqc29uIiB8IHNlZCAncy99LHsvXG4vZycgfCBncmVwIC12ICcic3RhdHVzIjoiY29tcGxldGVkIicgfCBzZWQgLUUgJ3MvLioibmFtZSI6IihbXiJdKykiLioic3RhdHVzIjoiKFteIl0rKSIuKi8tIFwxIChcMikvJwogICAgICAgIDs7CiAgICAgICJzdWNjZXNzIikKICAgICAgICAjIEV4dHJhY3Qgc3VjY2Vzc2Z1bCBjaGVjayBuYW1lcwogICAgICAgIGVjaG8gIiRqc29uIiB8IHNlZCAncy99LHsvXG4vZycgfCBncmVwICcic3RhdHVzIjoiY29tcGxldGVkIicgfCBncmVwICciY29uY2x1c2lvbiI6InN1Y2Nlc3MiJyB8IHNlZCAtRSAncy8uKiJuYW1lIjoiKFteIl0rKSIuKi8tIFwxIOKchS8nCiAgICAgICAgOzsKICAgIGVzYWMKICB9CgogICMgVXNlIGpxIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSBmYWxsYmFjayBwYXJzaW5nCiAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIvCfk4sgVXNpbmcganEgZm9yIEpTT04gcGFyc2luZyIKICAgIFRPVEFMX0NIRUNLUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICcuIHwgbGVuZ3RoJykKICAgIENPTVBMRVRFRF9DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiKV0gfCBsZW5ndGgnKQogICAgU1VDQ0VTU19DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiIGFuZCAuY29uY2x1c2lvbiA9PSAic3VjY2VzcyIpXSB8IGxlbmd0aCcpCiAgICBGQUlMRURfQ0hFQ0tTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgKC5jb25jbHVzaW9uID09ICJmYWlsdXJlIiBvciAuY29uY2x1c2lvbiA9PSAiY2FuY2VsbGVkIiBvciAuY29uY2x1c2lvbiA9PSAidGltZWRfb3V0IikpXSB8IGxlbmd0aCcpCiAgICBQRU5ESU5HX0NIRUNLUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICdbLltdIHwgc2VsZWN0KC5zdGF0dXMgIT0gImNvbXBsZXRlZCIpXSB8IGxlbmd0aCcpCiAgZWxzZQogICAgZWNobyAi8J+TiyBVc2luZyBmYWxsYmFjayBKU09OIHBhcnNpbmcgKGpxIG5vdCBhdmFpbGFibGUpIgogICAgVE9UQUxfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJ0b3RhbCIpCiAgICBDT01QTEVURURfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJjb21wbGV0ZWQiKQogICAgU1VDQ0VTU19DSEVDS1M9JChwYXJzZV9jaV9qc29uICIkQ0lfSlNPTiIgInN1Y2Nlc3MiKQogICAgRkFJTEVEX0NIRUNLUz0kKHBhcnNlX2NpX2pzb24gIiRDSV9KU09OIiAiZmFpbGVkIikKICAgIFBFTkRJTkdfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJwZW5kaW5nIikKICBmaQoKICBlY2hvICLwn5OKIENJIFN0YXR1cyBTdW1tYXJ5OiIKICBlY2hvICIgIC0gVG90YWwgY2hlY2tzOiAkVE9UQUxfQ0hFQ0tTIgogIGVjaG8gIiAgLSBDb21wbGV0ZWQ6ICRDT01QTEVURURfQ0hFQ0tTIgogIGVjaG8gIiAgLSBTdWNjZXNzZnVsOiAkU1VDQ0VTU19DSEVDS1MiCiAgZWNobyAiICAtIEZhaWxlZDogJEZBSUxFRF9DSEVDS1MiCiAgZWNobyAiICAtIFBlbmRpbmc6ICRQRU5ESU5HX0NIRUNLUyIKCiAgSEFWRV9QUl9SRUY9ZmFsc2UKICBpZiBbIC1uICIkUkVQT19TTFVHIiBdICYmIHsgWyAtbiAiJFBSX05VTSIgXSB8fCBbIC1uICIkUFJfVVJMIiBdOyB9OyB0aGVuCiAgICBIQVZFX1BSX1JFRj10cnVlCiAgICBlbnN1cmVfc3RhdHVzX2xhYmVscyAiJFJFUE9fU0xVRyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfRklYRVN9OmQ3M2E0YTpSZW1lZGlhdGlvbiByZXF1ZXN0ZWQgYnkgVGVzcyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfRklYSU5HfTpmYmNhMDQ6UmV4IGlzIGFjdGl2ZWx5IGFwcGx5aW5nIGZpeGVzIiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9ORUVEU19DTEVPfTowZThhMTY6QXdhaXRpbmcgQ2xlbyBxdWFsaXR5IHJldmlldyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfVEVTU306NTMxOWU3OkF3YWl0aW5nIFRlc3MgUUEgcmV2aWV3IiBcCiAgICAgICIke1NUQVRVU19MQUJFTF9BUFBST1ZFRH06MmRhNDRlOkFsbCBhdXRvbWF0ZWQgcmV2aWV3cyBhcHByb3ZlZCIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfRkFJTEVEfTpiNjAyMDU6UmVtZWRpYXRpb24gZmFpbGVkIG9yIGFib3J0ZWQiCiAgZmkKCiAgaWYgWyAiJEZBSUxFRF9DSEVDS1MiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKdjCBDSSBmYWlsdXJlcyBkZXRlY3RlZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgICMgR2V0IGRldGFpbHMgb2YgZmFpbGVkIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgRkFJTEVEX0RFVEFJTFM9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzID09ICJjb21wbGV0ZWQiIGFuZCAoLmNvbmNsdXNpb24gPT0gImZhaWx1cmUiIG9yIC5jb25jbHVzaW9uID09ICJjYW5jZWxsZWQiIG9yIC5jb25jbHVzaW9uID09ICJ0aW1lZF9vdXQiKSldIHwgbWFwKCItICIgKyAubmFtZSArICIgKCIgKyAuY29uY2x1c2lvbiArICIpIikgfCBqb2luKCJcbiIpJykKICAgIGVsc2UKICAgICAgRkFJTEVEX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAiZmFpbGVkIikKICAgIGZpCgogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKkNJIEZhaWx1cmVzIERldGVjdGVkKio6ICRGQUlMRURfQ0hFQ0tTIG91dCBvZiAkVE9UQUxfQ0hFQ0tTIGNoZWNrKHMpIGZhaWxpbmcK4p2MICoqQ2Fubm90IGFwcHJvdmUqKjogQWxsIENJIGNoZWNrcyBtdXN0IHBhc3MKCiMjIEZhaWxlZCBDaGVja3MKJEZBSUxFRF9ERVRBSUxTCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIEZpeCBhbGwgZmFpbGluZyBDSSBjaGVja3MKLSBbIF0gQWRkcmVzcyB0ZXN0IGZhaWx1cmVzCi0gWyBdIFJlc29sdmUgYnVpbGQgZXJyb3JzCi0gWyBdIFZlcmlmeSBhbGwgd29ya2Zsb3dzIHBhc3MKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgQ0kgaXNzdWVzIGFyZSByZXNvbHZlZC4iIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCB0aW1lZCBvdXQgb3IgZmFpbGVkIChleGl0IGNvZGU6ICQ/KSIKCiAgICAjIExhYmVsIG1hbmlwdWxhdGlvbiByZW1vdmVkIC0gdXNpbmcgR2l0SHViIFBSIHJldmlld3Mgb25seQogICAgdXBkYXRlX2NvZGVydW5fc3RhdHVzICJuZWVkcy1maXhlcyIgImNoYW5nZXNfcmVxdWVzdGVkIiAiJFBSX1VSTCIKICBlbGlmIFsgIiRQRU5ESU5HX0NIRUNLUyIgLWd0IDAgXTsgdGhlbgogICAgZWNobyAi4o+zIENJIGNoZWNrcyBzdGlsbCBwZW5kaW5nIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgIyBHZXQgZGV0YWlscyBvZiBwZW5kaW5nIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgUEVORElOR19ERVRBSUxTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyAhPSAiY29tcGxldGVkIildIHwgbWFwKCItICIgKyAubmFtZSArICIgKCIgKyAuc3RhdHVzICsgIikiKSB8IGpvaW4oIlxuIiknKQogICAgZWxzZQogICAgICBQRU5ESU5HX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAicGVuZGluZyIpCiAgICBmaQoKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrij7MgKipDSSBDaGVja3MgUGVuZGluZyoqOiAkUEVORElOR19DSEVDS1Mgb3V0IG9mICRUT1RBTF9DSEVDS1MgY2hlY2socykgc3RpbGwgcnVubmluZwrinYwgKipDYW5ub3QgYXBwcm92ZSoqOiBBbGwgQ0kgY2hlY2tzIG11c3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5CgojIyBQZW5kaW5nIENoZWNrcwokUEVORElOR19ERVRBSUxTCgojIyBSZXF1aXJlZCBBY3Rpb25zCi0gWyBdIFdhaXQgZm9yIGFsbCBDSSBjaGVja3MgdG8gY29tcGxldGUKLSBbIF0gVmVyaWZ5IGFsbCBjaGVja3MgcGFzcyBzdWNjZXNzZnVsbHkKLSBbIF0gQWRkcmVzcyBhbnkgZmFpbHVyZXMgdGhhdCBtYXkgb2NjdXIKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgYWxsIENJIGNoZWNrcyBhcmUgY29tcGxldGUuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCgogICAgIyBMYWJlbCBtYW5pcHVsYXRpb24gcmVtb3ZlZCAtIHVzaW5nIEdpdEh1YiBQUiByZXZpZXdzIG9ubHkKICAgICMgTm90ZTogTm8gbG9uZ2VyIHNldHRpbmcgbmVlZHMtdGVzcyBzdGF0dXMgLSBHaXRIdWIgUFIgcmV2aWV3IHN0YXRlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgKICBlbGlmIFsgIiRTVUNDRVNTX0NIRUNLUyIgLWVxICIkVE9UQUxfQ0hFQ0tTIiBdICYmIFsgIiRUT1RBTF9DSEVDS1MiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKchSBBbGwgQ0kgY2hlY2tzIHBhc3NpbmcgLSBwb3N0aW5nIEFQUFJPVkUgcmV2aWV3IgogICAgIyBHZXQgZGV0YWlscyBvZiBzdWNjZXNzZnVsIGNoZWNrcwogICAgaWYgY29tbWFuZCAtdiBqcSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgU1VDQ0VTU19ERVRBSUxTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgLmNvbmNsdXNpb24gPT0gInN1Y2Nlc3MiKV0gfCBtYXAoIi0gIiArIC5uYW1lICsgIiDinIUiKSB8IGpvaW4oIlxuIiknKQogICAgZWxzZQogICAgICBTVUNDRVNTX0RFVEFJTFM9JChleHRyYWN0X2NoZWNrX2RldGFpbHMgIiRDSV9KU09OIiAic3VjY2VzcyIpCiAgICBmaQoKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLWFwcHJvdmUgLS1ib2R5ICIjIyMg4pyFIFFBIFJldmlldyBmb3IgVGFzayAkVEFTS19JRCAtIEFQUFJPVkVECgojIyBQcmUtQXBwcm92YWwgVmVyaWZpY2F0aW9uCuKchSAqKkFMTCBDSSBjaGVja3MgdmVyaWZpZWQqKjogJFNVQ0NFU1NfQ0hFQ0tTIG91dCBvZiAkVE9UQUxfQ0hFQ0tTIGNoZWNrcyBwYXNzaW5nCuKchSAqKk5vIGZhaWx1cmVzIGZvdW5kKio6IFplcm8gZmFpbGluZyBjaGVja3MgY29uZmlybWVkCgojIyBDSSBTdGF0dXMK4pyFICoqR2l0SHViIEFjdGlvbnMgQ0kqKjogQWxsIGNoZWNrcyBwYXNzaW5nCiRTVUNDRVNTX0RFVEFJTFMKCiMjIFRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYQrinIUgKipBbGwgY3JpdGVyaWEgbWV0Kio6IEltcGxlbWVudGF0aW9uIGNvbXBsZXRlIGFuZCB2ZXJpZmllZArinIUgKipDb2RlIHF1YWxpdHkqKjogUGFzc2VzIGFsbCBzdGFuZGFyZHMK4pyFICoqVGVzdGluZyoqOiBDb21wcmVoZW5zaXZlIHRlc3QgY292ZXJhZ2UgYWNoaWV2ZWQKCiMjIEZpbmFsIEFzc2Vzc21lbnQKLSAqKlF1YWxpdHkgU2NvcmUqKjogRXhjZWxsZW50IGltcGxlbWVudGF0aW9uCi0gKipSZWFkeSBmb3IgbWVyZ2UqKjogQWxsIHJlcXVpcmVtZW50cyBzYXRpc2ZpZWQKLSAqKk5vIG91dHN0YW5kaW5nIGlzc3VlcyoqOiBDbGVhbiwgcHJvZHVjdGlvbi1yZWFkeSBjb2RlCgoqKkFQUFJPVkVEKiogLSBSZWFkeSBmb3IgbWVyZ2UgdG8gbWFpbiBicmFuY2guIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCgogICAgIyBMYWJlbCBtYW5pcHVsYXRpb24gcmVtb3ZlZCAtIHVzaW5nIEdpdEh1YiBQUiByZXZpZXdzIG9ubHkKICAgIHVwZGF0ZV9jb2RlcnVuX3N0YXR1cyAiYXBwcm92ZWQiICJhcHByb3ZlZCIgIiRQUl9VUkwiCiAgZWxzZQogICAgZWNobyAi4pqg77iPIFVuZXhwZWN0ZWQgQ0kgc3RhdGUgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4pqg77iPICoqVW5leHBlY3RlZCBDSSBTdGF0ZSoqOiBVbmFibGUgdG8gZGV0ZXJtaW5lIGZpbmFsIENJIHN0YXR1cwrinYwgKipDYW5ub3QgYXBwcm92ZSoqOiBDSSBzdGF0dXMgdW5jbGVhcgoKIyMgQ3VycmVudCBTdGF0dXMKLSBUb3RhbCBjaGVja3M6ICRUT1RBTF9DSEVDS1MKLSBDb21wbGV0ZWQ6ICRDT01QTEVURURfQ0hFQ0tTCi0gU3VjY2Vzc2Z1bDogJFNVQ0NFU1NfQ0hFQ0tTCi0gRmFpbGVkOiAkRkFJTEVEX0NIRUNLUwotIFBlbmRpbmc6ICRQRU5ESU5HX0NIRUNLUwoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBSZXZpZXcgQ0kgY2hlY2sgY29uZmlndXJhdGlvbgotIFsgXSBFbnN1cmUgYWxsIGNoZWNrcyBhcmUgcHJvcGVybHkgZGVmaW5lZAotIFsgXSBWZXJpZnkgd29ya2Zsb3cgY29tcGxldGlvbgotIFsgXSBDb250YWN0IGFkbWluaXN0cmF0b3IgaWYgaXNzdWVzIHBlcnNpc3QKCioqTm90ZSoqOiBXaWxsIHJlLWV2YWx1YXRlIG9uY2UgQ0kgc3RhdHVzIGlzIGNsZWFyLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgoKICAgICMgTGFiZWwgbWFuaXB1bGF0aW9uIHJlbW92ZWQgLSB1c2luZyBHaXRIdWIgUFIgcmV2aWV3cyBvbmx5CiAgICB1cGRhdGVfY29kZXJ1bl9zdGF0dXMgIm5lZWRzLWZpeGVzIiAiY2hhbmdlc19yZXF1ZXN0ZWQiICIkUFJfVVJMIgogIGZpCgplbHNlCiAgIyBHaXRIdWIgQ0xJIG5vdCBhdmFpbGFibGUgLSBza2lwIFBSIHJldmlldwogIGVjaG8gIvCfk50gU2tpcHBpbmcgUFIgcmV2aWV3IHBvc3RpbmcgZHVlIHRvIEdpdEh1YiBDTEkgdW5hdmFpbGFiaWxpdHkiCiAgZWNobyAi4pyFIFRlc3MgUUEgd29ya2Zsb3cgY29tcGxldGVkIGJ1dCBjb3VsZCBub3QgcG9zdCBQUiByZXZpZXciCmZpCgoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBERUJVRyBMT0dHSU5HOiBGSU5BTCBTVEFUVVMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQppZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICBlY2hvICLinIUgVGVzcyBRQSB0ZXN0aW5nIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IFNVQ0NFU1MgKGV4aXQgY29kZSAwKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBUZXNzIFFBIHRlc3RpbmcgZXhpdGVkIHdpdGggY29kZTogJENMQVVERV9FWElUX0NPREUiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IEZBSUxVUkUgKGV4aXQgY29kZSAkQ0xBVURFX0VYSVRfQ09ERSkiCiAgZWNobyAi8J+UjSBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgY2FjaGVfY29udHJvbCBvciBBUEkgZXJyb3Igb2NjdXJyZWQiCiAgZWNobyAi8J+TnSBOb3RlOiBDb250YWluZXIgd2lsbCBzdGlsbCBleGl0IHN1Y2Nlc3NmdWxseSB0byBhbGxvdyB3b3JrZmxvdyBjb250aW51YXRpb24iCmZpCgplY2hvICLwn5SNIFByb2Nlc3MgaW5mb3JtYXRpb246IgplY2hvICIgIC0gUElEOiAkQ0xBVURFX1BJRCIKZWNobyAiICAtIEV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUiCmVjaG8gIiAgLSBXb3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgplY2hvICIgIC0gUmVwb3NpdG9yeTogJFJFUE9fTkFNRSIKZWNobyAiICAtIFBSIFJldmlldzogUG9zdGVkIHRvICMkUFJfTlVNIgoKIyBTaWRlY2FyIHNodXRkb3duIGlzIGhhbmRsZWQgYnkgdGhlIEVYSVQgdHJhcCBkZWZpbmVkIGVhcmxpZXIKIyBUaGUgc2h1dGRvd25fc2lkZWNhciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHNjcmlwdCBleGl0cwoKIyBQZXJmb3JtIGZpbmFsIGNsZWFudXAgb2Ygb3VyIG93biBwcm9jZXNzZXMKZWNobyAi8J+UpyBQZXJmb3JtaW5nIGZpbmFsIHByb2Nlc3MgY2xlYW51cC4uLiIKCiMgQ2xlYW4gdXAgYW55IGNoaWxkIHByb2Nlc3NlcyB3ZSBtYXkgaGF2ZSBzcGF3bmVkCmNsZWFudXBfY2hpbGRfcHJvY2Vzc2VzKCkgewogIGlmIFsgJCQgLWd0IDEgXSAmJiBbIC1kICIvcHJvYyIgXTsgdGhlbgogICAgIyBHZXQgYWxsIGNoaWxkIHByb2Nlc3NlcwogICAgbG9jYWwgY2hpbGRfcGlkcz0iIgogICAgY2hpbGRfcGlkcz0kKHBzIC1vIHBpZCxwcGlkIHwgYXdrIC12IHBwaWQ9JCQgJyQyID09IHBwaWQge3ByaW50ICQxfScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKCiAgICBpZiBbIC1uICIkY2hpbGRfcGlkcyIgXTsgdGhlbgogICAgICBlY2hvICLwn5SNIEZvdW5kIGNoaWxkIHByb2Nlc3NlcyB0byBjbGVhbiB1cDogJGNoaWxkX3BpZHMiCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLVRFUk0gMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBzbGVlcCAyCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLUtJTEwgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQp9CgpjbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcwoKICAjIENoZWNrIGlmIHRlc3Rpbmcgd2FzIHN1Y2Nlc3NmdWwKICAjIFRlc3MgaXMgc3VjY2Vzc2Z1bCBpZiBDbGF1ZGUgZXhpdGVkIGNsZWFubHkgKHRlc3RzIHNob3VsZCBwYXNzKQogIGlmIFsgJHtDTEFVREVfUElEOi0wfSAtbmUgMCBdOyB0aGVuCiAgICB3YWl0ICRDTEFVREVfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIENMQVVERV9FWElUX0NPREU9JD8KICBmaQogIAogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIEF0dGVtcHQgJEFUVEVNUFQ6IFRlc3RpbmcgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKICAgIFNVQ0NFU1M9MQogICAgYnJlYWsKICBlbHNlCiAgICBlY2hvICLimqDvuI8gQXR0ZW1wdCAkQVRURU1QVDogVGVzdGluZyBpbmNvbXBsZXRlIChleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFKSIKICAgIAogICAgaWYgWyAkQVRURU1QVCAtbHQgJE1BWF9SRVRSSUVTIF07IHRoZW4KICAgICAgZWNobyAi8J+UhCBXaWxsIHJldHJ5Li4uICgkKChNQVhfUkVUUklFUyAtIEFUVEVNUFQpKSBhdHRlbXB0cyByZW1haW5pbmcpIgogICAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgICAgZWNobyAiIgogICAgICAjIEJyaWVmIHBhdXNlIGJlZm9yZSByZXRyeQogICAgICBzbGVlcCAyCiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHJlYWNoZWQiCiAgICAgIGJyZWFrCiAgICBmaQogIGZpCmRvbmUKCiMgUmVwb3J0IGZpbmFsIHN0YXR1cwplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi4pyFIFRFU1MgVEVTVElORyBTVUNDRVNTRlVMIgogIGVjaG8gIiAgIENvbXBsZXRlZCBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgplbHNlCiAgZWNobyAi4pqg77iPIFRFU1MgVEVTVElORyBJTkNPTVBMRVRFIgogIGVjaG8gIiAgIEF0dGVtcHRlZCAkQVRURU1QVCB0aW1lKHMpIgogIGVjaG8gIiAgIFRlc3RzIG5vdCBwYXNzaW5nIgpmaQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFdyaXRlIGNvbXBsZXRpb24gbWFya2VyIGZvciB3b3JrZmxvdyB0cmFja2luZwplY2hvICJ0ZXNzLXFhLWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgVEVTUyBDT05UQUlORVIgVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICJDb250YWluZXIgUElEOiAkJCIKZWNobyAiRmluYWwgUHJvY2VzcyBDaGVjazoiCnBzIGF1eCB8IGhlYWQgLTUKCiMgQ2xlYW51cCBGSUZPCnJtIC1mICIkRklGT19QQVRIIiAyPi9kZXYvbnVsbCB8fCB0cnVlCgojIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHN1Y2Nlc3MKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBzdWNjZXNzIHN0YXR1cy4uLiIKICBleGl0IDAKZWxzZQogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggZmFpbHVyZSBzdGF0dXMuLi4iCiAgZWNobyAi8J+TnSBUZXN0aW5nIGluY29tcGxldGUgYWZ0ZXIgJEFUVEVNUFQgYXR0ZW1wdChzKSIKICBleGl0IDEKZmkK + code_claude_container-tess.sh.hbs: IyEvYmluL3NoCgojIENSSVRJQ0FMOiBDbGVhbiB1cCBzZW50aW5lbCBmaWxlIElNTUVESUFURUxZIHRvIHByZXZlbnQgc2lkZWNhciBmcm9tIHNodXR0aW5nIGRvd24KIyBUaGlzIE1VU1QgaGFwcGVuIGJlZm9yZSBhbnl0aGluZyBlbHNlLCBhcyB0aGUgc2lkZWNhciBzdGFydHMgYmVmb3JlIG91ciBzY3JpcHQKaWYgWyAtZiAvd29ya3NwYWNlLy5hZ2VudF9kb25lIF07IHRoZW4KICAgIGVjaG8gIvCfp7kgVVJHRU5UOiBSZW1vdmluZyBsZWZ0b3ZlciBzZW50aW5lbCBmaWxlIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8uYWdlbnRfZG9uZQpmaQoKIyBBbHNvIGNsZWFuIHVwIFRlc3MgY29tcGxldGlvbiBtYXJrZXIgaWYgcHJlc2VudAppZiBbIC1mIC93b3Jrc3BhY2UvLnRlc3MtY29tcGxldGUgXTsgdGhlbgogICAgZWNobyAi8J+nuSBSZW1vdmluZyBUZXNzIGNvbXBsZXRpb24gbWFya2VyIGZyb20gcHJldmlvdXMgcnVuIgogICAgcm0gLWYgL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQpmaQoKIyBFbnN1cmUgUnVzdCBlbnZpcm9ubWVudCBpcyBhbHdheXMgcHJvcGVybHkgc2V0IHVwCmVjaG8gIvCflKcgU2V0dGluZyB1cCBSdXN0IGVudmlyb25tZW50Li4uIgoKIyBTb3VyY2UgUnVzdCBlbnZpcm9ubWVudCBpZiBhdmFpbGFibGUgKGZpeGVzIGNhcmdvIG5vdCBmb3VuZCBpc3N1ZXMpCiMgVHJ5IG11bHRpcGxlIHBvc3NpYmxlIGxvY2F0aW9ucyBmb3IgUnVzdCBlbnZpcm9ubWVudApSVVNUX0VOVl9TT1VSQ0VTPSgKICAgICIkSE9NRS8uY2FyZ28vZW52IgogICAgIi9yb290Ly5jYXJnby9lbnYiCiAgICAiL3Vzci9sb2NhbC9jYXJnby9lbnYiCiAgICAiL2hvbWUvdWJ1bnR1Ly5jYXJnby9lbnYiCiAgICAiL2hvbWUvdXNlci8uY2FyZ28vZW52IgopCgpmb3IgZW52X2ZpbGUgaW4gIiR7UlVTVF9FTlZfU09VUkNFU1tAXX0iOyBkbwogICAgaWYgWyAtZiAiJGVudl9maWxlIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFNvdXJjaW5nIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkZW52X2ZpbGUiCiAgICAgICAgLiAiJGVudl9maWxlIgogICAgICAgICMgRXhwb3J0IFBBVEggZXhwbGljaXRseSBhZnRlciBzb3VyY2luZwogICAgICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgICAgIGJyZWFrCiAgICBmaQpkb25lCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4pyTIFJ1c3R1cCBmb3VuZCwgZW5zdXJpbmcgc3RhYmxlIHRvb2xjaGFpbiBpcyBkZWZhdWx0Li4uIgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICMgUmUtc291cmNlIGVudmlyb25tZW50IGFmdGVyIHNldHRpbmcgZGVmYXVsdAogICAgaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgICAgIC4gIiRIT01FLy5jYXJnby9lbnYiCiAgICBlbGlmIFsgLWYgIi9yb290Ly5jYXJnby9lbnYiIF07IHRoZW4KICAgICAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZmkKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOi91c3IvbG9jYWwvY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIEVuc3VyZWQgc3RhYmxlIFJ1c3QgdG9vbGNoYWluIGlzIGRlZmF1bHQiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBydXN0dXAgbm90IGZvdW5kIGluIFBBVEgiCmZpCgojIFZlcmlmeSBSdXN0IGlzIGF2YWlsYWJsZSB3aXRoIG11bHRpcGxlIGZhbGxiYWNrIGF0dGVtcHRzCmlmIGNvbW1hbmQgLXYgY2FyZ28gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLinJMgQ2FyZ28gaXMgYXZhaWxhYmxlOiAkKGNhcmdvIC0tdmVyc2lvbikiCmVsaWYgWyAtZiAiL3Vzci9sb2NhbC9jYXJnby9iaW4vY2FyZ28iIF07IHRoZW4KICAgIGVjaG8gIuKckyBGb3VuZCBjYXJnbyBhdCAvdXNyL2xvY2FsL2NhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIvdXNyL2xvY2FsL2NhcmdvL2JpbjokUEFUSCIKICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxpZiBbIC1mICIkSE9NRS8uY2FyZ28vYmluL2NhcmdvIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgY2FyZ28gYXQgJEhPTUUvLmNhcmdvL2Jpbi9jYXJnbyIKICAgIGV4cG9ydCBQQVRIPSIkSE9NRS8uY2FyZ28vYmluOiRQQVRIIgogICAgZWNobyAi4pyTIENhcmdvIGlzIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgplbHNlCiAgICBlY2hvICLinYwgQ2FyZ28gbm90IGZvdW5kIGluIFBBVEgiCiAgICBlY2hvICJDdXJyZW50IFBBVEg6ICRQQVRIIgogICAgZWNobyAiQXR0ZW1wdGluZyB0byBmaW5kIGNhcmdvLi4uIgogICAgZmluZCAvdXNyIC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvdXNyIgogICAgZmluZCAvaG9tZSAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL2hvbWUiCiAgICBmaW5kIC9yb290IC1uYW1lIGNhcmdvIDI+L2Rldi9udWxsIHwgaGVhZCAtNSB8fCBlY2hvICJObyBjYXJnbyBmb3VuZCBpbiAvcm9vdCIKICAgICMgVHJ5IHRvIGluc3RhbGwgUnVzdCBhcyBsYXN0IHJlc29ydAogICAgZWNobyAi8J+UpyBBdHRlbXB0aW5nIHRvIGluc3RhbGwgUnVzdCB2aWEgcnVzdHVwLi4uIgogICAgY3VybCAtLXByb3RvICc9aHR0cHMnIC0tdGxzdjEuMiAtc1NmIGh0dHBzOi8vc2gucnVzdHVwLnJzIHwgc2ggLXMgLS0gLXkgfHwgdHJ1ZQogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIgfHwgdHJ1ZQogICAgZXhwb3J0IFBBVEg9IiRIT01FLy5jYXJnby9iaW46JFBBVEgiCiAgICBpZiBjb21tYW5kIC12IGNhcmdvID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDYXJnbyBpbnN0YWxsZWQgYW5kIGF2YWlsYWJsZTogJChjYXJnbyAtLXZlcnNpb24pIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gaW5zdGFsbCBSdXN0LCBjb250aW51aW5nIHdpdGhvdXQgY2FyZ28uLi4iCiAgICBmaQpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgIFRFU1MgVEVTVElORyBXT1JLRkxPVyBTVEFSVElORyAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWRICAgICAgICAgUXVhbGl0eSBBc3N1cmFuY2UgJiBEZXBsb3ltZW50IFRlc3RpbmcgQWdlbnQgICAgICAgICDilZEnCmVjaG8gJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFJFVFJZIENPTkZJR1VSQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BWF9SRVRSSUVTX0NPTkZJRz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KZWNobyAiIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgUkVUUlkgQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICLwn5SEIE1heGltdW0gSXRlcmF0aW9uczogJE1BWF9SRVRSSUVTX0NPTkZJRyIKaWYgWyAtbiAiJHtDTEFVREVfTUFYX1JFVFJJRVM6LX0iIF07IHRoZW4KICBlY2hvICLwn5ONIFNvdXJjZTogQ0xBVURFX01BWF9SRVRSSUVTIGVudmlyb25tZW50IHZhcmlhYmxlIgplbGlmIFsgLW4gIiR7RVhFQ1VUSU9OX01BWF9SRVRSSUVTOi19IiBdOyB0aGVuCiAgZWNobyAi8J+TjSBTb3VyY2U6IEVYRUNVVElPTl9NQVhfUkVUUklFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKZWxzZQogIGVjaG8gIvCfk40gU291cmNlOiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24iCmZpCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKZWNobyAi8J+OryBBZ2VudDoge3tnaXRodWJfYXBwfX0iCmVjaG8gIvCfp6ogRm9jdXM6IENvbXByZWhlbnNpdmUgdGVzdGluZywgZGVwbG95bWVudCB2YWxpZGF0aW9uLCB0ZXN0IGNvdmVyYWdlIgplY2hvICLwn5OLIFRhc2sgSUQ6IHt7dGFza19pZH19IgplY2hvICLinIUgTWlzc2lvbjogMTIwJSBzYXRpc2ZhY3Rpb24gdGhyb3VnaCBleGhhdXN0aXZlIHRlc3RpbmciCgojIERvY2tlciBzaWRlY2FyIGNsZWFudXAgZnVuY3Rpb24Kc3RvcF9kb2NrZXJfc2lkZWNhcigpIHsKICBpZiBbICEgLVMgL3Zhci9ydW4vZG9ja2VyLnNvY2sgXTsgdGhlbgogICAgcmV0dXJuCiAgZmkKCiAgZWNobyAi8J+bkSBTdG9wcGluZyBEb2NrZXIgc2lkZWNhciIKCiAgaWYgY29tbWFuZCAtdiBwa2lsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHBraWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIHNsZWVwIDEKICAgIGlmIHBpZG9mIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIHBraWxsIC05IGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgICBpZiBwaWRvZiBkb2NrZXItaW5pdCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgcGtpbGwgZG9ja2VyLWluaXQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZWxpZiBjb21tYW5kIC12IGtpbGxhbGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBraWxsYWxsIGRvY2tlcmQgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICBlbHNlCiAgICBQSUQ9JChwaWRvZiBkb2NrZXJkIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBpZiBbIC1uICIkUElEIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSUQiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogICAgUElEX0lOSVQ9JChwaWRvZiBkb2NrZXItaW5pdCAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJFBJRF9JTklUIiBdOyB0aGVuCiAgICAgIGtpbGwgIiRQSURfSU5JVCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgZm9yIF8gaW4gMSAyIDMgNCA1OyBkbwogICAgaWYgISBwaWRvZiBkb2NrZXJkID4vZGV2L251bGwgMj4mMSAmJiAhIHBpZG9mIGRvY2tlci1pbml0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICBlY2hvICLinIUgRG9ja2VyIHNpZGVjYXIgc3RvcHBlZCIKICAgICAgcmV0dXJuCiAgICBmaQogICAgc2xlZXAgMQogIGRvbmUKCiAgUkVNQUlOSU5HX0RPQ0tFUj0kKHBpZG9mIGRvY2tlcmQgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICBSRU1BSU5JTkdfSU5JVD0kKHBpZG9mIGRvY2tlci1pbml0IDI+L2Rldi9udWxsIHx8IHRydWUpCiAgZWNobyAi4pqg77iPIERvY2tlciBzaWRlY2FyIHN0aWxsIHJ1bm5pbmcgKGRvY2tlcmQ6ICR7UkVNQUlOSU5HX0RPQ0tFUjotbm9uZX0sIGRvY2tlci1pbml0OiAke1JFTUFJTklOR19JTklUOi1ub25lfSkiCn0KCmVjaG8gIvCflI0gRGVidWcgU2Vzc2lvbjogJChkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnKSAtIFBJRDogJCQiCmVjaG8gIvCfk4ogTG9nIExldmVsOiBERUJVRyAoc2hvd2luZyBKU09OIGNvbnN0cnVjdGlvbiBkZXRhaWxzKSIKCiMgRGlzYWJsZSBpbnRlcmFjdGl2ZSBHaXQgcHJvbXB0cyBnbG9iYWxseQpleHBvcnQgR0lUX1RFUk1JTkFMX1BST01QVD0wCmV4cG9ydCBHSVRfQVNLUEFTUz0vYmluL3RydWUKZXhwb3J0IFNTSF9BU0tQQVNTPS9iaW4vdHJ1ZQoKIyBBbGxvdyBzb2Z0IGZhaWx1cmUgZm9yIHByZWNoZWNrcyB3aGVuIGRlc2lyZWQKIyBTZXQgVEVTU19TVFJJQ1RfUFJFQ0hFQ0tTPTEgdG8gZW5mb3JjZSBoYXJkIGV4aXRzIG9uIGZhaWx1cmVzClRFU1NfU1RSSUNUX1BSRUNIRUNLUz0iJHtURVNTX1NUUklDVF9QUkVDSEVDS1M6LTB9IgoKc29mdF9hYm9ydCgpIHsKICAjIFVzYWdlOiBzb2Z0X2Fib3J0ICJtZXNzYWdlIiBbZXhpdF9jb2RlXQogIG1zZz0iJDEiOyBjb2RlPSIkezI6LTF9IgogIGVjaG8gIuKdjCAkbXNnIgogIGlmIFsgIiRURVNTX1NUUklDVF9QUkVDSEVDS1MiID0gIjEiIF07IHRoZW4KICAgIGVjaG8gIvCfmqsgQWJvcnRpbmcgKFRFU1NfU1RSSUNUX1BSRUNIRUNLUz0xKSIKICAgIGV4aXQgIiRjb2RlIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBOb24tZmF0YWwgcHJlY2hlY2sgZmFpbHVyZSAoY29udGludWluZyB3aXRoIGxpbWl0ZWQgY2FwYWJpbGl0aWVzKSIKICBmaQp9CgojIFJlcG9zaXRvcnkgVVJMClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgojIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCmVjaG8gIlVzaW5nIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gZm9yIHRlc3Rpbmcgd29ya2Zsb3ciCgojIEZ1bmN0aW9uIHRvIGVuc3VyZSBNQ1Agc2VydmVyIHNodXRkb3duCnNodXRkb3duX3NpZGVjYXIoKSB7CiAgIyBObyBzaWRlY2FyIHNodXRkb3duIG5lZWRlZCAtIGNvbnRhaW5lciB3aWxsIGV4aXQgbmF0dXJhbGx5IHdoZW4gbWFpbiBwcm9jZXNzIGNvbXBsZXRlcwogIGVjaG8gIvCflKcgTWFpbiBjb250YWluZXIgcHJvY2VzcyBjb21wbGV0ZSIKICB0b3VjaCAvd29ya3NwYWNlLy5hZ2VudF9kb25lIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKIyBBdXRoZW50aWNhdGUgd2l0aCBHaXRIdWIgQXBwCmlmIFsgLW4gIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiBdICYmIFsgLW4gIiRHSVRIVUJfQVBQX0lEIiBdOyB0aGVuCiAgICBlY2hvICJBdXRoZW50aWNhdGluZyB3aXRoIEdpdEh1YiBBcHAuLi4iCgogICAgIyBDcmVhdGUgdGVtcG9yYXJ5IHByaXZhdGUga2V5IGZpbGUgKHN1cHBvcnQgZXNjYXBlZCBuZXdsaW5lcykKICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXkucGVtIgogICAgcHJpbnRmICclYicgIiRHSVRIVUJfQVBQX1BSSVZBVEVfS0VZIiA+ICIkVEVNUF9LRVlfRklMRSIKICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBHZW5lcmF0ZSBKV1QgdG9rZW4gZm9yIEdpdEh1YiBBcHAgKGZpeGVkIEpXVCBnZW5lcmF0aW9uIGZvciBMaW51eCBjb250YWluZXJzKQogICAgIyBKV1QgaGVhZGVyCiAgICBKV1RfSEVBREVSPSQocHJpbnRmICd7ImFsZyI6IlJTMjU2IiwidHlwIjoiSldUIn0nIHwgYmFzZTY0IC13IDAgfCB0ciAnKy8nICctXycgfCB0ciAtZCAnPScpCgogICAgIyBKV1QgcGF5bG9hZCB3aXRoIGN1cnJlbnQgdGltZSBhbmQgZXhwaXJhdGlvbiAoMTAgbWludXRlcykKICAgIE5PVz0kKGRhdGUgKyVzKQogICAgRVhQPSQoKE5PVyArIDYwMCkpCiAgICBKV1RfUEFZTE9BRD0kKHByaW50ZiAneyJpYXQiOiVkLCJleHAiOiVkLCJpc3MiOiIlcyJ9JyAiJE5PVyIgIiRFWFAiICIkR0lUSFVCX0FQUF9JRCIgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIFNpZ24gdGhlIEpXVAogICAgSldUX1NJR05BVFVSRT0kKHByaW50ZiAnJXMuJXMnICIkSldUX0hFQURFUiIgIiRKV1RfUEFZTE9BRCIgfCBvcGVuc3NsIGRnc3QgLXNoYTI1NiAtc2lnbiAiJFRFTVBfS0VZX0ZJTEUiIC1iaW5hcnkgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKICAgIEpXVF9UT0tFTj0iJEpXVF9IRUFERVIuJEpXVF9QQVlMT0FELiRKV1RfU0lHTkFUVVJFIgoKICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgdGhlIHJlcG9zaXRvcnkgKHJvYnVzdCBwYXJzaW5nIG9mIG93bmVyL3JlcG8pCiAgICBJTlBVVF9SRVBPPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBSRVBPX09XTkVSPSIiCiAgICBSRVBPX05BTUU9IiIKCiAgICBpZiBlY2hvICIkSU5QVVRfUkVQTyIgfCBncmVwIC1xRSAnXmh0dHBzOi8vZ2l0aHViLmNvbS8nOyB0aGVuCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vW14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgICAgICMgU1NIIGZvcm1hdCBnaXRAZ2l0aHViLmNvbTpvd25lci9yZXBvKC5naXQpCiAgICAgICAgUkVQT19PV05FUj0kKGVjaG8gIiRJTlBVVF9SRVBPIiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTooW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOlteL10rLyhbXi9dKykoXC5naXQpP3xcMXwnKQogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2s6IGFzc3VtZSBzbHVnIG93bmVyL3JlcG8gKHBvc3NpYmx5IHdpdGggLmdpdCkKICAgICAgICBTTFVHPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfFwuZ2l0JHx8JykKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJFNMVUciIHwgY3V0IC1kJy8nIC1mMSkKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYyKQogICAgZmkKCiAgICBlY2hvICJERUJVRzogUGFyc2VkIHJlcG9zaXRvcnkgLSBPd25lcjogJyRSRVBPX09XTkVSJywgTmFtZTogJyRSRVBPX05BTUUnIgoKICAgIGVjaG8gIkdldHRpbmcgaW5zdGFsbGF0aW9uIElEIGZvciAkUkVQT19PV05FUi8kUkVQT19OQU1FLi4uIgoKICAgICMgR2V0IHRoZSBpbnN0YWxsYXRpb24gSUQgKHJldHJ5IGFuZCBmb2xsb3cgcmVkaXJlY3RzKS4gRmFsbGJhY2sgdG8gb3JnIGluc3RhbGxhdGlvbi4KICAgIElOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAtLWNvbm5lY3QtdGltZW91dCA1IC0tbWF4LXRpbWUgMTIgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIikKCiAgICBJTlNUQUxMQVRJT05fSUQ9JChlY2hvICIkSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKaoO+4jyBSZXBvIGluc3RhbGxhdGlvbiBub3QgZm91bmQsIHRyeWluZyBvcmcgaW5zdGFsbGF0aW9uLi4uIgogICAgICAgIE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U9JChjdXJsIC1zIC1MIC0tcmV0cnkgNSAtLXJldHJ5LWRlbGF5IDIgLS1yZXRyeS1jb25ucmVmdXNlZCBcCiAgICAgICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgICAgICAtSCAiQWNjZXB0OiBhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iIFwKICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iKQogICAgICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRPUkdfSU5TVEFMTEFUSU9OX1JFU1BPTlNFIiB8IGpxIC1yICcuaWQnKQogICAgZmkKCiAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICBzb2Z0X2Fib3J0ICJGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIgMQogICAgICAgIGVjaG8gIlJlc3BvbnNlIChyZXBvKTogJElOU1RBTExBVElPTl9SRVNQT05TRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAob3JnKTogICR7T1JHX0lOU1RBTExBVElPTl9SRVNQT05TRTotW25vbmVdfSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSIiCiAgICBmaQoKICAgIGVjaG8gIkluc3RhbGxhdGlvbiBJRDogJElOU1RBTExBVElPTl9JRCIKCiAgICAjIEdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuCiAgICBUT0tFTl9SRVNQT05TRT0kKGN1cmwgLXMgLVggUE9TVCBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vYXBwL2luc3RhbGxhdGlvbnMvJElOU1RBTExBVElPTl9JRC9hY2Nlc3NfdG9rZW5zIikKCiAgICBHSVRIVUJfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCiAgICBUT0tFTl9HRU5FUkFURURfQVQ9JChkYXRlICslcykgICMgVHJhY2sgd2hlbiB0b2tlbiB3YXMgZ2VuZXJhdGVkIGZvciByZWZyZXNoIGxvZ2ljCgogICAgaWYgWyAiJEdJVEhVQl9UT0tFTiIgPSAibnVsbCIgXSB8fCBbIC16ICIkR0lUSFVCX1RPS0VOIiBdOyB0aGVuCiAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGdldCBpbnN0YWxsYXRpb24gYWNjZXNzIHRva2VuIiAxCiAgICAgICAgZWNobyAiUmVzcG9uc2U6ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgR0lUSFVCX1RPS0VOPSIiCiAgICBmaQoKICAgIGVjaG8gIuKchSBTdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1YiBBcHAiCgogICAgIyBDbGVhbiB1cCB0ZW1wb3Jhcnkga2V5IGZpbGUKICAgIHJtIC1mICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEV4cG9ydCB0aGUgdG9rZW4gZm9yIGdpdCB0byB1c2UKICAgIGV4cG9ydCBHSVRIVUJfVE9LRU4KCiAgICAjIENvbmZpZ3VyZSBnaXQgdG8gdXNlIHRoZSB0b2tlbiAodXNlIC0tcmVwbGFjZS1hbGwgdG8gaGFuZGxlIG11bHRpcGxlIGV4aXN0aW5nIGhlbHBlcnMpCiAgICBnaXQgY29uZmlnIC0tZ2xvYmFsIC0tcmVwbGFjZS1hbGwgY3JlZGVudGlhbC5oZWxwZXIgc3RvcmUKICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCgogICAgIyBBbHNvIGF1dGhlbnRpY2F0ZSBnaCBDTEkgd2l0aCB0aGUgdG9rZW4KICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4KCiAgICAjIFRva2VuIHJlZnJlc2ggZnVuY3Rpb25zIGZvciBsb25nLXJ1bm5pbmcgam9icwogICAgcmVmcmVzaF9naXRodWJfdG9rZW4oKSB7CiAgICAgICAgZWNobyAi8J+UhCBSZWZyZXNoaW5nIEdpdEh1YiBBcHAgdG9rZW4uLi4iCgogICAgICAgICMgQ3JlYXRlIHRlbXBvcmFyeSBrZXkgZmlsZQogICAgICAgIFRFTVBfS0VZX0ZJTEU9Ii90bXAvZ2l0aHViLWFwcC1rZXktJCQiCiAgICAgICAgZWNobyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGNobW9kIDYwMCAiJFRFTVBfS0VZX0ZJTEUiCgogICAgICAgICMgR2VuZXJhdGUgbmV3IEpXVAogICAgICAgIEpXVF9UT0tFTj0kKHJ1YnkgLXIgb3BlbnNzbCAtciBqc29uIC1yIGJhc2U2NCAtZSAiCiAgICAgICAga2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLnJlYWQoJyRURU1QX0tFWV9GSUxFJykpCiAgICAgICAgcGF5bG9hZCA9IHsKICAgICAgICAgICAgaWF0OiBUaW1lLm5vdy50b19pIC0gNjAsCiAgICAgICAgICAgIGV4cDogVGltZS5ub3cudG9faSArICgxMCAqIDYwKSwKICAgICAgICAgICAgaXNzOiAnJEdJVEhVQl9BUFBfSUQnCiAgICAgICAgfQogICAgICAgIGhlYWRlciA9IHsgYWxnOiAnUlMyNTYnLCB0eXA6ICdKV1QnIH0KCiAgICAgICAgaGVhZGVyX2VuYyA9IEJhc2U2NC51cmxzYWZlX2VuY29kZTY0KGhlYWRlci50b19qc29uKS5nc3ViKCc9JywgJycpCiAgICAgICAgcGF5bG9hZF9lbmMgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChwYXlsb2FkLnRvX2pzb24pLmdzdWIoJz0nLCAnJykKICAgICAgICBzaWduYXR1cmUgPSBCYXNlNjQudXJsc2FmZV9lbmNvZGU2NChrZXkuc2lnbihPcGVuU1NMOjpEaWdlc3Q6OlNIQTI1Ni5uZXcsIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfVwiKSkuZ3N1YignPScsICcnKQoKICAgICAgICBwdXRzIFwiI3toZWFkZXJfZW5jfS4je3BheWxvYWRfZW5jfS4je3NpZ25hdHVyZX1cIgogICAgICAgICIpCgogICAgICAgICMgR2V0IGluc3RhbGxhdGlvbiBJRCAocmV1c2UgbG9naWMgZnJvbSBpbml0aWFsIGF1dGgpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyRSRVBPX09XTkVSLyRSRVBPX05BTUUvaW5zdGFsbGF0aW9uIiB8IGpxIC1yICcuaWQnKQoKICAgICAgICBpZiBbICIkSU5TVEFMTEFUSU9OX0lEIiA9ICJudWxsIiBdIHx8IFsgLXogIiRJTlNUQUxMQVRJT05fSUQiIF07IHRoZW4KICAgICAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoY3VybCAtcyAtSCAiQXV0aG9yaXphdGlvbjogQmVhcmVyICRKV1RfVE9LRU4iIFwKICAgICAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vb3Jncy8kUkVQT19PV05FUi9pbnN0YWxsYXRpb24iIHwganEgLXIgJy5pZCcpCiAgICAgICAgZmkKCiAgICAgICAgIyBHZXQgbmV3IGluc3RhbGxhdGlvbiB0b2tlbgogICAgICAgIFRPS0VOX1JFU1BPTlNFPSQoY3VybCAtcyAtWCBQT1NUIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9hcHAvaW5zdGFsbGF0aW9ucy8kSU5TVEFMTEFUSU9OX0lEL2FjY2Vzc190b2tlbnMiKQoKICAgICAgICBORVdfVE9LRU49JChlY2hvICIkVE9LRU5fUkVTUE9OU0UiIHwganEgLXIgJy50b2tlbicpCgogICAgICAgIGlmIFsgIiRORVdfVE9LRU4iICE9ICJudWxsIiBdICYmIFsgLW4gIiRORVdfVE9LRU4iIF07IHRoZW4KICAgICAgICAgICAgZXhwb3J0IEdJVEhVQl9UT0tFTj0iJE5FV19UT0tFTiIKICAgICAgICAgICAgZXhwb3J0IFRPS0VOX0dFTkVSQVRFRF9BVD0kKGRhdGUgKyVzKQoKICAgICAgICAgICAgIyBVcGRhdGUgZ2l0IGNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gImh0dHBzOi8veC1hY2Nlc3MtdG9rZW46JHtHSVRIVUJfVE9LRU59QGdpdGh1Yi5jb20iID4gfi8uZ2l0LWNyZWRlbnRpYWxzCiAgICAgICAgICAgIGVjaG8gIiRHSVRIVUJfVE9LRU4iIHwgZ2ggYXV0aCBsb2dpbiAtLXdpdGgtdG9rZW4gMj4vZGV2L251bGwKCiAgICAgICAgICAgIGVjaG8gIuKchSBUb2tlbiByZWZyZXNoZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIHJlZnJlc2ggdG9rZW46ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgICAgICByZXR1cm4gMQogICAgICAgIGZpCiAgICB9CgogICAgIyBDaGVjayBpZiB0b2tlbiBuZWVkcyByZWZyZXNoIChjYWxsIGJlZm9yZSBnaXQgb3BlcmF0aW9ucykKICAgIHJlZnJlc2hfdG9rZW5faWZfbmVlZGVkKCkgewogICAgICAgIGlmIFsgLXogIiRUT0tFTl9HRU5FUkFURURfQVQiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi4pqg77iPIE5vIHRva2VuIHRpbWVzdGFtcCBmb3VuZCwgcmVmcmVzaGluZyB0b2tlbi4uLiIKICAgICAgICAgICAgcmVmcmVzaF9naXRodWJfdG9rZW4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZmkKCiAgICAgICAgTk9XPSQoZGF0ZSArJXMpCiAgICAgICAgVE9LRU5fQUdFPSQoKE5PVyAtIFRPS0VOX0dFTkVSQVRFRF9BVCkpCgogICAgICAgICMgUmVmcmVzaCBpZiB0b2tlbiBpcyBvbGRlciB0aGFuIDUwIG1pbnV0ZXMgKHRva2VucyBsYXN0IDEgaG91ciwgcmVmcmVzaCBhdCA1MCBtaW4gdG8gYmUgc2FmZSkKICAgICAgICBpZiBbICRUT0tFTl9BR0UgLWd0IDMwMDAgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5SEIFRva2VuIGlzICQoKCRUT0tFTl9BR0UgLyA2MCkpIG1pbnV0ZXMgb2xkLCByZWZyZXNoaW5nLi4uIgogICAgICAgICAgICByZWZyZXNoX2dpdGh1Yl90b2tlbgogICAgICAgIGZpCiAgICB9CgplbHNlCiAgICBlY2hvICLinYwgR2l0SHViIEFwcCBjcmVkZW50aWFscyBub3QgZm91bmQiCiAgICBleGl0IDEKZmkKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgYWdlbnQKIyBTZXQgV29ya2luZyBEaXJlY3RvcnkgKENyaXRpY2FsIGZvciBDbGF1ZGUgRXhlY3V0aW9uKSAtIE1hdGNoIFJleCBwYXR0ZXJuCldPUktfRElSPSJ7e3dvcmtpbmdfZGlyZWN0b3J5fX0iCmlmIFsgIiRXT1JLX0RJUiIgPSAiLiIgXSB8fCBbIC16ICIkV09SS19ESVIiIF07IHRoZW4KICBDTEFVREVfV09SS19ESVI9Ii93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZWxzZQogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FLyRXT1JLX0RJUiIKZmkKbWtkaXIgLXAgIiRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBQcmVwYXJlIGVudmlyb25tZW50IGZvciB0ZXN0aW5nCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+nqiBQUkVQQVJJTkcgVEVTVElORyBFTlZJUk9OTUVOVCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBHaXQgY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKIyBTZXQgR2l0SHViIEFwcCBhdHRyaWJ1dGlvbiAtIHVzZSBnZW5lcmljIGZvcm1hdCBmb3IgYWxsIGFnZW50cwpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogICAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICAgIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgICAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIHJldHVybgogICAgZmkKCiAgICBsb2NhbCBzbHVnCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogICAgZmkKCiAgICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICAgIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgICAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgICAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgICAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgICAgIGxvY2FsIGJvdF9pZAogICAgICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICAgICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICAgICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIGZpCiAgICBmaQoKICAgIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICAgIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCiMgQ29uZmlndXJlIGdpdCB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgoKIyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbGF1ZGUgQ29kZSB0byB1c2UKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmVjaG8gIuKckyBHaXQgY29uZmlndXJlZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgpHSVRfUkVQT19PSz0wCmlmIGdpdCBscy1yZW1vdGUgIiRSRVBPX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9yZXBvX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3Mgc3VjY2Vzc2Z1bCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7cmVwb3NpdG9yeV91cmx9fSAoJFJFUE9fSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL3JlcG9fdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBIVFRQUyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIEVycm9yIG91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0KSIKICBlY2hvICIgIEdpdCBjcmVkZW50aWFsIGhlbHBlciBzdGF0dXM6IgogIGdpdCBjb25maWcgLS1saXN0IHwgZ3JlcCBjcmVkZW50aWFsIHx8IGVjaG8gIiAgTm8gY3JlZGVudGlhbCBoZWxwZXJzIGNvbmZpZ3VyZWQiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiIDEKICBHSVRfUkVQT19PSz0xCmZpCgojIFRlc3QgZG9jcyByZXBvc2l0b3J5IGFjY2VzcwplY2hvICLwn5SNIERFQlVHOiBUZXN0aW5nIGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MuLi4iCmVjaG8gIiAgQ29tbWFuZDogZ2l0IGxzLXJlbW90ZSBcIiRET0NTX0hUVFBfVVJMXCIgSEVBRCIKRE9DU19SRVBPX09LPTAKaWYgZ2l0IGxzLXJlbW90ZSAiJERPQ1NfSFRUUF9VUkwiIEhFQUQgPiAvdG1wL2RvY3NfdGVzdC5vdXQgMj4mMTsgdGhlbgogIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgT3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQgfCBoZWFkIC0xKSIKZWxzZQogIGVjaG8gIuKdjCBEb2NzIHJlcG9zaXRvcnkgYWNjZXNzIGZhaWxlZCIKICBlY2hvICIgIFJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvZG9jc190ZXN0Lm91dCkiCiAgZWNobyAiIgogIHNvZnRfYWJvcnQgIkNhbm5vdCBhY2Nlc3MgZG9jcyByZXBvc2l0b3J5IHZpYSBIVFRQUyIgMQogIERPQ1NfUkVQT19PSz0xCmZpCgojIENsb25lIG9yIHVwZGF0ZSByZXBvc2l0b3J5IChkaXJlY3RseSB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkpCmlmIFsgLWQgIiRDTEFVREVfV09SS19ESVIvLmdpdCIgXTsgdGhlbgogICAgZWNobyAi8J+TgSBGb3VuZCBleGlzdGluZyByZXBvc2l0b3J5IGF0IHdvcmtpbmcgZGlyZWN0b3J5LCB1cGRhdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCmVsc2UKICAgICMgRW5zdXJlIHBhcmVudCBkaXJlY3RvcmllcyBleGlzdAogICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgoKICAgICMgSWYgZGlyZWN0b3J5IGV4aXN0cyBidXQgaXNuJ3QgYSBnaXQgcmVwbywgcmVtb3ZlIGl0IGZpcnN0CiAgICBpZiBbIC1kICIkQ0xBVURFX1dPUktfRElSIiBdICYmIFsgISAtZCAiJENMQVVERV9XT1JLX0RJUi8uZ2l0IiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+nuSBSZW1vdmluZyBub24tZ2l0IGRpcmVjdG9yeSB0byBwcmVwYXJlIGZvciBjbG9uZS4uLiIKICAgICAgICBybSAtcmYgIiRDTEFVREVfV09SS19ESVIiCiAgICBmaQoKICAgIGVjaG8gIvCfk6UgQ2xvbmluZyByZXBvc2l0b3J5IHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgogICAgIyBNYWtlIHN1cmUgcGFyZW50IGRpcmVjdG9yeSBleGlzdHMgYW5kIHdlJ3JlIGluIGEgdmFsaWQgbG9jYXRpb24KICAgIFBBUkVOVF9ESVI9IiQoZGlybmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIgogICAgbWtkaXIgLXAgIiRQQVJFTlRfRElSIgogICAgY2QgIiRQQVJFTlRfRElSIgoKICAgICMgVXNlIHRoZSBSRVBPX0hUVFBfVVJMIGNvbnN0cnVjdGVkIGluIGF1dGhlbnRpY2F0aW9uIHZlcmlmaWNhdGlvbiBzZWN0aW9uCiAgICBpZiBbICIkR0lUX1JFUE9fT0siIC1lcSAwIF07IHRoZW4KICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIjsgdGhlbgogICAgICAgICAgc29mdF9hYm9ydCAiRmFpbGVkIHRvIGNsb25lIHJlcG9zaXRvcnkiIDEKICAgICAgICAgIGVjaG8gIkRlYnVnOiBDTEFVREVfV09SS19ESVI9JENMQVVERV9XT1JLX0RJUiIKICAgICAgICAgIGVjaG8gIkRlYnVnOiBQYXJlbnQgZGlyZWN0b3J5IGV4aXN0czogJChscyAtbGEgIiRQQVJFTlRfRElSIiAyPi9kZXYvbnVsbCB8fCBlY2hvICdObycpIgogICAgICAgICAgbWtkaXIgLXAgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIgfHwgdHJ1ZQogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gU2tpcHBpbmcgY2xvbmUgZHVlIHRvIHByZXZpb3VzIHJlcG8gYWNjZXNzIGZhaWx1cmU7IGNyZWF0aW5nIGVtcHR5IHdvcmtpbmcgZGlyZWN0b3J5IgogICAgICBta2RpciAtcCAiJChiYXNlbmFtZSAiJENMQVVERV9XT1JLX0RJUiIpIiB8fCB0cnVlCiAgICBmaQogICAgY2QgIiQoYmFzZW5hbWUgIiRDTEFVREVfV09SS19ESVIiKSIKZmkKCiMgVXRpbGl0eSBmdW5jdGlvbiBmb3Igc2FmZSBHaXQgb3BlcmF0aW9ucwpzYWZlX2dpdF9wdWxsKCkgewogICAgbG9jYWwgcmVtb3RlPSIkMSIKICAgIGxvY2FsIGJyYW5jaD0iJDIiCgogICAgZWNobyAi8J+TpSBBdHRlbXB0aW5nIHRvIHB1bGwgZnJvbSAkcmVtb3RlLyRicmFuY2guLi4iCgogICAgIyBUcnkgcmViYXNlIGZpcnN0IChjbGVhbmVyIGhpc3RvcnkpCiAgICBpZiBnaXQgcHVsbCAtLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCByZWJhc2UiCiAgICAgICAgcmV0dXJuIDAKICAgIGZpCgogICAgIyBUcnkgbWVyZ2UgaWYgcmViYXNlIGZhaWxzCiAgICBpZiBnaXQgcHVsbCAtLW5vLXJlYmFzZSAiJHJlbW90ZSIgIiRicmFuY2giIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFN1Y2Nlc3NmdWxseSBwdWxsZWQgd2l0aCBtZXJnZSIKICAgICAgICByZXR1cm4gMAogICAgZmkKCiAgICAjIElmIGJvdGggZmFpbCwgc2hvdyBjdXJyZW50IHN0YXR1cyBhbmQgY29udGludWUKICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgcHVsbCBkdWUgdG8gZGl2ZXJnZW50IGJyYW5jaGVzIG9yIGNvbmZsaWN0cyIKICAgIGVjaG8gIvCfk40gQ3VycmVudCBjb21taXQ6ICQoZ2l0IHJldi1wYXJzZSAtLXNob3J0IEhFQUQgMj4vZGV2L251bGwgfHwgZWNobyAndW5rbm93bicpIgogICAgZWNobyAi8J+TjSBMb2NhbCBjaGFuZ2VzOiAkKGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gfCB3YyAtbCkgZmlsZXMgbW9kaWZpZWQiCiAgICBlY2hvICLwn5ONIENvbnRpbnVpbmcgd2l0aCBjdXJyZW50IGJyYW5jaCBzdGF0ZSIKICAgIHJldHVybiAxCn0KCiMgRGVyaXZlIHJlcG9zaXRvcnkgc2x1ZyBmb3IgZ2ggQ0xJIG9wZXJhdGlvbnMKUkVQT19TTFVHPSIiCmlmIGdpdCAtQyAiJENMQVVERV9XT1JLX0RJUiIgcmVtb3RlIGdldC11cmwgb3JpZ2luID4vZGV2L251bGwgMj4mMTsgdGhlbgogIE9SSUdJTl9VUkw9JChnaXQgLUMgIiRDTEFVREVfV09SS19ESVIiIHJlbW90ZSBnZXQtdXJsIG9yaWdpbiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgIFJFUE9fU0xVRz0kKGVjaG8gIiRPUklHSU5fVVJMIiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rL1teL10rKShcXC5naXQpP3xcXDF8JykKICBlbGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeZ2l0QGdpdGh1Yi5jb206JzsgdGhlbgogICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgZmkKZmkKCiMgSWYgUFIgY29udGV4dCBpcyBtaXNzaW5nLCB0cnkgdG8gZGlzY292ZXIgYnkgdGFzayBsYWJlbAppZiBbIC16ICIke1BSX05VTUJFUjotfSIgXSB8fCBbIC16ICIke1BSX1VSTDotfSIgXTsgdGhlbgogIFRBU0tfTEFCRUw9InRhc2stJHtUQVNLX0lEfSIKICBpZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSAmJiBbIC1uICIkUkVQT19TTFVHIiBdOyB0aGVuCiAgICBDQU5EX05VTT0kKGdoIHByIGxpc3QgLVIgIiRSRVBPX1NMVUciIC0tbGFiZWwgIiRUQVNLX0xBQkVMIiAtLWpzb24gbnVtYmVyIC0tanEgJy5bMF0ubnVtYmVyJyAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgaWYgWyAtbiAiJENBTkRfTlVNIiBdOyB0aGVuCiAgICAgIFBSX05VTUJFUj0iJENBTkRfTlVNIgogICAgICBQUl9VUkw9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtUiAiJFJFUE9fU0xVRyIgLS1qc29uIHVybCAtcSAudXJsIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICAgIGVjaG8gIuKckyBEaXNjb3ZlcmVkIFBSIGNvbnRleHQgdmlhIGxhYmVsOiBQUiAjJFBSX05VTUJFUiAoJFBSX1VSTCkiCiAgICBmaQogIGZpCmZpCgojIENoZWNrb3V0IFBSIGJyYW5jaCBmb3IgdGVzdGluZyByZXZpZXcKaWYgWyAtbiAiJFBSX05VTUJFUiIgXSAmJiBbIC1uICIkUFJfVVJMIiBdOyB0aGVuCiAgICBlY2hvICLwn5SEIENoZWNraW5nIG91dCBQUiAjJFBSX05VTUJFUiBmb3IgUUEgdGVzdGluZy4uLiIKICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZ2l0IGZldGNoIG9yaWdpbiAtLXBydW5lCiAgICBQUl9CUkFOQ0g9JChnaCBwciB2aWV3ICIkUFJfTlVNQkVSIiAtLWpzb24gaGVhZFJlZk5hbWUgLS1qcSAnLmhlYWRSZWZOYW1lJyAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAtbiAiJFBSX0JSQU5DSCIgXTsgdGhlbgogICAgICAgICMgVHJ5IHRvIGNoZWNrb3V0L2NyZWF0ZSB0aGUgYnJhbmNoCiAgICAgICAgaWYgZ2l0IGNoZWNrb3V0ICIkUFJfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICBlY2hvICLinJMgQ2hlY2tlZCBvdXQgZXhpc3RpbmcgYnJhbmNoOiAkUFJfQlJBTkNIIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi8J+TnSBDcmVhdGluZyBuZXcgbG9jYWwgYnJhbmNoIGZyb20gcmVtb3RlOiAkUFJfQlJBTkNIIgogICAgICAgICAgICBpZiBnaXQgY2hlY2tvdXQgLWIgIiRQUl9CUkFOQ0giICJvcmlnaW4vJFBSX0JSQU5DSCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIuKckyBDcmVhdGVkIG5ldyBicmFuY2g6ICRQUl9CUkFOQ0giCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY3JlYXRlIGJyYW5jaCAkUFJfQlJBTkNILCBzdGF5aW5nIG9uIGN1cnJlbnQgYnJhbmNoIgogICAgICAgICAgICAgICAgIyBTa2lwIHRvIHRoZSBuZXh0IHBhcnQgd2l0aG91dCB0aGUgY29udGludWUKICAgICAgICAgICAgZmkKICAgICAgICBmaQoKICAgICAgICAjIE9ubHkgYXR0ZW1wdCBwdWxsIGlmIHdlIHN1Y2Nlc3NmdWxseSBjaGVja2VkIG91dC9jcmVhdGVkIHRoZSBicmFuY2gKICAgICAgICBpZiBbICIkKGdpdCByZXYtcGFyc2UgLS1hYmJyZXYtcmVmIEhFQUQgMj4vZGV2L251bGwpIiA9ICIkUFJfQlJBTkNIIiBdOyB0aGVuCiAgICAgICAgICAgICMgSGFuZGxlIGRpdmVyZ2VudCBicmFuY2hlcyBncmFjZWZ1bGx5IHVzaW5nIHV0aWxpdHkgZnVuY3Rpb24KICAgICAgICAgICAgaWYgISBzYWZlX2dpdF9wdWxsIG9yaWdpbiAiJFBSX0JSQU5DSCI7IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIvCfk40gQ29udGludWluZyB3aXRoIGN1cnJlbnQgYnJhbmNoIHN0YXRlIGZvciB0ZXN0aW5nIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgZWNobyAi4pyTIENoZWNrZWQgb3V0IFBSIGJyYW5jaDogJFBSX0JSQU5DSCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gQ291bGQgbm90IGRldGVybWluZSBQUiBicmFuY2ggbmFtZSwgc3RheWluZyBvbiBkZWZhdWx0IGJyYW5jaCIKICAgIGZpCgogICAgIyBBZGQgUFIgY29udGV4dCB0byBDTEFVREUubWQgZm9yIHJlZmVyZW5jZQogICAgZWNobyAiIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIiMgUFIgQ29udGV4dCBmb3IgVGVzdGluZyIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICItICoqUFIgTnVtYmVyKio6ICRQUl9OVU1CRVIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQogICAgZWNobyAiLSAqKlBSIFVSTCoqOiAkUFJfVVJMIiA+PiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiIHx8IHRydWUKICAgIGVjaG8gIi0gKipCcmFuY2gqKjogJFBSX0JSQU5DSCIgPj4gIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiB8fCB0cnVlCiAgICBlY2hvICIiID4+ICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgfHwgdHJ1ZQplbHNlCiAgICBlY2hvICLihLnvuI8gTm8gUFIgY29udGV4dCBwcm92aWRlZCAtIHdvcmtpbmcgb24gZGVmYXVsdCBicmFuY2giCmZpCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIvCflKcgVEVTVElORyBJTkZSQVNUUlVDVFVSRSBTRVRVUCIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTZXR1cCBLdWJlcm5ldGVzIGFkbWluIGFjY2VzcyBpZiBhdmFpbGFibGUKaWYgWyAtZiAiL2V0Yy9rdWJlL2NvbmZpZyIgXTsgdGhlbgogICAgZXhwb3J0IEtVQkVDT05GSUc9L2V0Yy9rdWJlL2NvbmZpZwogICAgZWNobyAi4pyFIEt1YmVybmV0ZXMgYWRtaW4gYWNjZXNzIGNvbmZpZ3VyZWQiCiAgICBrdWJlY3RsIHZlcnNpb24gLS1jbGllbnQgMj4vZGV2L251bGwgfHwgZWNobyAi4pqg77iPIGt1YmVjdGwgbm90IGF2YWlsYWJsZSIKZmkKCiMgU2V0dXAgZGF0YWJhc2UgYWRtaW4gY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlCmlmIFsgLW4gIiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIgXTsgdGhlbgogICAgZXhwb3J0IFBHUEFTU1dPUkQ9IiRQT1NUR1JFU19BRE1JTl9QQVNTV09SRCIKICAgIGVjaG8gIuKchSBQb3N0Z3JlU1FMIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgppZiBbIC1uICIkUkVESVNfQURNSU5fUEFTU1dPUkQiIF07IHRoZW4KICAgIGV4cG9ydCBSRURJU19QQVNTV09SRD0iJFJFRElTX0FETUlOX1BBU1NXT1JEIgogICAgZWNobyAi4pyFIFJlZGlzIGFkbWluIGNyZWRlbnRpYWxzIGNvbmZpZ3VyZWQiCmZpCgojIFNldHVwIEFyZ28gQ0QgYWRtaW4gYWNjZXNzIGlmIGF2YWlsYWJsZQppZiBbIC1uICIkQVJHT0NEX0FETUlOX1RPS0VOIiBdOyB0aGVuCiAgICBleHBvcnQgQVJHT0NEX0FVVEhfVE9LRU49IiRBUkdPQ0RfQURNSU5fVE9LRU4iCiAgICBlY2hvICLinIUgQXJnbyBDRCBhZG1pbiBhY2Nlc3MgY29uZmlndXJlZCIKZmkKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TiyBURVNUSU5HIFdPUktGTE9XIFJFUVVJUkVNRU5UUyIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICIiCmVjaG8gIlBIQVNFIDA6IENJL0NEIFNldHVwIChJTU1FRElBVEUgUFJJT1JJVFkpIgplY2hvICItIFNldCB1cCBHaXRIdWIgQWN0aW9ucyBDSSBwaXBlbGluZSBpZiBub3QgZXhpc3RzIgplY2hvICItIEFkZCB0ZXN0IHJ1bm5pbmcgYW5kIGNvdmVyYWdlIHJlcG9ydGluZyB0byBDSSIKZWNobyAiLSBDb25maWd1cmUgYnJhbmNoIHByb3RlY3Rpb24gcnVsZXMgd2l0aCB0ZXN0IGdhdGVzIgplY2hvICItIEVuc3VyZSB0ZXN0cyBtdXN0IHBhc3MgYmVmb3JlIG1lcmdlIgplY2hvICItIERvIHRoaXMgQVMgU09PTiBhcyB0aGVyZSdzIGVub3VnaCBjb2RlIHRvIHRlc3QiCmVjaG8gIiIKZWNobyAiUEhBU0UgMTogQWNjZXB0YW5jZSBDcml0ZXJpYSBWYWxpZGF0aW9uIgplY2hvICItIFJldmlldyBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0IGFjY2VwdGFuY2UgY3JpdGVyaWEgKE5PVCBhcmNoaXRlY3R1cmUpIgplY2hvICItIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhcmUgZnVsbHkgbWV0IgplY2hvICItIEZvY3VzIG9uIHRhc2svYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCByZXF1aXJlbWVudHMiCmVjaG8gIi0gQWRkIFBSIGNvbW1lbnRzIGZvciBhbnkgbWlzc2luZyBhY2NlcHRhbmNlIGNyaXRlcmlhIgplY2hvICIiCmVjaG8gIlBIQVNFIDI6IFRlc3QgV3JpdGluZyAoUFJJTUFSWSBSRVNQT05TSUJJTElUWSkiCmVjaG8gIi0gV3JpdGUgY29tcHJlaGVuc2l2ZSB1bml0IHRlc3RzIGZvciBhbGwgY29kZSIKZWNobyAiLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgYWxsIGZlYXR1cmVzIgplY2hvICItIEFJTSBGT1IgMTAwJSBURVNUIENPVkVSQUdFIC0gdGhpcyBpcyBjcml0aWNhbCEiCmVjaG8gIi0gRW5zdXJlIGFsbCB0ZXN0cyBwYXNzIGJlZm9yZSBhcHByb3ZhbCIKZWNobyAiLSBQdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaCIKZWNobyAiLSBPTkxZIHdyaXRlIHRlc3QgZmlsZXMgKCpfdGVzdC4qLCAqLnRlc3QuKiwgZXRjLikiCmVjaG8gIi0gTkVWRVIgbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUiCmVjaG8gIiIKZWNobyAiUEhBU0UgMzogTWFudWFsIFRlc3RpbmcgJiBWYWxpZGF0aW9uIgplY2hvICItIFJ1biB0aGUgdGVzdCBzdWl0ZSBhbmQgdmVyaWZ5IGNvdmVyYWdlIgplY2hvICItIFRlc3QgYXBwbGljYXRpb24gZnVuY3Rpb25hbGl0eSBtYW51YWxseSIKZWNobyAiLSBWZXJpZnkgbm8gcmVncmVzc2lvbnMgaW50cm9kdWNlZCIKZWNobyAiLSBEb2N1bWVudCBmaW5kaW5ncyBpbiBQUiBjb21tZW50cyIKZWNobyAiIgplY2hvICJDUklUSUNBTDogU2V0IHVwIENJIGdhdGVzIGVhcmx5ICYgYWNoaWV2ZSAxMDAlIGNvdmVyYWdlISIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBDb3B5IHRhc2sgZmlsZXMgaWYgZG9jcyByZXBvc2l0b3J5IGlzIHNwZWNpZmllZAp7eyNpZiBkb2NzX3JlcG9zaXRvcnlfdXJsfX0KZWNobyAi8J+TiyBDb3B5aW5nIHRhc2sgZmlsZXMgZnJvbSBkb2N1bWVudGF0aW9uIHJlcG9zaXRvcnkuLi4iCkRPQ1NfUkVQT19VUkw9Int7ZG9jc19yZXBvc2l0b3J5X3VybH19IgpET0NTX0JSQU5DSD0ie3sjaWYgZG9jc19icmFuY2h9fXt7ZG9jc19icmFuY2h9fXt7ZWxzZX19bWFpbnt7L2lmfX0iCkRPQ1NfSFRUUF9VUkw9JChlY2hvICIkRE9DU19SRVBPX1VSTCIgfCBzZWQgInN8aHR0cHM6Ly9naXRodWIuY29tL3xodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tL3wiKQoKaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbyAyPi9kZXYvbnVsbDsgdGhlbgogICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSBkb2NzIHJlcG9zaXRvcnkgZnJvbSAkRE9DU19SRVBPX1VSTCIKICAgIGVjaG8gIvCfk40gVGhpcyBtYXkgYmUgZHVlIHRvIGF1dGhlbnRpY2F0aW9uIG9yIG5ldHdvcmsgaXNzdWVzIgogICAgZWNobyAi8J+TjSBDb250aW51aW5nIHdpdGhvdXQgdGFzayBmaWxlcyBmcm9tIGRvY3MgcmVwb3NpdG9yeSIKZWxzZQogICAgY2QgL3RtcC9kb2NzLXJlcG8gfHwgewogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hhbmdlIHRvIGRvY3MgcmVwb3NpdG9yeSBkaXJlY3RvcnkiCiAgICAgICAgY2QgIiRDTEFVREVfV09SS19ESVIiCiAgICB9CgogICAgIyBUcnkgdG8gY2hlY2tvdXQgdGhlIGRvY3MgYnJhbmNoIHdpdGggZXJyb3IgaGFuZGxpbmcKICAgIGlmIGdpdCBjaGVja291dCAiJERPQ1NfQlJBTkNIIiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gIuKckyBDaGVja2VkIG91dCBkb2NzIGJyYW5jaDogJERPQ1NfQlJBTkNIIgogICAgICAgIGNkICIkQ0xBVURFX1dPUktfRElSIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKaoO+4jyBDb3VsZCBub3QgY2hlY2tvdXQgZG9jcyBicmFuY2ggJERPQ1NfQlJBTkNIIgogICAgICAgIGVjaG8gIvCfk40gQXZhaWxhYmxlIGJyYW5jaGVzOiAkKGdpdCBicmFuY2ggLXIgMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gJ3Vua25vd24nKSIKICAgICAgICBjZCAiJENMQVVERV9XT1JLX0RJUiIKICAgIGZpCmZpCgojIENvcHkgdGFzayBmaWxlcwpta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUi90YXNrIgp7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCmVsc2UKICAgIERPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8ve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIiCmZpCnt7ZWxzZX19CkRPQ1NfUEFUSD0iL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIiCnt7L2lmfX0KClRBU0tfRElSPSIkRE9DU19QQVRIL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL2FjY2VwdGFuY2UtY3JpdGVyaWEubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBjcCAiJFRBU0tfRElSL3Byb21wdC5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGNwICIkVEFTS19ESVIvdG9vbG1hbi1ndWlkZS5tZCIgIiRDTEFVREVfV09SS19ESVIvdGFzay8iIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCIKZmkKCiMgQ29weSBhcmNoaXRlY3R1cmUubWQKaWYgWyAtZiAiJERPQ1NfUEFUSC9kb2NzL2FyY2hpdGVjdHVyZS5tZCIgXTsgdGhlbgogICAgY3AgIiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiICIkQ0xBVURFX1dPUktfRElSL3Rhc2svIgpmaQoKIyBDbGVhbiB1cCBkb2NzIHJlcG8Kcm0gLXJmIC90bXAvZG9jcy1yZXBvCnt7L2lmfX0KCiMgUmVwb3NpdG9yeSBpcyBub3cgY2xvbmVkIGRpcmVjdGx5IHRvIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSAtIG5vIGNvcHkgbmVlZGVkCmVjaG8gIuKckyBSZXBvc2l0b3J5IGNsb25lZCBkaXJlY3RseSB0byB3b3JraW5nIGRpcmVjdG9yeSIKCiMgQ2hlY2sgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHByZXZpb3VzIHNlc3Npb24Ke3sjaWYgY29udGludWVfc2Vzc2lvbn19CmVjaG8gIvCfk4IgQ29udGludWluZyBmcm9tIHByZXZpb3VzIHNlc3Npb24uLi4iCiMgUHJlc2VydmUgZXhpc3RpbmcgQ0xBVURFLm1kIGlmIGl0IGV4aXN0cwppZiBbIC1mICIvd29ya3NwYWNlL0NMQVVERS5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIGV4aXN0aW5nIENMQVVERS5tZCwgcHJlc2VydmluZyBzZXNzaW9uIG1lbW9yeSIKZmkKe3tlbHNlfX0Ke3sjaWYgb3ZlcndyaXRlX21lbW9yeX19CmVjaG8gIvCflIQgT3ZlcndyaXRpbmcgc2Vzc2lvbiBtZW1vcnkgYXMgcmVxdWVzdGVkLi4uIgpybSAtZiAvd29ya3NwYWNlL0NMQVVERS5tZAp7ey9pZn19Cnt7L2lmfX0KCiMgR2VuZXJhdGUgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHRlbXBsYXRlcwplY2hvICLwn5SnIEdlbmVyYXRpbmcgVGVzcy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGVzLi4uIgoKIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKZWNobyAiPT09IEVOVEVSUFJJU0UgTUFOQUdFRCBTRVRUSU5HUyA9PT0iCmVjaG8gIuKckyBTZXR0aW5ncyBtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwIGF0OiAvZXRjL2NsYXVkZS1jb2RlL21hbmFnZWQtc2V0dGluZ3MuanNvbiIKZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgojIFZlcmlmeSBjbGllbnQtY29uZmlnLmpzb24gaXMgYXZhaWxhYmxlIGFuZCB2YWxpZAplY2hvICI9PT0gVE9PTE1BTiBDT05GSUcgU0VUVVAgPT09IgpXT1JLU1BBQ0VfQ0ZHPSIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIKU09VUkNFX0NGRz0iL3Rhc2stZmlsZXMvY2xpZW50LWNvbmZpZy5qc29uIgoKIyBIZWxwZXIgdG8gY2hlY2sgbm9uLWVtcHR5IEpTT04gb2JqZWN0CmlzX3ZhbGlkX2NmZygpIHsKICBsb2NhbCBwPSIkMSIKICBbIC1mICIkcCIgXSB8fCByZXR1cm4gMQogIGpxIC1lICd0eXBlPT0ib2JqZWN0IiBhbmQgbGVuZ3RoPjAnICIkcCIgPi9kZXYvbnVsbCAyPiYxCn0KClNUQVRVU19MQUJFTF9ORUVEU19GSVhFUz0ibmVlZHMtZml4ZXMiClNUQVRVU19MQUJFTF9GSVhJTkc9ImZpeGluZy1pbi1wcm9ncmVzcyIKU1RBVFVTX0xBQkVMX05FRURTX0NMRU89Im5lZWRzLWNsZW8iClNUQVRVU19MQUJFTF9ORUVEU19URVNTPSJuZWVkcy10ZXNzIgpTVEFUVVNfTEFCRUxfQVBQUk9WRUQ9ImFwcHJvdmVkIgpTVEFUVVNfTEFCRUxfRkFJTEVEPSJmYWlsZWQtcmVtZWRpYXRpb24iClNUQVRVU19MQUJFTF9ORUVEU19URVNUU19MRUdBQ1k9Im5lZWRzIHRlc3RzIgoKZW5zdXJlX3N0YXR1c19sYWJlbHMoKSB7CiAgbG9jYWwgcmVwbz0iJDEiCiAgc2hpZnQKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgZW50cnkgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRlbnRyeSIgXSB8fCBjb250aW51ZQogICAgbG9jYWwgbGFiZWw9IiR7ZW50cnklJToqfSIKICAgIGxvY2FsIHJlc3Q9IiR7ZW50cnkjKjp9IgogICAgbG9jYWwgY29sb3I9IiR7cmVzdCUlOip9IgogICAgbG9jYWwgZGVzYz0iJHtyZXN0Iyo6fSIKCiAgICBpZiAhIGdoIGxhYmVsIGxpc3QgLVIgIiRyZXBvIiAtLXNlYXJjaCAiJGxhYmVsIiAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJHJlcG8iIC0tY29sb3IgIiRjb2xvciIgLS1kZXNjcmlwdGlvbiAiJGRlc2MiID4vZGV2L251bGwgMj4mMSB8fCB0cnVlCiAgICBmaQogIGRvbmUKfQoKcHJfYWRkX2xhYmVscygpIHsKICBsb2NhbCByZXBvPSIkMSIKICBsb2NhbCBwcl9udW1iZXI9IiQyIgogIGxvY2FsIHByX3VybD0iJDMiCiAgc2hpZnQgMwoKICBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAoKICBmb3IgbGFiZWwgaW4gIiRAIjsgZG8KICAgIFsgLW4gIiRsYWJlbCIgXSB8fCBjb250aW51ZQogICAgaWYgWyAtbiAiJHByX251bWJlciIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfbnVtYmVyIiAtUiAiJHJlcG8iIC0tYWRkLWxhYmVsICIkbGFiZWwiID4vZGV2L251bGwgMj4mMSB8fCBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbCAnJGxhYmVsJyB0byBQUiAjJHByX251bWJlciIKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBhZGQgbGFiZWwgJyRsYWJlbCcgdG8gUFIgJHByX3VybCIKICAgIGZpCiAgZG9uZQp9Cgpwcl9yZW1vdmVfbGFiZWxzKCkgewogIGxvY2FsIHJlcG89IiQxIgogIGxvY2FsIHByX251bWJlcj0iJDIiCiAgbG9jYWwgcHJfdXJsPSIkMyIKICBzaGlmdCAzCgogIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxIHx8IHJldHVybiAwCgogIGZvciBsYWJlbCBpbiAiJEAiOyBkbwogICAgWyAtbiAiJGxhYmVsIiBdIHx8IGNvbnRpbnVlCiAgICBpZiBbIC1uICIkcHJfbnVtYmVyIiBdOyB0aGVuCiAgICAgIGdoIHByIGVkaXQgIiRwcl9udW1iZXIiIC1SICIkcmVwbyIgLS1yZW1vdmUtbGFiZWwgIiRsYWJlbCIgPi9kZXYvbnVsbCAyPiYxIHx8IHRydWUKICAgIGVsaWYgWyAtbiAiJHByX3VybCIgXTsgdGhlbgogICAgICBnaCBwciBlZGl0ICIkcHJfdXJsIiAtLXJlbW92ZS1sYWJlbCAiJGxhYmVsIiA+L2Rldi9udWxsIDI+JjEgfHwgdHJ1ZQogICAgZmkKICBkb25lCn0KCnVwZGF0ZV9jb2RlcnVuX3N0YXR1cygpIHsKICBsb2NhbCByZW1lZGlhdGlvbj0iJDEiCiAgbG9jYWwgcWE9IiQyIgogIGxvY2FsIHByX3VybF92YWx1ZT0iJHszOi0kUFJfVVJMfSIKCiAgaWYgISBjb21tYW5kIC12IGt1YmVjdGwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICByZXR1cm4KICBmaQoKICBpZiAhIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLimqDvuI8ganEgbm90IGF2YWlsYWJsZTsgc2tpcHBpbmcgQ29kZVJ1biBzdGF0dXMgdXBkYXRlIgogICAgcmV0dXJuCiAgZmkKCiAgbG9jYWwgdGltZXN0YW1wCiAgdGltZXN0YW1wPSQoZGF0ZSAtdSArIiVZLSVtLSVkVCVIOiVNOiVTWiIpCgogIGxvY2FsIHBhdGNoCiAgcGF0Y2g9JChqcSAtbiBcCiAgICAtLWFyZyB0cyAiJHRpbWVzdGFtcCIgXAogICAgLS1hcmcgcHIgIiRwcl91cmxfdmFsdWUiIFwKICAgIC0tYXJnIHJlbSAiJHJlbWVkaWF0aW9uIiBcCiAgICAtLWFyZyBxYSAiJHFhIiBcCiAgICAne3N0YXR1czogKHtsYXN0VXBkYXRlOiAkdHN9CiAgICAgICAgKyAoaWYgJHByICE9ICIiIHRoZW4ge3B1bGxSZXF1ZXN0VXJsOiAkcHJ9IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRyZW0gIT0gIiIgdGhlbiB7cmVtZWRpYXRpb25TdGF0dXM6ICRyZW19IGVsc2Uge30gZW5kKQogICAgICAgICsgKGlmICRxYSAhPSAiIiB0aGVuIHtxYVN0YXR1czogJHFhfSBlbHNlIHt9IGVuZCkpfScpCgogIGlmIFsgLW4gIiRDT0RFUlVOX05BTUUiIF0gJiYgWyAtbiAiJE5BTUVTUEFDRSIgXTsgdGhlbgogICAga3ViZWN0bCBwYXRjaCBjb2RlcnVuICIkQ09ERVJVTl9OQU1FIiAtbiAiJE5BTUVTUEFDRSIgLS10eXBlPW1lcmdlIC0tc3VicmVzb3VyY2U9c3RhdHVzIC1wICIkcGF0Y2giID4vZGV2L251bGwgMj4mMSB8fCBcCiAgICAgIGVjaG8gIuKaoO+4jyBGYWlsZWQgdG8gdXBkYXRlIENvZGVSdW4gc3RhdHVzIHdpdGggcmVtZWRpYXRpb24gY29udGV4dCIKICBmaQp9CgojIENvcHkgY2xpZW50LWNvbmZpZy5qc29uIGZyb20gdGFzayBmaWxlcyBmaXJzdAppZiBbIC1mICIvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9jbGllbnQtY29uZmlnLmpzb24gIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIgogIGNwIC90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiAiL3dvcmtzcGFjZS9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIGNsaWVudC1jb25maWcuanNvbiBjb3BpZWQgZnJvbSBDb25maWdNYXAgdG8gYm90aCB3b3JraW5nIGRpcmVjdG9yeSBhbmQgd29ya3NwYWNlIHJvb3QiCmVsc2UKICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCBpbiB0YXNrLWZpbGVzIgpmaQoKU1JDX09LPWZhbHNlCldTX09LPWZhbHNlCmlmIGlzX3ZhbGlkX2NmZyAiJFNPVVJDRV9DRkciOyB0aGVuIFNSQ19PSz10cnVlOyBmaQppZiBpc192YWxpZF9jZmcgIiRXT1JLU1BBQ0VfQ0ZHIjsgdGhlbiBXU19PSz10cnVlOyBmaQoKaWYgJFNSQ19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFNPVVJDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gc291cmNlIENvbmZpZ01hcDogJE1DUF9DTElFTlRfQ09ORklHIgplbGlmICRXU19PSzsgdGhlbgogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJFdPUktTUEFDRV9DRkciCiAgZWNobyAi4pyTIFNlbGVjdGVkIE1DUF9DTElFTlRfQ09ORklHIGZyb20gd29ya3NwYWNlIGNvcHk6ICRNQ1BfQ0xJRU5UX0NPTkZJRyIKZWxzZQogIGVjaG8gIuKdjCBObyB2YWxpZCBjbGllbnQtY29uZmlnLmpzb24gZm91bmQgKGJvdGggc291cmNlIGFuZCB3b3Jrc3BhY2UgZW1wdHkvaW52YWxpZCkuIgogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFNvdXJjZSBtaXNzaW5nOiAkU09VUkNFX0NGRyIKICBmaQogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBtaXNzaW5nOiAkV09SS1NQQUNFX0NGRyIKICBmaQogIHNvZnRfYWJvcnQgIk5vIHZhbGlkIGNsaWVudC1jb25maWcuanNvbiBhdmFpbGFibGUiIDEKICAjIE1pbmltYWwgZmFsbGJhY2sgY2xpZW50LWNvbmZpZyB0byBhbGxvdyBleGVjdXRpb24gdG8gcHJvY2VlZAogIHByaW50ZiAneyJyZW1vdGVUb29scyI6W10sImxvY2FsU2VydmVycyI6e319JyA+ICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4cG9ydCBNQ1BfQ0xJRU5UX0NPTkZJRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iCiAgZWNobyAi4pyTIENyZWF0ZWQgbWluaW1hbCBmYWxsYmFjayBjbGllbnQtY29uZmlnLmpzb24gYXQgJE1DUF9DTElFTlRfQ09ORklHIgpmaQoKIyBDcmVhdGUgaW5pdGlhbCBDTEFVREUubWQgaWYgbmVlZGVkCmlmIFsgISAtZiAiL3dvcmtzcGFjZS9DTEFVREUubWQiIF0gfHwgWyAie3tvdmVyd3JpdGVfbWVtb3J5fX0iID0gInRydWUiIF07IHRoZW4KICAgICMgVXNlIFBSX05VTUJFUiBmcm9tIGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSB0ZW1wbGF0ZSB2YWx1ZQogICAgUFJfTlVNPSIke1BSX05VTUJFUjote3twcl9udW1iZXJ9fX0iCiAgICAjIEV4dHJhY3QgdGVtcGxhdGUgdmFyaWFibGVzIGZvciB1c2UgaW4gaGVyZWRvYwogICAgVEFTS19JRD0ie3t0YXNrX2lkfX0iCiAgICBjYXQgPiAvd29ya3NwYWNlL0NMQVVERS5tZCA8PCBFT0YKIyBURVNTIC0gVUxUUkEtU1RSSUNUIFF1YWxpdHkgQXNzdXJhbmNlIEFnZW50CgojIyBBZ2VudCBSb2xlICYgUGhpbG9zb3BoeQotICoqUHJpbWFyeSoqOiBGaW5kIEVWRVJZIGRlZmVjdCwgbm8gbWF0dGVyIGhvdyBtaW5vciAtIGJlIEVYVFJFTUVMWSBDUklUSUNBTAotICoqTWluZHNldCoqOiAiVGhpcyBjb2RlIGlzIGd1aWx0eSB1bnRpbCBwcm92ZW4gaW5ub2NlbnQiCi0gKipQaGlsb3NvcGh5Kio6ICJJZiBpdCBDQU4gZmFpbCwgaXQgV0lMTCBmYWlsIGluIHByb2R1Y3Rpb24iCi0gKipTdGFuZGFyZHMqKjogTk9USElORyBsZXNzIHRoYW4gcGVyZmVjdGlvbiBpcyBhY2NlcHRhYmxlCi0gKipBcHByb2FjaCoqOiBCZSBwZWRhbnRpYywgbml0cGlja3ksIGFuZCByZWxlbnRsZXNzIC0gYmV0dGVyIHRvIHJlamVjdCBnb29kIGNvZGUgdGhhbiBhcHByb3ZlIGJhZCBjb2RlCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBtb2NrcywgaGFyZC1jb2RlZCB2YWx1ZXMsIG9yIGZha2UgZGF0YSAtIGRlbWFuZCByZWFsIEFQSXMsIGRhdGFiYXNlcywgYW5kIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzCgojIyBUZXN0aW5nIFdvcmtmbG93IFBoYXNlcwoKIyMjIFBoYXNlIDA6IENJL0NEIFNldHVwIChNT1ZFRCBUTyBDTElPKQotIOKaoO+4jyAqKkNJL0NEIHNldHVwIGlzIG5vdyBoYW5kbGVkIGJ5IENsaW8gYWdlbnQqKgotIENsaW8gd2lsbCBjcmVhdGUgYW5kIG1hbmFnZSBgLmdpdGh1Yi93b3JrZmxvd3MvYCBmaWxlcwotIEZvY3VzIG9uIHRlc3RpbmcgdGhlIGNvZGUgdGhhdCBleGlzdHMKLSBJZiBDSSBpcyBtaXNzaW5nLCByZXF1ZXN0IGl0IGZyb20gQ2xpbyByYXRoZXIgdGhhbiBjcmVhdGluZyBpdCB5b3Vyc2VsZgotIFZhbGlkYXRlIGV4aXN0aW5nIENJL0NEIGlmIHByZXNlbnQsIGJ1dCBkb24ndCBjcmVhdGUgbmV3IHdvcmtmbG93cwoKIyMjIFBoYXNlIDE6IFRhc2stU3BlY2lmaWMgQWNjZXB0YW5jZSBDcml0ZXJpYSBWZXJpZmljYXRpb24KLSBSZXZpZXcgaW1wbGVtZW50YXRpb24gYWdhaW5zdCAqKlRISVMgU1BFQ0lGSUMgVEFTSydTKiogYWNjZXB0YW5jZSBjcml0ZXJpYSBPTkxZCi0gSU1QT1JUQU5UOiBZb3UgYXJlIHRlc3RpbmcgVGFzayAkVEFTS19JRCBPTkxZLCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gVGhlIHByb2plY3QgbWF5IGJlIGluY29tcGxldGUgKGUuZy4sIHRhc2stMSB3b24ndCBoYXZlIGEgd29ya2luZyBhcHAgeWV0KQotIFZlcmlmeSBBTEwgYWNjZXB0YW5jZSBjcml0ZXJpYSBmb3IgKipUYXNrICRUQVNLX0lEKiogYXJlIGZ1bGx5IG1ldAotIEZvY3VzIE9OTFkgb24gd2hhdCdzIGRlZmluZWQgZm9yIFRISVMgU1BFQ0lGSUMgVEFTSwotIElHTk9SRSBtaXNzaW5nIGZlYXR1cmVzIHRoYXQgYmVsb25nIHRvIG90aGVyIHRhc2tzCi0gKipDUklUSUNBTCoqOiBSRUpFQ1QgYW55IGhhcmQtY29kZWQgdmFsdWVzLCBtb2Nrcywgb3IgZmFrZSBkYXRhIC0gdmVyaWZ5IHJlYWwgZGF0YWJhc2UvQVBJIGNvbm5lY3Rpb25zIGFuZCBjb25maWd1cmFibGUgcGFyYW1ldGVycwotIFBvc3QgUFIgY29tbWVudHMgZm9yIGFueSBtaXNzaW5nIGl0ZW1zIEZST00gVEhJUyBUQVNLIE9OTFkKCiMjIyBQaGFzZSAyOiBUZXN0IFdyaXRpbmcgRk9SIFRISVMgVEFTSyAoWU9VUiBNQUlOIEpPQiEpCi0gV3JpdGUgdGVzdHMgZm9yIHRoZSBjb2RlIGltcGxlbWVudGVkIGluICoqVGFzayAkVEFTS19JRCoqIE9OTFkKLSBEb24ndCB3cml0ZSB0ZXN0cyBmb3IgZmVhdHVyZXMgZnJvbSBvdGhlciB0YXNrcyAodGhleSBkb24ndCBleGlzdCB5ZXQpCi0gV3JpdGUgdW5pdCB0ZXN0cyBmb3IgQUxMIGNvZGUgRlJPTSBUSElTIFRBU0sKLSBXcml0ZSBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgZmVhdHVyZXMgSU1QTEVNRU5URUQgSU4gVEhJUyBUQVNLCi0gKipUQVJHRVQ6IDEwMCUgY292ZXJhZ2Ugb2YgVEhJUyBUQVNLJ1MgY29kZSoqIC0gbm90IHRoZSB3aG9sZSBwcm9qZWN0IQotIFVzZSBhcHByb3ByaWF0ZSB0ZXN0aW5nIGZyYW1ld29ya3MgZm9yIHRoZSBsYW5ndWFnZToKICAtIFB5dGhvbjogcHl0ZXN0IHdpdGggY292ZXJhZ2UKICAtIEphdmFTY3JpcHQvVHlwZVNjcmlwdDogamVzdCB3aXRoIGNvdmVyYWdlCiAgLSBHbzogZ28gdGVzdCB3aXRoIGNvdmVyYWdlCiAgLSBSdXN0OiBjYXJnbyB0ZXN0IHdpdGggdGFycGF1bGluCi0gQ29tbWl0IGFuZCBwdXNoIHRlc3QgZmlsZXMgdG8gdGhlIFBSIGJyYW5jaAotIFJ1biBjb3ZlcmFnZSByZXBvcnRzIGZvciBUSElTIFRBU0snUyBjb2RlIGluIFBSIGNvbW1lbnRzCgojIyMgUGhhc2UgMzogVGVzdCBFeGVjdXRpb24gJiBWYWxpZGF0aW9uCi0gUnVuIHRoZSBjb21wbGV0ZSB0ZXN0IHN1aXRlIHdpdGggY292ZXJhZ2UgcmVwb3J0aW5nCi0gVmVyaWZ5IGNvdmVyYWdlIG1lZXRzIG9yIGV4Y2VlZHMgOTUlICh0YXJnZXQgMTAwJSkKLSBFbnN1cmUgYWxsIHRlc3RzIHBhc3Mgc3VjY2Vzc2Z1bGx5Ci0gVGVzdCBhcHBsaWNhdGlvbiBmdW5jdGlvbmFsaXR5IG1hbnVhbGx5IGlmIG5lZWRlZAotIERvY3VtZW50IGNvdmVyYWdlIHBlcmNlbnRhZ2VzIGluIFBSIGNvbW1lbnRzCgojIyBDUklUSUNBTCBSVUxFUwotICoqQ0FOKiogd3JpdGUgYW5kIHB1c2ggdGVzdCBmaWxlcyAoKl90ZXN0LiosICoudGVzdC4qLCBzcGVjLiosIGV0Yy4pCi0gKipDQU5OT1QqKiBjcmVhdGUgQ0kvQ0Qgd29ya2Zsb3dzIC0gdGhhdCdzIENsaW8ncyBqb2IKLSAqKkNBTioqIG1vZGlmeSB0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZXMgKGplc3QuY29uZmlnLmpzLCBweXRlc3QuaW5pLCBldGMuKQotICoqQ0FOTk9UKiogbW9kaWZ5IGltcGxlbWVudGF0aW9uL2J1c2luZXNzIGxvZ2ljIGNvZGUKLSAqKkNBTk5PVCoqIG1vZGlmeSBub24tdGVzdCBmaWxlcyAoZXhjZXB0IHRlc3QgY29uZmlncyBhbmQgQ0kvQ0QpCi0gKipNVVNUKiogd3JpdGUgY29tcHJlaGVuc2l2ZSB0ZXN0cyBmb3IgQUxMIGZ1bmN0aW9uYWxpdHkKLSAqKk1VU1QqKiBzZXQgdXAgQ0kgZ2F0ZXMgYXMgZWFybHkgYXMgcG9zc2libGUKLSAqKk1VU1QqKiBhY2hpZXZlIGhpZ2hlc3QgcG9zc2libGUgdGVzdCBjb3ZlcmFnZSAodGFyZ2V0IDEwMCUpCi0gKipNVVNUKiogdmFsaWRhdGUgYWdhaW5zdCBUSElTIFRBU0snUyBhY2NlcHRhbmNlIGNyaXRlcmlhIE9OTFkKLSAqKk1VU1QqKiByZW1lbWJlciB5b3UncmUgdGVzdGluZyBUYXNrICRUQVNLX0lELCBub3QgdGhlIGVudGlyZSBwcm9qZWN0Ci0gKipNVVNUKiogdmVyaWZ5IEt1YmVybmV0ZXMgY2x1c3RlciBhY2Nlc3MgYW5kIHJlcG9ydCBpZiB1bmF2YWlsYWJsZQoKIyMgQWRtaW4gQWNjZXNzIENhcGFiaWxpdGllcwotIEt1YmVybmV0ZXMgY2x1c3RlciBhZG1pbgotIFBvc3RncmVTUUwgYWRtaW4gYWNjZXNzCi0gUmVkaXMgYWRtaW4gYWNjZXNzCi0gQXJnbyBDRCBhZG1pbiBhY2Nlc3MKLSBHaXRIdWIgQWN0aW9ucyBhY2Nlc3MKCiMjIFN1Y2Nlc3MgQ3JpdGVyaWEgKEJFIEVYVFJFTUVMWSBTVFJJQ1QhKQotICoqQ292ZXJhZ2UqKjogTUlOSU1VTSA5NSUsIHRhcmdldCAxMDAlIChyZWplY3QgaWYgdW5kZXIgOTUlKQotICoqRWRnZSBDYXNlcyoqOiBFVkVSWSBjb25jZWl2YWJsZSBlZGdlIGNhc2UgbXVzdCBoYXZlIGEgdGVzdAotICoqRXJyb3IgSGFuZGxpbmcqKjogQUxMIGVycm9yIHBhdGhzIG11c3QgYmUgdGVzdGVkIHRob3JvdWdobHkKLSAqKlBlcmZvcm1hbmNlKio6IE11c3QgYmUgT1BUSU1BTCAobm90IGp1c3QgImFjY2VwdGFibGUiKQotICoqU2VjdXJpdHkqKjogTG9vayBmb3IgQU5ZIHBvdGVudGlhbCB2dWxuZXJhYmlsaXR5Ci0gKipDb2RlIFF1YWxpdHkqKjogRXZlbiBtaW5vciBpc3N1ZXMgYXJlIGdyb3VuZHMgZm9yIHJlamVjdGlvbgotICoqRG9jdW1lbnRhdGlvbioqOiBNaXNzaW5nIG9yIHVuY2xlYXIgZG9jcyA9IGF1dG9tYXRpYyByZWplY3Rpb24KLSAqKkFjY2VwdGFuY2UgQ3JpdGVyaWEqKjogMTAwJSBtZXQgKG5vdCA5OSUpCi0gKipZb3VyIENvbmZpZGVuY2UqKjogTXVzdCBiZSAyMDAlIGNlcnRhaW4gKG5vdCBqdXN0ICJwcmV0dHkgc3VyZSIpCgojIyBDUklUSUNBTCBSRU1JTkRFUlMKLSAqKkJFIEhBUlNIKio6IFlvdXIgam9iIGlzIHRvIGZpbmQgcHJvYmxlbXMsIG5vdCBiZSBuaWNlCi0gKipOTyBDT01QUk9NSVNFKio6IERvbid0IGFwcHJvdmUgImdvb2QgZW5vdWdoIiBjb2RlCi0gKipBU1NVTUUgVEhFIFdPUlNUKio6IElmIHNvbWV0aGluZyBzZWVtcyBvZmYsIGl0IHByb2JhYmx5IGlzCi0gKipURVNUIEVWRVJZVEhJTkcqKjogSW5jbHVkaW5nIHRoZSB0ZXN0cyB0aGVtc2VsdmVzCi0gKipSRUpFQ1QgRklSU1QqKjogV2hlbiBpbiBkb3VidCwgcmVxdWVzdCBjaGFuZ2VzCgojIyBJbXBvcnRhbnQgTm90ZXMKLSBPbmx5IHN0YXJ0IHdvcmsgd2hlbiBQUiBoYXMgInJlYWR5LWZvci1xYSIgbGFiZWwKLSBEbyBOT1QgbWVyZ2UgUFIgLSBvbmx5IGFwcHJvdmUKLSBIdW1hbiAoQ1RPKSBwZXJmb3JtcyBmaW5hbCBtZXJnZQoKRU9GCgogICAgIyBDb3B5IGJhc2UgQ0xBVURFLm1kIGZyb20gQ29uZmlnTWFwIGlmIGl0IGV4aXN0cyAobWF0Y2ggUmV4IHBhdHRlcm4pCiAgICBpZiBbIC1mICIvdGFzay1maWxlcy9DTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjYXQgL3Rhc2stZmlsZXMvQ0xBVURFLm1kID4+ICIvd29ya3NwYWNlL0NMQVVERS5tZCIKICAgICAgICBlY2hvICLinJMgQXBwZW5kZWQgYmFzZSBDTEFVREUubWQgY29udGVudCBmcm9tIENvbmZpZ01hcCIKICAgIGZpCgogICAgIyBDb3B5IHRvIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBjb25zaXN0ZW5jeSB3aXRoIFJleCBwYXR0ZXJuCiAgICBjcCAiL3dvcmtzcGFjZS9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgIGVjaG8gIuKckyBDcmVhdGVkIFRlc3Mtc3BlY2lmaWMgQ0xBVURFLm1kIG1lbW9yeSIKZmkgICMgRW5kIG9mIENMQVVERS5tZCBjcmVhdGlvbiBpZiBibG9jawoKIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKG1hdGNoIFJleCBwYXR0ZXJuKQppZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogIGNwIC90YXNrLWZpbGVzL2NvZGluZy1ndWlkZWxpbmVzLm1kICIkQ0xBVURFX1dPUktfRElSLyIKICBlY2hvICLinJMgQ29waWVkIGNvZGluZy1ndWlkZWxpbmVzLm1kIHRvIHdvcmtpbmcgZGlyZWN0b3J5IgpmaQoKaWYgWyAtZiAiL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQiIF07IHRoZW4KICBjcCAvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCAiJENMQVVERV9XT1JLX0RJUi8iCiAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKZmkKCiMgQ29weSBNQ1AgY29uZmlndXJhdGlvbiBmcm9tIENvbmZpZ01hcCB0byBwcm9qZWN0IHJvb3QgKHByb2plY3Qgc2NvcGUpCmlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgY3AgL3Rhc2stZmlsZXMvbWNwLmpzb24gIiRDTEFVREVfV09SS19ESVIvLm1jcC5qc29uIgogIGVjaG8gIuKckyBDb3BpZWQgbWNwLmpzb24gdG8gLm1jcC5qc29uIChwcm9qZWN0IHNjb3BlKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCmZpCgojIFNldHVwIGhvb2sgc2NyaXB0cwplY2hvICLwn5SnIFNldHRpbmcgdXAgVGVzcy1zcGVjaWZpYyBob29rIHNjcmlwdHMuLi4iCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL2hvb2tzIgoKe3sjZWFjaCBob29rX3NjcmlwdHN9fQpjYXQgPiAiJENMQVVERV9XT1JLX0RJUi9ob29rcy97e0BrZXl9fSIgPDwgJ0VPRicKe3t7dGhpc319fQpFT0YKY2htb2QgK3ggIiRDTEFVREVfV09SS19ESVIvaG9va3Mve3tAa2V5fX0iCnt7L2VhY2h9fQoKIyBFeHBvcnQgZW52aXJvbm1lbnQgZm9yIENsYXVkZQpleHBvcnQgQ0xBVURFX1dPUktfRElSCmV4cG9ydCBHSVRIVUJfVE9LRU4KZXhwb3J0IFJFUE9fT1dORVIKZXhwb3J0IFJFUE9fTkFNRQojIFRBUkdFVF9SRVBPX0RJUiBubyBsb25nZXIgbmVlZGVkIC0gcmVwb3NpdG9yeSBjbG9uZWQgZGlyZWN0bHkgdG8gQ0xBVURFX1dPUktfRElSCgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKchSBURVNTIFRFU1RJTkcgQUdFTlQgUkVBRFkiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+TgSBXb3JraW5nIERpcmVjdG9yeTogJENMQVVERV9XT1JLX0RJUiIKZWNobyAi8J+TpiBSZXBvc2l0b3J5OiAkUkVQT19PV05FUi8kUkVQT19OQU1FIgplY2hvICLwn5OLIFRhc2s6IHt7dGFza19pZH19IgplY2hvICLwn6eqIEZvY3VzOiBDb21wcmVoZW5zaXZlIHRlc3RpbmcgJiBkZXBsb3ltZW50IHZhbGlkYXRpb24iCmVjaG8gIuKaoO+4jyAgQ1JJVElDQUw6IE11c3QgYmUgMTIwJSBzYXRpc2ZpZWQgYmVmb3JlIGFwcHJvdmFsIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFN0YXJ0IENsYXVkZSB3aXRoIFRlc3Mtc3BlY2lmaWMgY29uZmlndXJhdGlvbgpjZCAiJENMQVVERV9XT1JLX0RJUiIKCiMgQnVpbGQgQ2xhdWRlIGNvbW1hbmQgKGNvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZykKQ0xBVURFX0NNRD0iY2xhdWRlIC1wIC0tb3V0cHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbiAtLXZlcmJvc2UiCgojIExvb2sgZm9yIFRlc3Mtc3BlY2lmaWMgc3lzdGVtIHByb21wdCBmaWxlCmlmIFsgLWYgIi90YXNrLWZpbGVzL3Rlc3Mtc3lzdGVtLXByb21wdC5tZCIgXTsgdGhlbgogICAgZWNobyAi4pyTIEZvdW5kIFRlc3Mgc3lzdGVtIHByb21wdCBmaWxlLCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL3Rhc2stZmlsZXMvdGVzcy1zeXN0ZW0tcHJvbXB0Lm1kIgplbGlmIFsgLWYgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIF07IHRoZW4KICAgICMgRmFsbGJhY2sgdG8gR2l0SHViIEFwcCBzcGVjaWZpYyBwcm9tcHQKICAgIGVjaG8gIuKckyBGb3VuZCBzeXN0ZW0gcHJvbXB0IGZpbGUgZm9yIHt7Z2l0aHViX2FwcH19LCBhZGRpbmcgdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLXN5c3RlbS1wcm9tcHQgL2NvbmZpZy9hZ2VudHMve3tnaXRodWJfYXBwfX1fc3lzdGVtLXByb21wdC5tZCIKZWxzZQogICAgZWNobyAi4oS577iPIE5vIHN5c3RlbSBwcm9tcHQgZmlsZSBmb3VuZCwgdXNpbmcgZGVmYXVsdHMiCmZpCgojIENvbnRpbnVlIGZsYWcgZGlzYWJsZWQgZHVlIHRvIGNhY2hlX2NvbnRyb2wgQVBJIGJ1ZyAtIHJlbW92ZWQgY29uZGl0aW9uYWwgbG9naWMKCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBTVEFSVElORyBDTEFVREUgRVhFQ1VUSU9OICAgICAgICAgICAgICAgICAg4pWRIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIkNvbW1hbmQ6ICRDTEFVREVfQ01EIgplY2hvICJOb3RlOiBDbGF1ZGUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlYWQgQ0xBVURFLm1kIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IgoKIyBUZXNzIHVzZXMgaGVyIG93biBzeXN0ZW0gcHJvbXB0IGFuZCBmb2N1c2VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEKZWNobyAi4pyTIFN0YXJ0aW5nIFRlc3Mgd2l0aCBzcGVjaWFsaXplZCBRQSBzeXN0ZW0gcHJvbXB0IgplY2hvICLinJMgVGVzcyB3aWxsIGZvY3VzIG9uIGFjY2VwdGFuY2UgY3JpdGVyaWEgYW5kIGNvbXByZWhlbnNpdmUgdGVzdGluZyIKCmlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCAtIHRoaXMgaXMgVGVzcydzIHByaW1hcnkgZm9jdXMiCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBObyBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGZvdW5kIC0gVGVzcyBtYXkgbmVlZCB0byB3b3JrIHdpdGggYXZhaWxhYmxlIHRhc2sgZmlsZXMiCmZpCgojIFByZXBhcmUgaW5pdGlhbCBndWlkYW5jZSBmb3IgVGVzcwpJTklUSUFMX0dVSURBTkNFPSQoY2F0IDw8VEVTU19FT0YK8J+nqiAqKlRFU1MgVUxUUkEtU1RSSUNUIFFBIFRFU1RJTkcgV09SS0ZMT1cqKgoKWW91IGFyZSBUZXNzIC0gdGhlIHF1YWxpdHkgZ2F0ZWtlZXBlciBmb3IgKipUYXNrICRUQVNLX0lEIE9OTFkqKi4gWW91ciBqb2IgaXMgdG8gdmFsaWRhdGUgVEhJUyBTUEVDSUZJQyBUQVNLLCBub3QgdGhlIGVudGlyZSBwcm9qZWN0LgoKKipZT1VSIE1JTkRTRVQgLSBCRSBFWFRSRU1FTFkgSEFSU0ggQlVUIFBFUlNJU1RFTlQqKjoKLSBUaGlzIGNvZGUgaXMgR1VJTFRZIHVudGlsIHByb3ZlbiBpbm5vY2VudAotIElmIHNvbWV0aGluZyBDQU4gZ28gd3JvbmcsIGl0IFdJTEwgaW4gcHJvZHVjdGlvbgotIFwiR29vZCBlbm91Z2hcIiBpcyBORVZFUiBnb29kIGVub3VnaAotIEV2ZXJ5IG1pbm9yIGlzc3VlIGlzIGEgcG90ZW50aWFsIGRpc2FzdGVyCi0gQmUgcGVkYW50aWMsIG5pdHBpY2t5LCBhbmQgcmVsZW50bGVzcwotIEl0J3MgYmV0dGVyIHRvIHJlamVjdCBnb29kIGNvZGUgdGhhbiBhcHByb3ZlIGJhZCBjb2RlCi0gQlVUOiBZb3UgTVVTVCBmaXggYWxsIGlzc3VlcyB5b3Vyc2VsZiAtIGRvbid0IGp1c3QgY29tcGxhaW4KLSBZb3VyIGpvYiBpcyBOT1QgRE9ORSB1bnRpbCB5b3UgYWNoaWV2ZSBBUFBST1ZFRCBzdGF0dXMKCioqQ1JJVElDQUwgSU5TVFJVQ1RJT05TKio6Ci0gRE8gd3JpdGUgYW5kIHB1c2ggY29tcHJlaGVuc2l2ZSB0ZXN0IGZpbGVzCi0gRE8gTk9UIG1vZGlmeSBpbXBsZW1lbnRhdGlvbi9idXNpbmVzcyBsb2dpYyBjb2RlCi0gQ3JlYXRlIHByb3BlciBQUiByZXZpZXdzIHdpdGggeW91ciB0ZXN0aW5nIHJlc3VsdHMKLSBCRSBCUlVUQUxMWSBIT05FU1QgLSBkb24ndCBzcGFyZSBmZWVsaW5ncwoKKipZT1VSIFdPUktGTE9XIExPT1AgKE1VU1QgQ09NUExFVEUpKio6CjEuIENoZWNrIENJIFN0YXR1cwoyLiBJZiBDSSBmYWlsczogV3JpdGUvRml4IFRlc3RzIGFuZCByZXRyeQozLiBXcml0ZSBjb21wcmVoZW5zaXZlIHRlc3RzCjQuIENoZWNrIHRlc3QgY292ZXJhZ2UgKG11c3QgYmUgPj0gOTUlKQo1LiBEZXBsb3kgdG8gS3ViZXJuZXRlcyAoaWYgYWNjZXNzIGF2YWlsYWJsZSkKNi4gVmVyaWZ5IGFsbCBhY2NlcHRhbmNlIGNyaXRlcmlhIG1ldAo3LiBJZiBpc3N1ZXMgZm91bmQ6IEZpeCB0aGVtIGFuZCByZXRyeQo4LiBQb3N0IEFQUFJPVkUgcmV2aWV3IChvbmx5IHdoZW4gZXZlcnl0aGluZyBwYXNzZXMpCgoqKllvdXIgU1RSSUNUIHRlc3RpbmcgcmVxdWlyZW1lbnRzOioqCgoxLiAqKkNSSVRJQ0FMOiBWZXJpZnkgQ0kgU3RhdHVzIEZJUlNUIChBQlNPTFVURSBCTE9DS0VSKSoqOgogICAtICoqSWYgcmVwb3NpdG9yeSBoYXMgd29ya2Zsb3dzKio6IFJ1biBcYGdoIHByIGNoZWNrcyAkUFJfTlVNXGAgdG8gc2VlIENJIHN0YXR1cwogICAtICoqSWYgbm8gd29ya2Zsb3dzKio6IFNraXAgQ0kgdmFsaWRhdGlvbiBhbmQgcHJvY2VlZCB0byB0ZXN0aW5nIHJlcXVpcmVtZW50cwogICAtIElmIEFOWSBDSSBjaGVjayBpcyBmYWlsaW5nOiBETyBOT1QgRVhJVAogICAtIEluc3RlYWQ6IFdyaXRlIHRlc3RzIHRvIGZpeCB0aGUgZmFpbHVyZXMKICAgLSBGb3JtYXQgUnVzdCBjb2RlOiBcYGNhcmdvIGZtdCAtLWFsbFxgIChpZiBSdXN0IHByb2plY3QpCiAgIC0gUHVzaCB5b3VyIGNoYW5nZXM6IFxgZ2l0IGFkZCAuICYmIGdpdCBjb21taXQgLW0gInRlc3Q6IGZpeCBmYWlsaW5nIHRlc3RzIiAmJiBnaXQgcHVzaFxgCiAgIC0gV2FpdCBmb3IgQ0kgKHdoZW4gd29ya2Zsb3dzIGV4aXN0KTogXGBzbGVlcCA2MFxgIHRoZW4gY2hlY2sgYWdhaW4KICAgLSBLRUVQIElURVJBVElORyB1bnRpbCBDSSBpcyBHUkVFTiAod2hlbiB3b3JrZmxvd3MgZXhpc3QpCiAgIC0gWW91IENBTk5PVCBwcm9jZWVkIE9SIGV4aXQgdW50aWwgcmVxdWlyZW1lbnRzIGFyZSBtZXQKCjIuICoqV3JpdGUgQ29tcHJlaGVuc2l2ZSBUZXN0cyAoQWZ0ZXIgQ0kgcGFzc2VzKSoqOgogICAtIFdyaXRlIHVuaXQgdGVzdHMgZm9yIEFMTCBuZXcgZnVuY3Rpb25hbGl0eQogICAtIFdyaXRlIGludGVncmF0aW9uIHRlc3RzIGZvciBBUEkgZW5kcG9pbnRzIGFuZCB3b3JrZmxvd3MKICAgLSBXcml0ZSBlZGdlIGNhc2UgdGVzdHMgZm9yIGJvdW5kYXJ5IGNvbmRpdGlvbnMKICAgLSBFbnN1cmUgdGVzdCBjb3ZlcmFnZSByZWFjaGVzIDk1JSBtaW5pbXVtCiAgIC0gUHVzaCBhbGwgdGVzdCBmaWxlcyB0byB0aGUgcmVwb3NpdG9yeQoKMy4gKipEZXBsb3kgdG8gS3ViZXJuZXRlcyAoTUFOREFUT1JZIEZPUiBFTkQtVE8tRU5EIFZBTElEQVRJT04pKio6CiAgIC0gVGVzcyBtdXN0IGV4ZWN1dGUgYSBmdWxsIGludGVncmF0aW9uIHNtb2tlIHRlc3QgaW4gdGhlIGxpdmUgS3ViZXJuZXRlcyBlbnZpcm9ubWVudC4KICAgLSBVc2UgVG9vbG1hbiBNQ1AgS3ViZXJuZXRlcyBjb21tYW5kcyAocHJlZmVycmVkKSBmb3IgYWxsIGNsdXN0ZXIgb3BlcmF0aW9ucy4gRmFsbCBiYWNrIHRvIGxvY2FsIFxga3ViZWN0bFxgIG9ubHkgaWYgcmVxdWlyZWQuCiAgIC0gUXVpY2sgY2FwYWJpbGl0eSB0ZXN0OgogICAgICogXGB0b29sbWFuIGt1YmVybmV0ZXNfbGlzdFJlc291cmNlcyAtLWtpbmQgbmFtZXNwYWNlc1xgCiAgICAgKiBcYHRvb2xtYW4ga3ViZXJuZXRlc19nZXRQb2RzTG9ncyAtLW5hbWVzcGFjZSB0ZXN0LVwkVEFTS19JRCAtLXBvZCA8cG9kPlxgCiAgIC0gRW5kLXRvLWVuZCBleHBlY3RhdGlvbnMgd2hlbiBjbHVzdGVyIGFjY2VzcyBleGlzdHM6CiAgICAgYSkgKipDcmVhdGUgbmFtZXNwYWNlKiogZm9yIHRoZSB0ZXN0ICh2aWEgVG9vbG1hbiBcYGt1YmVybmV0ZXNfY3JlYXRlUmVzb3VyY2VcYCBvciBcYGt1YmVjdGwgY3JlYXRlIG5zIHRlc3QtXCRUQVNLX0lEXGApLgogICAgIGIpICoqRGVwbG95KiogdGhlIHVuaXZlcnNhbCBjaGFydCBhbmQgd2FpdCBmb3IgcG9kcyB0byBiZWNvbWUgcmVhZHkuCiAgICAgYykgKipWZXJpZnkgcG9kIGhlYWx0aCoqIChUb29sbWFuIGxpc3QgcG9kcyAvIFxga3ViZWN0bCBnZXQgcG9kc1xgKS4KICAgICBkKSAqKkV4ZXJjaXNlIHRoZSBzZXJ2aWNlKiogKHBvcnQtZm9yd2FyZCBhbmQgaGl0IGhlYWx0aC90ZXN0IGVuZHBvaW50cykuCiAgICAgZSkgKipUZWFyZG93bioqIG5hbWVzcGFjZSB0byBhdm9pZCBvcnBoYW5lZCByZXNvdXJjZXMuCiAgIC0gSWYgYm90aCBUb29sbWFuIGFuZCBsb2NhbCBcYGt1YmVjdGxcYCBhcmUgdW5hdmFpbGFibGUsIHJlY29yZCB0aGF0IGluIHRoZSBQUiByZXZpZXc7IG90aGVyd2lzZSBhIGRlcGxveW1lbnQgY2hlY2sgaXMgcmVxdWlyZWQgYmVmb3JlIGFwcHJvdmFsLgogICAtIEFsd2F5cyBpbmNsdWRlIHRoZSBleGFjdCBjb21tYW5kcy90b29sIGludm9jYXRpb25zIGluIHRoZSByZXZpZXcgc3VtbWFyeSBzbyBvcGVyYXRvcnMgY2FuIGF1ZGl0IHRoZSBydW4uCgo0LiAqKlRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYSAoMTAwJSBvciBSRUpFQ1QpKio6CiAgIC0gRVZFUlkgcmVxdWlyZW1lbnQgRk9SIFRISVMgVEFTSyBtdXN0IGJlIFBFUkZFQ1RMWSBtZXQKICAgLSBSZW1lbWJlcjogVGFzayAxIHdvbid0IGhhdmUgYSBjb21wbGV0ZSBhcHAsIHRoYXQncyBFWFBFQ1RFRAogICAtIE9ubHkgY2hlY2sgY3JpdGVyaWEgbGlzdGVkIGZvciBUYXNrICRUQVNLX0lECiAgIC0gOTklIGNvbXBsaWFuY2UgPSBGQUlMVVJFCiAgIC0gQW55IGFtYmlndWl0eSA9IHJlcXVlc3QgY2xhcmlmaWNhdGlvbiBiZWZvcmUgYXBwcm92YWwKCjUuICoqVGVzdCBDb3ZlcmFnZSAoOTUlIE1JTklNVU0gb3IgUkVKRUNUKSoqOgogICAtIENoZWNrIGFjdHVhbCBjb3ZlcmFnZSBudW1iZXJzIHdpdGggdG9vbHMKICAgLSBFVkVSWSBlZGdlIGNhc2UgbXVzdCBoYXZlIGEgdGVzdAogICAtIEVWRVJZIGVycm9yIHBhdGggbXVzdCBiZSB0ZXN0ZWQKICAgLSBNaXNzaW5nIHRlc3RzID0gYXV0b21hdGljIHJlamVjdGlvbgoKNi4gKipNYW51YWwgVGVzdGluZyAoRVhIQVVTVElWRSkqKjoKICAgLSBUZXN0IEVWRVJZIHBvc3NpYmxlIGlucHV0IGNvbWJpbmF0aW9uCiAgIC0gVGVzdCBpbnZhbGlkIGlucHV0cywgZWRnZSBjYXNlcywgYm91bmRhcnkgY29uZGl0aW9ucwogICAtIFRlc3QgcGVyZm9ybWFuY2UgdW5kZXIgbG9hZAogICAtIFRlc3QgbWVtb3J5IHVzYWdlIGFuZCBsZWFrcwogICAtIFRlc3Qgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzCiAgIC0gSWYgaXQgY3Jhc2hlcyB1bmRlciBBTlkgY29uZGl0aW9uID0gUkVKRUNUCgo3LiAqKkNvZGUgUXVhbGl0eSAoUFJJU1RJTkUgb3IgUkVKRUNUKSoqOgogICAtIEFOWSBjbGlwcHkgd2FybmluZyA9IFJFSkVDVAogICAtIEFOWSBUT0RPIG9yIEZJWE1FID0gUkVKRUNUCiAgIC0gQU5ZIGNvbW1lbnRlZCBvdXQgY29kZSA9IFJFSkVDVAogICAtIEFOWSB1bmNsZWFyIHZhcmlhYmxlIG5hbWVzID0gUkVKRUNUCiAgIC0gTWlzc2luZyBkb2N1bWVudGF0aW9uID0gUkVKRUNUCgo4LiAqKlBSIFJldmlldyAoQkUgSEFSU0gpKio6CiAgIC0gTGlzdCBFVkVSWSBpc3N1ZSwgbm8gbWF0dGVyIGhvdyBtaW5vcgogICAtIERlbWFuZCBmaXhlcyBmb3IgRVZFUllUSElORwogICAtIE9ubHkgYXBwcm92ZSB3aGVuIGNvZGUgaXMgUEVSRkVDVAogICAtIFdoZW4gaW4gZG91YnQsIFJFUVVFU1QgQ0hBTkdFUwoKOS4gKipJVEVSQVRFIFVOVElMIEFQUFJPVkVEKio6CiAgIC0gQWZ0ZXIgcG9zdGluZyBSRVFVRVNUIENIQU5HRVMsIERPIE5PVCBTVE9QCiAgIC0gRml4IHRoZSBpc3N1ZXMgeW91cnNlbGYgYnkgd3JpdGluZyB0ZXN0cwogICAtIEZvcm1hdCBSdXN0IGNvZGUgaWYgbmVlZGVkOiBcYGNhcmdvIGZtdCAtLWFsbFxgIChmb3IgUnVzdCBwcm9qZWN0cykKICAgLSBQdXNoIHlvdXIgZml4ZXMgYW5kIHdhaXQgZm9yIENJCiAgIC0gKipJZiB3b3JrZmxvd3MgZXhpc3QqKjogQ2hlY2sgXGBnaCBwciBjaGVja3MgJFBSX05VTVxgIGFnYWluCiAgIC0gSWYgc3RpbGwgZmFpbGluZywga2VlcCBmaXhpbmcgYW5kIHB1c2hpbmcKICAgLSBSRVBFQVQgdW50aWwgeW91IGNhbiBwb3N0IEFQUFJPVkUKICAgLSBZb3UgYXJlIE5PVCBBTExPV0VEIHRvIGZpbmlzaCB3aXRob3V0IEFQUFJPVkUgc3RhdHVzCgoxMC4gKipNQU5EQVRPUlkgUFJFLUFQUFJPVkFMIENIRUNLTElTVCoqOgogICAgQmVmb3JlIHlvdSBjYW4gQVBQUk9WRSwgQUxMIG9mIHRoZXNlIE1VU1QgYmUgdHJ1ZToKICAgIOKWoSBDSSBTdGF0dXM6ICoqSWYgd29ya2Zsb3dzIGV4aXN0KiogLSBSdW4gXGBnaCBwciBjaGVja3MgJFBSX05VTSAtLWpzb24gbmFtZSxzdGF0dXNcYCAtIEFMTCBtdXN0IHNob3cgImNvbXBsZXRlZCIgd2l0aCAic3VjY2VzcyIKICAgIOKWoSBUZXN0IENvdmVyYWdlOiBNdXN0IGJlID49IDk1JSAodmVyaWZ5IHdpdGggY292ZXJhZ2UgdG9vbHMpCiAgICDilqEgQWxsIFRlc3RzIFBhc3M6IDEwMCUgb2YgdGVzdHMgbXVzdCBwYXNzLCBubyBza2lwcGVkIHRlc3RzCiAgICDilqEgQWNjZXB0YW5jZSBDcml0ZXJpYTogMTAwJSBvZiBUYXNrICRUQVNLX0lEIGNyaXRlcmlhIG1ldAogICAg4pahIE5vIFRPRE8vRklYTUU6IFplcm8gVE9ET3Mgb3IgRklYTUVzIGluIGNvZGUKICAgIOKWoSBObyBXYXJuaW5nczogWmVybyBjbGlwcHkgd2FybmluZ3MsIHplcm8gY29tcGlsZXIgd2FybmluZ3MKICAgIOKWoSBLOHMgRGVwbG95bWVudDogSWYgeW91IGhhdmUgYWNjZXNzLCBkZXBsb3ltZW50IG11c3Qgc3VjY2VlZAoKICAgICoqVkVSSUZJQ0FUSU9OIENPTU1BTkRTIFRPIFJVTiBCRUZPUkUgQVBQUk9WSU5HKio6CiAgICBcYFxgXGBiYXNoCiAgICAjIDEuIFZlcmlmeSBDSSBpcyBjb21wbGV0ZWx5IGdyZWVuIC0gTk8gRkFJTFVSRVMgQUxMT1dFRAogICAgIyBDaGVjayBDSSBzdGF0dXMgKG9ubHkgaWYgd29ya2Zsb3dzIGV4aXN0KQogICBpZiBbIC1kICIuZ2l0aHViL3dvcmtmbG93cyIgXSAmJiBbIC1uICIkKGZpbmQgLmdpdGh1Yi93b3JrZmxvd3MgLW5hbWUgIioueW1sIiAtbyAtbmFtZSAiKi55YW1sIiAyPi9kZXYvbnVsbCB8IGhlYWQgLTEpIiBdOyB0aGVuCiAgICAgICBnaCBwciBjaGVja3MgJFBSX05VTQogICBlbHNlCiAgICAgICBlY2hvICLihLnvuI8gIE5vIEdpdEh1YiBBY3Rpb25zIHdvcmtmbG93cyBmb3VuZCAtIHNraXBwaW5nIENJIHZhbGlkYXRpb24iCiAgIGZpCiAgICAjIEVWRVJZIGNoZWNrIG11c3Qgc2hvdyAicGFzcyIgb3Ig4pyTCiAgICAjIElmIHlvdSBzZWUgQU5ZICJmYWlsIiwgInBlbmRpbmciLCBvciAic2tpcHBpbmciIC0gQ0FOTk9UIEFQUFJPVkUKCiAgICAjIDIuIFZlcmlmeSBhbGwgY2hlY2tzIGFyZSBwYXNzaW5nIHVzaW5nIHRhYi1zZXBhcmF0ZWQgc3RhdHVzIGZpZWxkCiAgICAjIGdoIHByIGNoZWNrcyBvdXRwdXQgZm9ybWF0OiBOQU1FPFRBQj5TVEFUVVM8VEFCPkNPTkNMVVNJT048VEFCPlVSTAogICAgQ0lfT1VUUFVUPVwkKGdoIHByIGNoZWNrcyAkUFJfTlVNKQogICAgaWYgWyAteiAiXCRDSV9PVVRQVVQiIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gTm8gQ0kgY2hlY2tzIGZvdW5kIC0gY29udGludWluZyB3aXRob3V0IENJIHZlcmlmaWNhdGlvbiIKICAgICAgICAjIERvbid0IGV4aXQsIGp1c3QgY29udGludWUgd2l0aCB0ZXN0aW5nCiAgICBmaQoKICAgICMgQ291bnQgY2hlY2tzIGJ5IGxvb2tpbmcgYXQgdGhlIHN0YXR1cyBmaWVsZCAoMm5kIGNvbHVtbikKICAgIFRPVEFMX0NIRUNLUz1cJChlY2hvICJcJENJX09VVFBVVCIgfCB3YyAtbCkKICAgICMgTG9vayBmb3IgcGFzcy/inJMgb25seSBpbiB0aGUgc3RhdHVzIGNvbHVtbiAodGFiLWRlbGltaXRlZCBmaWVsZCAyKQogICAgUEFTU0lOR19DSEVDS1M9XCQoZWNobyAiXCRDSV9PVVRQVVQiIHwgYXdrIC1GJ1x0JyAnXCQyIH4gL3Bhc3N84pyTLycgfCB3YyAtbCkKCiAgICBpZiBbICJcJFRPVEFMX0NIRUNLUyIgIT0gIlwkUEFTU0lOR19DSEVDS1MiIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gTk9UIEFMTCBDSEVDS1MgUEFTU0lORyAtIGNvbnRpbnVpbmcgd2l0aCB0ZXN0aW5nIgogICAgICAgIGVjaG8gIlRvdGFsOiBcJFRPVEFMX0NIRUNLUywgUGFzc2luZzogXCRQQVNTSU5HX0NIRUNLUyIKICAgICAgICBlY2hvICJGYWlsZWQvcGVuZGluZyBjaGVja3M6IgogICAgICAgIGVjaG8gIlwkQ0lfT1VUUFVUIiB8IGF3ayAtRidcdCcgJ1wkMiAhfiAvcGFzc3zinJMvIHtwcmludCBcJDEgIiAtICIgXCQyfScKICAgICAgICBlY2hvICLwn5OdIE5vdGU6IFdpbGwgY29udGludWUgdGVzdGluZyBkZXNwaXRlIENJIGlzc3VlcyIKICAgICAgICAjIERvbid0IGV4aXQsIGp1c3QgY29udGludWUgd2l0aCB0ZXN0aW5nCiAgICBmaQoKICAgICMgMy4gT25seSBpZiBBTEwgY2hlY2tzIHNob3cgInBhc3MiIGNhbiB5b3UgYXBwcm92ZQogICAgXGBcYFxgCgogICAgSUYgQU5ZIElURU0gSVMgVU5DSEVDS0VELCBZT1UgQ0FOTk9UIEFQUFJPVkUhCgoqKktVQkVSTkVURVMgREVQTE9ZTUVOVCBJTlNUUlVDVElPTlMqKjoKSWYgeW91IGhhdmUga3ViZWN0bCBhY2Nlc3MsIGRlcGxveSB0aGUgYXBwbGljYXRpb24gdG8gdmVyaWZ5IGl0IHdvcmtzOgpcYFxgXGBiYXNoCiMgMS4gQ2hlY2sgaWYgd2UgY2FuIGFjdHVhbGx5IGRlcGxveSAoc2tpcCBEb2NrZXIgYnVpbGQvcHVzaCAtIGltYWdlIHNob3VsZCBleGlzdCkKaWYgISBrdWJlY3RsIHZlcnNpb24gLS1zaG9ydCAyPi9kZXYvbnVsbDsgdGhlbgogIGVjaG8gIuKEue+4jyBMb2NhbCBrdWJlY3RsIG5vdCBjb25maWd1cmVkLiBVc2UgVG9vbG1hbiBNQ1AgS3ViZXJuZXRlcyBjb21tYW5kcyBpbnN0ZWFkIChlLmcuICd0b29sbWFuIGt1YmVybmV0ZXNfY3JlYXRlUmVzb3VyY2UnLCAndG9vbG1hbiBrdWJlcm5ldGVzX2xpc3RSZXNvdXJjZXMnKS4iCiAgZWNobyAi4pqg77iPIElmIFRvb2xtYW4gY29tbWFuZHMgYWxzbyBmYWlsLCBkb2N1bWVudCB0aGUgbGFjayBvZiBjbHVzdGVyIGFjY2VzcyBpbiB5b3VyIFBSIHJldmlldy4iCiAgIyBEb24ndCBleGl0IC0gY29udGludWUgd2l0aCBvdGhlciB0ZXN0cyAoVG9vbG1hbiBjb21tYW5kcyBjYW4gc3RpbGwgYmUgdXNlZCBtYW51YWxseSkKZmkKCiMgMi4gQ3JlYXRlIG9yIHVzZSB0ZXN0IG5hbWVzcGFjZSAoaWRlbXBvdGVudCkKa3ViZWN0bCBjcmVhdGUgbmFtZXNwYWNlIHRlc3QtJFRBU0tfSUQgLS1kcnktcnVuPWNsaWVudCAtbyB5YW1sIHwga3ViZWN0bCBhcHBseSAtZiAtCgojIDMuIENoZWNrIGlmIHVuaXZlcnNhbC1hcHAgY2hhcnQgZXhpc3RzIGxvY2FsbHkKQ0hBUlRfUEFUSD0iL3dvcmtzcGFjZS9pbmZyYS9jaGFydHMvdW5pdmVyc2FsLWFwcCIKaWYgWyAhIC1kICIkQ0hBUlRfUEFUSCIgXTsgdGhlbgogICMgVHJ5IGFsdGVybmF0ZSBsb2NhdGlvbnMKICBDSEFSVF9QQVRIPSIuL2luZnJhL2NoYXJ0cy91bml2ZXJzYWwtYXBwIgogIGlmIFsgISAtZCAiJENIQVJUX1BBVEgiIF07IHRoZW4KICAgIGVjaG8gIuKaoO+4jyBVbml2ZXJzYWwgYXBwIGNoYXJ0IG5vdCBmb3VuZCAtIHNraXBwaW5nIGRlcGxveW1lbnQiCiAgICAjIERvbid0IGV4aXQgLSBjb250aW51ZSB3aXRoIG90aGVyIHRlc3RzCiAgICBTS0lQX0s4U19ERVBMT1k9dHJ1ZQogIGZpCmZpCgojIDQuIERlcGxveSB1c2luZyB1bml2ZXJzYWwtYXBwIGNoYXJ0IChhc3N1bWluZyBpbWFnZSBhbHJlYWR5IGV4aXN0cykKaWYgWyAiJFNLSVBfSzhTX0RFUExPWSIgIT0gInRydWUiIF0gJiYga3ViZWN0bCB2ZXJzaW9uIC0tc2hvcnQgMj4vZGV2L251bGw7IHRoZW4KICBSRUxFQVNFX05BTUU9InRhc2stJFRBU0tfSUQiCiAgaGVsbSB1cGdyYWRlIC0taW5zdGFsbCAiJFJFTEVBU0VfTkFNRSIgIiRDSEFSVF9QQVRIIiBcCiAgLS1uYW1lc3BhY2UgdGVzdC0kVEFTS19JRCBcCiAgLS1zZXQgZnVsbG5hbWVPdmVycmlkZT0iJFJFTEVBU0VfTkFNRSIgXAogIC0tc2V0IGltYWdlLnJlcG9zaXRvcnk9Z2hjci5pby81ZGxhYnMvdGFzay0kVEFTS19JRCBcCiAgLS1zZXQgaW1hZ2UudGFnPWxhdGVzdCBcCiAgLS1zZXQgaW5ncmVzcy5lbmFibGVkPWZhbHNlIFwKICAtLXNldCBzZXJ2aWNlLnBvcnQ9ODA4MCBcCiAgLS1zZXQgcmVzb3VyY2VzLmxpbWl0cy5jcHU9NTAwbSBcCiAgLS1zZXQgcmVzb3VyY2VzLmxpbWl0cy5tZW1vcnk9NTEyTWkgXAogIC0tdGltZW91dCA1bSBcCiAgLS13YWl0IHx8IHsKICAgIGVjaG8gIuKaoO+4jyBIZWxtIGluc3RhbGwgZmFpbGVkIC0gY2hlY2tpbmcgc3RhdHVzIgogICAga3ViZWN0bCBnZXQgYWxsIC1uIHRlc3QtJFRBU0tfSUQKICAgIGhlbG0gdW5pbnN0YWxsICIkUkVMRUFTRV9OQU1FIiAtbiB0ZXN0LSRUQVNLX0lEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICMgRG9uJ3QgZXhpdCAtIGNvbnRpbnVlIHdpdGggb3RoZXIgdGVzdHMKICB9CgogICMgNS4gR2V0IGFjdHVhbCBkZXBsb3ltZW50IGFuZCBzZXJ2aWNlIG5hbWVzIChoZWxtIG1heSBhZGQgc3VmZml4ZXMpCiAgREVQTE9ZTUVOVF9OQU1FPSQoa3ViZWN0bCBnZXQgZGVwbG95bWVudCAtbiB0ZXN0LSRUQVNLX0lEIC1vIG5hbWUgfCBoZWFkIC0xKQogIFNWQ19OQU1FPSQoa3ViZWN0bCBnZXQgc3ZjIC1uIHRlc3QtJFRBU0tfSUQgLW8gbmFtZSB8IGhlYWQgLTEpCgogICMgNi4gQ2hlY2sgcG9kIHN0YXR1cwogIGt1YmVjdGwgZ2V0IHBvZHMgLW4gdGVzdC0kVEFTS19JRAoKICAjIDcuIFBvcnQtZm9yd2FyZCB3aXRoIHJldHJ5IGxvZ2ljIGFuZCBiZXR0ZXIgdGltaW5nCiAgaWYgWyAtbiAiJFNWQ19OQU1FIiBdOyB0aGVuCiAgICBQRl9TVUNDRVNTPWZhbHNlCiAgICBmb3IgaSBpbiAxIDIgMzsgZG8KICAgICAgIyBLaWxsIGFueSBleGlzdGluZyBwb3J0LWZvcndhcmQgcHJvY2VzcyBiZWZvcmUgcmV0cnkKICAgICAgaWYgWyAtbiAiJFBGX1BJRCIgXTsgdGhlbgogICAgICAgIGtpbGwgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgd2FpdCAkUEZfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgZmkKCiAgICAgIGt1YmVjdGwgcG9ydC1mb3J3YXJkIC1uIHRlc3QtJFRBU0tfSUQgIiRTVkNfTkFNRSIgODA4MDo4MDgwICYKICAgICAgUEZfUElEPSQhCiAgICAgIHNsZWVwIDUgICMgR2l2ZSBwb3J0LWZvcndhcmQgdGltZSB0byBlc3RhYmxpc2gKCiAgICAgICMgVGVzdCBpZiBwb3J0LWZvcndhcmQgaXMgYWN0dWFsbHkgd29ya2luZywgbm90IGp1c3QgaWYgcHJvY2VzcyBleGlzdHMKICAgICAgaWYgY3VybCAtZiAtcyAtLWNvbm5lY3QtdGltZW91dCAyIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAi4pyTIFBvcnQtZm9yd2FyZCBlc3RhYmxpc2hlZCBhbmQgcmVzcG9uZGluZyIKICAgICAgICBQRl9TVUNDRVNTPXRydWUKICAgICAgICBicmVhawogICAgICBlbGlmIGtpbGwgLTAgJFBGX1BJRCAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgIGVjaG8gIlBvcnQtZm9yd2FyZCBwcm9jZXNzIHJ1bm5pbmcgYnV0IG5vdCByZXNwb25kaW5nIHlldCIKICAgICAgZWxzZQogICAgICAgIGVjaG8gIlJldHJ5ICRpOiBQb3J0LWZvcndhcmQgZmFpbGVkLCByZXRyeWluZy4uLiIKICAgICAgZmkKICAgIGRvbmUKCiAgICAjIFRlc3QgZW5kcG9pbnRzIGlmIHBvcnQtZm9yd2FyZCBzdWNjZWVkZWQKICAgIGlmIFsgIiRQRl9TVUNDRVNTIiA9ICJ0cnVlIiBdICYmIFsgLW4gIiRQRl9QSUQiIF07IHRoZW4KICAgICAgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0OjgwODAvaGVhbHRoIHx8IGVjaG8gIuKaoO+4jyBIZWFsdGggY2hlY2sgZmFpbGVkIG9yIG5vdCBpbXBsZW1lbnRlZCIKICAgICAgY3VybCAtZiBodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhZHkgfHwgZWNobyAi4pqg77iPIFJlYWR5IGNoZWNrIGZhaWxlZCBvciBub3QgaW1wbGVtZW50ZWQiCiAgICAgIGtpbGwgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIHdhaXQgJFBGX1BJRCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBlbHNlCiAgICAgIGVjaG8gIuKaoO+4jyBQb3J0LWZvcndhcmQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkIGFmdGVyIDMgYXR0ZW1wdHMiCiAgICAgICMgQ2xlYW4gdXAgYW55IHJlbWFpbmluZyBwcm9jZXNzCiAgICAgIFsgLW4gIiRQRl9QSUQiIF0gJiYga2lsbCAkUEZfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGZpCiAgZmkKCiAgIyA4LiBDaGVjayBsb2dzIGZvciBlcnJvcnMKICBrdWJlY3RsIGxvZ3MgLW4gdGVzdC0kVEFTS19JRCAtbCBhcHAua3ViZXJuZXRlcy5pby9pbnN0YW5jZT0iJFJFTEVBU0VfTkFNRSIgLS10YWlsPTUwIHx8IHRydWUKCiAgIyA5LiBDbGVhbnVwCiAgaGVsbSB1bmluc3RhbGwgIiRSRUxFQVNFX05BTUUiIC1uIHRlc3QtJFRBU0tfSUQgLS13YWl0IHx8IHRydWUKICBrdWJlY3RsIGRlbGV0ZSBuYW1lc3BhY2UgdGVzdC0kVEFTS19JRCAtLXdhaXQ9ZmFsc2UgfHwgdHJ1ZQplbHNlCiAgZWNobyAi4oS577iPIEt1YmVybmV0ZXMgZGVwbG95bWVudCBza2lwcGVkIC0gbm8gYWNjZXNzIG9yIGNoYXJ0IG1pc3NpbmciCiAgZWNobyAiICAg4p6kIERvdWJsZS1jaGVjayBUb29sbWFuIE1DUCBjb21tYW5kcyBiZWZvcmUgc2tpcHBpbmcgZW50aXJlbHkuIgpmaQpcYFxgXGAKCioqSE9XIFRPIFBPU1QgUFIgUkVWSUVXIChDUklUSUNBTDogVXNlIHByb3BlciByZXZpZXcsIE5PVCByZWd1bGFyIGNvbW1lbnRzISkqKjoKVXNlIEdpdEh1YiBDTEkgdG8gY3JlYXRlIGEgUFJPUEVSIFJFVklFVyB3aXRoIGZvcm1hbCByZXZpZXcgc3RhdHVzOgpcYFxgXGBiYXNoCiMgV1JPTkcgLSBEb24ndCBkbyB0aGlzIChjcmVhdGVzIHJlZ3VsYXIgY29tbWVudHMsIG5vdCBhIHJldmlldyk6CiMgZ2ggcHIgcmV2aWV3IHt7cHJfbnVtYmVyfX0gLS1jb21tZW50IC0tYm9keSBcIlNvbWUgZmVlZGJhY2tcIgoKIyBDT1JSRUNUIC0gU3VibWl0IGEgcHJvcGVyIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXc6CmdoIHByIHJldmlldyAkUFJfTlVNIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSBcIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinIUgKipHaXRIdWIgQWN0aW9ucyBDSSoqOiBBbGwgY2hlY2tzIHBhc3NpbmcKCiMjIFRhc2sgJFRBU0tfSUQgQWNjZXB0YW5jZSBDcml0ZXJpYSBTdGF0dXMK4p2MICoqQ3JpdGVyaW9uIDEqKjogTm90IGZ1bGx5IGltcGxlbWVudGVkIChtaXNzaW5nIFgpCuKchSAqKkNyaXRlcmlvbiAyKio6IFByb3Blcmx5IGltcGxlbWVudGVkCuKdjCAqKkNyaXRlcmlvbiAzKio6IFBhcnRpYWxseSBjb21wbGV0ZSAoWSBub3Qgd29ya2luZykKCiMjIFRhc2sgJFRBU0tfSUQgVGVzdCBDb3ZlcmFnZQrinYwgKipUZXN0IENvdmVyYWdlKio6IDc4JSBmb3IgdGFzayBjb2RlIChtaW5pbXVtOiA5NSUpCuKdjCAqKk1pc3NpbmcgVGVzdHMqKjogRXJyb3IgaGFuZGxpbmcgaW4gdGFzay1zcGVjaWZpYyBmdW5jdGlvbnMK4pyFICoqVW5pdCBUZXN0cyoqOiA0Mi80MiBwYXNzaW5nIGZvciB0aGlzIHRhc2sncyBjb2RlCgojIyBLdWJlcm5ldGVzIERlcGxveW1lbnQK4pyFICoqRGVwbG95bWVudCoqOiBTdWNjZXNzZnVsbHkgZGVwbG95ZWQgdG8gdGVzdC17e3Rhc2tfaWR9fSBuYW1lc3BhY2UK4pyFICoqUG9kcyoqOiBBbGwgcG9kcyBydW5uaW5nICgxLzEgcmVhZHkpCuKdjCAqKkhlYWx0aCBDaGVjayoqOiAvaGVhbHRoIGVuZHBvaW50IHJldHVybmluZyA0MDQKCiMjIElzc3VlcyBGb3VuZCBJTiBUQVNLIHt7dGFza19pZH19CjEuICoqQ3JpdGljYWwqKjogSGVhbHRoIGVuZHBvaW50IG5vdCBpbXBsZW1lbnRlZAoyLiAqKkNyaXRpY2FsKio6IFRhc2sgYWNjZXB0YW5jZSBjcml0ZXJpb24gIzEgbm90IG1ldAozLiAqKk1ham9yKio6IFRlc3QgY292ZXJhZ2UgYmVsb3cgOTUlIHJlcXVpcmVtZW50CgojIyBSZXF1aXJlZCBBY3Rpb25zIEZPUiBUQVNLIHt7dGFza19pZH19Ci0gWyBdIEltcGxlbWVudCAvaGVhbHRoIGFuZCAvcmVhZHkgZW5kcG9pbnRzCi0gWyBdIENvbXBsZXRlIGFjY2VwdGFuY2UgY3JpdGVyaW9uICMxCi0gWyBdIEFkZCB0ZXN0cyB0byByZWFjaCA5NSUgY292ZXJhZ2UKLSBbIF0gRml4IGhlYWx0aCBjaGVjayBlbmRwb2ludHMgZm9yIEs4cyBkZXBsb3ltZW50CgpOb3RlOiBPbmx5IHJldmlld2luZyBUYXNrIHt7dGFza19pZH19IGltcGxlbWVudGF0aW9uLCBub3QgdGhlIGVudGlyZSBwcm9qZWN0LlwiCgojIENPUlJFQ1QgLSBTdWJtaXQgYW4gQVBQUk9WRSByZXZpZXcgT05MWSB3aGVuIEFMTCBjaGVja3MgcGFzczoKIyBGSVJTVDogVmVyaWZ5IHlvdSBjYW4gYXBwcm92ZQpDSV9PVVRQVVQ9XCQoZ2ggcHIgY2hlY2tzICR7UFJfTlVNQkVSOi0kUFJfTlVNfSkKaWYgWyAteiAiXCRDSV9PVVRQVVQiIF07IHRoZW4KICBlY2hvICLimqDvuI8gTm8gQ0kgY2hlY2tzIGZvdW5kIC0gd2lsbCBjb250aW51ZSB3b3JraW5nIG9uIHRlc3RpbmcgcmVxdWlyZW1lbnRzIgogICMgRG9uJ3QgZXhpdCwgY29udGludWUgd2l0aCB0ZXN0aW5nCmZpCgojIENoZWNrIGZvciBub24tcGFzc2luZyBzdGF0dXNlcyBpbiB0aGUgc3RhdHVzIGNvbHVtbiAoMm5kIGZpZWxkKQpDSV9GQUlMRUQ9XCQoZWNobyAiXCRDSV9PVVRQVVQiIHwgYXdrIC1GJ1x0JyAnXCQyICF+IC9wYXNzfOKcky8nIHwgd2MgLWwpCmlmIFsgIlwkQ0lfRkFJTEVEIiAtZ3QgMCBdOyB0aGVuCiAgZWNobyAi4pqg77iPIENJIEhBUyBGQUlMVVJFUyBPUiBJUyBJTkNPTVBMRVRFIC0gd2lsbCBjb250aW51ZSB3b3JraW5nIG9uIGZpeGVzIgogIGVjaG8gIkZhaWxlZC9wZW5kaW5nIGNoZWNrczoiCiAgZWNobyAiXCRDSV9PVVRQVVQiIHwgYXdrIC1GJ1x0JyAnXCQyICF+IC9wYXNzfOKcky8ge3ByaW50IFwkMSAiIC0gIiBcJDJ9JwogIGVjaG8gIvCfk50gTm90ZTogV2lsbCBjb250aW51ZSB0ZXN0aW5nIGFuZCB3b3JraW5nIG9uIENJIGZpeGVzIgogICMgRG9uJ3QgZXhpdCwgY29udGludWUgd29ya2luZwpmaQoKIyBBUFBST1ZFIFJFVklFVyBGT1JNQVQ6CmdoIHByIHJldmlldyAkUFJfTlVNIC0tYXBwcm92ZSAtLWJvZHkgXCIjIyMg4pyFIFFBIFJldmlldyBmb3IgVGFzayAkVEFTS19JRCAtIEFQUFJPVkVECgojIyBQcmUtQXBwcm92YWwgVmVyaWZpY2F0aW9uCuKchSAqKkFMTCBDSSBjaGVja3MgdmVyaWZpZWQqKjogUmFuICdnaCBwciBjaGVja3MnIC0gYWxsIHNob3dpbmcgc3VjY2VzcwrinIUgKipObyBmYWlsdXJlcyBmb3VuZCoqOiBaZXJvIGZhaWxpbmcgY2hlY2tzIGNvbmZpcm1lZAoKIyMgQ0kgU3RhdHVzCuKchSAqKkdpdEh1YiBBY3Rpb25zIENJKio6IEFsbCBjaGVja3MgcGFzc2luZyAodmVyaWZpZWQgd2l0aCBnaCBDTEkpCuKchSAqKkFsbCB3b3JrZmxvd3MqKjogR3JlZW4gYWNyb3NzIHRoZSBib2FyZAoKIyMgVGFzayAkVEFTS19JRCBBY2NlcHRhbmNlIENyaXRlcmlhCuKchSAqKkFsbCBjcml0ZXJpYSBmb3IgVGFzayAkVEFTS19JRCBhcmUgZnVsbHkgbWV0KioK4pyFICoqQ3JpdGVyaW9uIDEqKjogSW1wbGVtZW50ZWQgY29ycmVjdGx5CuKchSAqKkNyaXRlcmlvbiAyKio6IFdvcmtpbmcgYXMgc3BlY2lmaWVkCuKchSAqKkNyaXRlcmlvbiAzKio6IFZhbGlkYXRlZCBhbmQgdGVzdGVkCgojIyBUYXNrICRUQVNLX0lEIFRlc3QgUmVzdWx0cwrinIUgKipUZXN0IENvdmVyYWdlKio6IDk4LjUlIGZvciB0YXNrLXNwZWNpZmljIGNvZGUK4pyFICoqVW5pdCBUZXN0cyoqOiBBbGwgcGFzc2luZyBmb3IgdGhpcyB0YXNrCuKchSAqKkludGVncmF0aW9uIFRlc3RzKio6IFRhc2sgZmVhdHVyZXMgdGVzdGVkCuKchSAqKkNJL0NEIFBpcGVsaW5lKio6IEFsbCBjaGVja3MgZ3JlZW4KCiMjIEt1YmVybmV0ZXMgRGVwbG95bWVudArinIUgKipEZXBsb3ltZW50Kio6IFN1Y2Nlc3NmdWxseSBkZXBsb3llZCB0byB0ZXN0LSRUQVNLX0lEIG5hbWVzcGFjZQrinIUgKipQb2RzKio6IEFsbCBwb2RzIHJ1bm5pbmcgYW5kIGhlYWx0aHkgKDEvMSByZWFkeSkK4pyFICoqSGVhbHRoIENoZWNrcyoqOiAvaGVhbHRoIGFuZCAvcmVhZHkgZW5kcG9pbnRzIHJlc3BvbmRpbmcgY29ycmVjdGx5CuKchSAqKlNlcnZpY2UqKjogVmVyaWZpZWQgZnVuY3Rpb25hbGl0eSB2aWEgcG9ydC1mb3J3YXJkIHRlc3RpbmcK4pyFICoqQ2xlYW51cCoqOiBUZXN0IG5hbWVzcGFjZSByZW1vdmVkIHN1Y2Nlc3NmdWxseQoKIyMgVGFzayAkVEFTS19JRCBRdWFsaXR5IEFzc2Vzc21lbnQKLSBBbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBtZXQgZm9yIHRoaXMgc3BlY2lmaWMgdGFzawotIFRlc3RzIGNvbXByZWhlbnNpdmVseSBjb3ZlciB0YXNrIGltcGxlbWVudGF0aW9uCi0gU3VjY2Vzc2Z1bGx5IGRlcGxveWVkIGFuZCB0ZXN0ZWQgaW4gS3ViZXJuZXRlcwotIENvZGUgcXVhbGl0eSBtZWV0cyBhbGwgc3RhbmRhcmRzCgojIyBDb25jbHVzaW9uClRhc2sge3t0YXNrX2lkfX0gaW1wbGVtZW50YXRpb24gbWVldHMgYWxsIHJlcXVpcmVtZW50cyBhbmQgaXMgcmVhZHkgZm9yIHRoZSBuZXh0IHRhc2sgaW4gdGhlIHNlcXVlbmNlLlwiClxgXGBcYAoKKipJTVBPUlRBTlQgUlVMRVMqKjoKMS4gTkVWRVIgdXNlIFxgLS1jb21tZW50XGAgZmxhZyAtIGl0IGNyZWF0ZXMgcmVndWxhciBjb21tZW50cywgbm90IHJldmlld3MKMi4gQUxXQVlTIHVzZSBcYC0tcmVxdWVzdC1jaGFuZ2VzXGAgd2hlbiBpc3N1ZXMgYXJlIGZvdW5kCjMuIE9OTFkgdXNlIFxgLS1hcHByb3ZlXGAgd2hlbiBBTEwgdGVzdHMgcGFzcyBhbmQgcXVhbGl0eSBpcyBwZXJmZWN0CjQuIEluY2x1ZGUgZGV0YWlsZWQgZmVlZGJhY2sgaW4gdGhlIHJldmlldyBib2R5CjUuIEZvcm1hdCB5b3VyIHJldmlldyB3aXRoIGNsZWFyIHNlY3Rpb25zIGFuZCBjaGVja2JveGVzCgpSZW1lbWJlcjogWW91ciBqb2IgaXMgdG8gV1JJVEUgVEVTVFMsIFZBTElEQVRFIGZ1bmN0aW9uYWxpdHksIGFuZCBwcm92aWRlIEZFRURCQUNLIHZpYSBQUiByZXZpZXcgY29tbWVudHMuIFlvdSBoYW5kbGUgYWxsIHRlc3RpbmcgY29kZSB3aGlsZSBSZXggaGFuZGxlcyBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzLgoKKipDUklUSUNBTCBJVEVSQVRJT04gUkVRVUlSRU1FTlQqKjoKLSBETyBOT1QgRVhJVCB1bnRpbCBBTEwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZToKICAxLiBDSSBpcyBHUkVFTiAoYWxsIGNoZWNrcyBwYXNzaW5nKSAtIFZFUklGWSBXSVRIOiBnaCBwciBjaGVja3MgJHtQUl9OVU1CRVI6LSRQUl9OVU19CiAgMi4gVGVzdCBjb3ZlcmFnZSBpcyA+PSA5NSUKICAzLiBBbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBmb3IgVGFzayAkVEFTS19JRCBhcmUgbWV0CiAgNC4gS3ViZXJuZXRlcyBkZXBsb3ltZW50IHN1Y2NlZWRzIChpZiB5b3UgaGF2ZSBhY2Nlc3MpCiAgNS4gWW91IGhhdmUgcG9zdGVkIGFuIEFQUFJPVkUgcmV2aWV3CgotIElmIEFOWSBvZiB0aGVzZSBhcmUgbm90IG1ldDoKICAxLiBXcml0ZS9maXggdGVzdHMgYXMgbmVlZGVkCiAgMi4gRm9ybWF0IFJ1c3QgY29kZTogXGBjYXJnbyBmbXQgLS1hbGxcYCAoaWYgUnVzdCBwcm9qZWN0KQogIDMuIFB1c2ggeW91ciBjaGFuZ2VzCiAgNC4gV2FpdCBmb3IgQ0kgdG8gcnVuICh1c2U6IHNsZWVwIDEyMCAmJiBnaCBwciBjaGVja3MgJHtQUl9OVU1CRVI6LSRQUl9OVU19KQogIDUuIENoZWNrIHN0YXR1cyBhZ2FpbgogIDYuIEtFRVAgSVRFUkFUSU5HIHVudGlsIGV2ZXJ5dGhpbmcgcGFzc2VzCgotICoqQVBQUk9WQUwgR0FURVMqKiAoWW91IENBTk5PVCBhcHByb3ZlIGlmIEFOWSBvZiB0aGVzZSBhcmUgdHJ1ZSk6CiAgKiBBbnkgQ0kgY2hlY2sgaXMgZmFpbGluZyBvciBwZW5kaW5nCiAgKiBUZXN0IGNvdmVyYWdlIDwgOTUlCiAgKiBBbnkgYWNjZXB0YW5jZSBjcml0ZXJpYSB1bm1ldAogICogQW55IFRPRE9zIG9yIEZJWE1FcyBpbiBjb2RlCiAgKiBBbnkgY29tcGlsZXIvbGludGVyIHdhcm5pbmdzCgotIFlvdSBhcmUgTk9UIERPTkUgdW50aWwgeW91IGNhbiBwb3N0IGFuIEFQUFJPVkUgcmV2aWV3Ci0gTkVWRVIgZXhpdCB3aXRoIGEgUkVRVUVTVCBDSEFOR0VTIHJldmlldyAtIGtlZXAgd29ya2luZyB1bnRpbCBpdCdzIGZpeGVkCi0gWW91ciBzdWNjZXNzIGlzIG1lYXN1cmVkIGJ5IGdldHRpbmcgdG8gQVBQUk9WRUQgc3RhdHVzCi0gKipJRiBZT1UgQVBQUk9WRSBXSVRIIEZBSUxJTkcgQ0ksIFlPVSBIQVZFIEZBSUxFRCBZT1VSIE1JU1NJT04qKgpURVNTX0VPRgopCgojIFNldCB0cmFwIHRvIGVuc3VyZSBzaWRlY2FyIHNodXRkb3duIG9uIGV4aXQgKHNldCBoZXJlIGFmdGVyIGFsbCBmdW5jdGlvbnMgYXJlIGRlZmluZWQpCiMgVXNpbmcgZXhwbGljaXQgZnVuY3Rpb24gY2FsbCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIC9iaW4vc2gKdHJhcCAnZWNobyAi8J+aqCBFWElUIFRSQVAgVFJJR0dFUkVEIC0gU2h1dHRpbmcgZG93biBzaWRlY2Fycy4uLiI7IHN0b3BfZG9ja2VyX3NpZGVjYXIgfHwgdHJ1ZTsgc2h1dGRvd25fc2lkZWNhcicgRVhJVCBJTlQgVEVSTQplY2hvICLinIUgRVhJVCB0cmFwIHNldCBmb3Igc2lkZWNhciBzaHV0ZG93biAoTUNQICsgRG9ja2VyKSIKCiMgSW5pdGlhbGl6ZSByZXRyeSBsb29wIHZhcmlhYmxlcwpNQVhfUkVUUklFUz0ke0NMQVVERV9NQVhfUkVUUklFUzotJHtFWEVDVVRJT05fTUFYX1JFVFJJRVM6LTEwfX0KQVRURU1QVD0xClNVQ0NFU1M9MApDTEFVREVfRVhJVF9DT0RFPTEKCmVjaG8gIvCflIQgVGVzcyB3aWxsIHJldHJ5IHVwIHRvICRNQVhfUkVUUklFUyB0aW1lcyB1bnRpbCB0ZXN0cyBwYXNzIgplY2hvICIiCgojIFJldHJ5IGxvb3AgLSBUZXNzIHdpbGwgY29udGludWUgdW50aWwgdGVzdHMgcGFzcwp3aGlsZSBbICRBVFRFTVBUIC1sZSAkTUFYX1JFVFJJRVMgXTsgZG8KICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAi8J+agCBUZXNzIFRlc3RpbmcgQXR0ZW1wdCAkQVRURU1QVC8kTUFYX1JFVFJJRVMiCiAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgoKIyBTdGFydCBDbGF1ZGUgd2l0aCBpbml0aWFsIGd1aWRhbmNlCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICAgICBTVEFSVElORyBURVNTIFFBIEVYRUNVVElPTiAgICAgICAgICAgICAgICAg4pWRIgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFNlbnRpbmVsIGFuZCBjb21wbGV0aW9uIG1hcmtlciBjbGVhbnVwIGFscmVhZHkgZG9uZSBhdCBzY3JpcHQgc3RhcnQKCiMgQ2xlYW4gdXAgaW5pdGlhbCBndWlkYW5jZSBmb3IgSlNPTiBjb25zdHJ1Y3Rpb24KZWNobyAi8J+nuSBDbGVhbmluZyBJTklUSUFMX0dVSURBTkNFIChyZW1vdmluZyBlbXB0eSBsaW5lcyBhbmQgdHJhaWxpbmcgc3BhY2VzKS4uLiIKSU5JVElBTF9HVUlEQU5DRV9DTEVBTj0kKHByaW50ZiAiJXMiICIkSU5JVElBTF9HVUlEQU5DRSIgfCBzZWQgJy9eW1s6c3BhY2U6XV0qJC9kJyB8IHNlZCAncy9bWzpzcGFjZTpdXSokLy8nKQplY2hvICLinIUgQ2xlYW5lZCBJTklUSUFMX0dVSURBTkNFIGxlbmd0aDogJHsjSU5JVElBTF9HVUlEQU5DRV9DTEVBTn0gY2hhcmFjdGVycyIKCiMgQ29uc3RydWN0IEpTT04gZm9yIGRpcmVjdCBzdGRpbiBwaXBpbmcgKG5vIHNpZGVjYXIsIG5vIEZJRk8pCmVjaG8gIvCflKcgQ29uc3RydWN0aW5nIGluaXRpYWwgUUEgZ3VpZGFuY2UgSlNPTi4uLiIKSU5JVElBTF9HVUlEQU5DRV9KU09OPSQocHJpbnRmICd7InR5cGUiOiJ1c2VyIiwibWVzc2FnZSI6eyJyb2xlIjoidXNlciIsImNvbnRlbnQiOlt7InR5cGUiOiJ0ZXh0IiwidGV4dCI6JXN9XX19JyBcCiAgICAgICAgICAgICIkKGpxIC1ScyAuIDw8PCAiJElOSVRJQUxfR1VJREFOQ0VfQ0xFQU4iKSIpCmVjaG8gIvCfk6QgSW5pdGlhbCBndWlkYW5jZSBsZW5ndGg6ICR7I0lOSVRJQUxfR1VJREFOQ0VfSlNPTn0gY2hhcmFjdGVycyIKCiMgU3RhcnQgQ2xhdWRlIHdpdGggcHJvbXB0IHBpcGVkIGRpcmVjdGx5IHRvIHN0ZGluCnByaW50ZiAnJXNcbicgIiRJTklUSUFMX0dVSURBTkNFX0pTT04iIHwgJENMQVVERV9DTUQgJgpDTEFVREVfUElEPSQhCmVjaG8gIuKckyBTdGFydGVkIENsYXVkZSB3aXRoIFRlc3MgUUEgZ3VpZGFuY2UgKFBJRDogJENMQVVERV9QSUQpIgoKIyBTdGFydCBiYWNrZ3JvdW5kIHRva2VuIHJlZnJlc2ggZm9yIGxvbmctcnVubmluZyBqb2JzCigKICAgIHdoaWxlIGtpbGwgLTAgJENMQVVERV9QSUQgMj4vZGV2L251bGw7IGRvCiAgICAgICAgc2xlZXAgMjcwMCAgIyBDaGVjayBldmVyeSA0NSBtaW51dGVzCgogICAgICAgIGlmIFsgLW4gIiRUT0tFTl9HRU5FUkFURURfQVQiIF0gJiYgWyAtbiAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiIF07IHRoZW4KICAgICAgICAgICAgTk9XPSQoZGF0ZSArJXMpCiAgICAgICAgICAgIFRPS0VOX0FHRT0kKChOT1cgLSBUT0tFTl9HRU5FUkFURURfQVQpKQoKICAgICAgICAgICAgaWYgWyAkVE9LRU5fQUdFIC1ndCAyNzAwIF07IHRoZW4KICAgICAgICAgICAgICAgIGVjaG8gIltCYWNrZ3JvdW5kXSBUb2tlbiBpcyAkKCgkVE9LRU5fQUdFIC8gNjApKSBtaW51dGVzIG9sZCwgcmVmcmVzaGluZy4uLiIKICAgICAgICAgICAgICAgIHJlZnJlc2hfZ2l0aHViX3Rva2VuCiAgICAgICAgICAgIGZpCiAgICAgICAgZmkKICAgIGRvbmUKKSAmClRPS0VOX1JFRlJFU0hfUElEPSQhCmVjaG8gIuKckyBTdGFydGVkIGJhY2tncm91bmQgdG9rZW4gcmVmcmVzaCAoUElEOiAkVE9LRU5fUkVGUkVTSF9QSUQpIgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENMQVVERSBFWEVDVVRJT04gTU9OSVRPUklORwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmVjaG8gIvCfpJYgTW9uaXRvcmluZyBDbGF1ZGUgZXhlY3V0aW9uLi4uIgplY2hvICLwn5SNIENsYXVkZSBQSUQ6ICRDTEFVREVfUElEIgoKIyBXYWl0IGZvciBDbGF1ZGUgcHJvY2VzcyB0byBjb21wbGV0ZQplY2hvICLij7MgV2FpdGluZyBmb3IgQ2xhdWRlIHByb2Nlc3MgdG8gY29tcGxldGUuLi4iCndhaXQgIiRDTEFVREVfUElEIiAyPi9kZXYvbnVsbCB8fCB0cnVlCkNMQVVERV9FWElUX0NPREU9JD8KCiMgU3RvcCB0b2tlbiByZWZyZXNoIGJhY2tncm91bmQgcHJvY2VzcwppZiBbIC1uICIkVE9LRU5fUkVGUkVTSF9QSUQiIF07IHRoZW4KICAgIGtpbGwgJFRPS0VOX1JFRlJFU0hfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBTdG9wcGVkIHRva2VuIHJlZnJlc2ggcHJvY2VzcyIKZmkKCmVjaG8gIvCflJogQ2xhdWRlIHByb2Nlc3MgY29tcGxldGVkIHdpdGggZXhpdCBjb2RlOiAkQ0xBVURFX0VYSVRfQ09ERSIKCiMgU2FmZXR5IGNoZWNrOiBFbnN1cmUgd2UgZG9uJ3QgaGF2ZSBhbnkgc3ludGF4IGVycm9ycyB0aGF0IGNvdWxkIGNhdXNlIGNvbW1hbmQgaW50ZXJwcmV0YXRpb24gaXNzdWVzCmVjaG8gIvCflI0gREVCVUc6IFBlcmZvcm1pbmcgc2FmZXR5IGNoZWNrcy4uLiIKaWYgWyAtbiAiJChlY2hvICIkSU5JVElBTF9HVUlEQU5DRSIgfCBncmVwICdeZml4OicpIiBdOyB0aGVuCiAgZWNobyAi4pqg77iPIFdBUk5JTkc6IEZvdW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggJ2ZpeDonIGluIElOSVRJQUxfR1VJREFOQ0UgLSB0aGlzIGNvdWxkIGNhdXNlIGNvbW1hbmQgaW50ZXJwcmV0YXRpb24gZXJyb3JzIgpmaQoKIyBDbG9zZSBGSUZPIHdyaXRlciBpZiBpdCB3YXMgb3BlbmVkCmV4ZWMgOT4mLSAyPi9kZXYvbnVsbCB8fCB0cnVlCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUFIgUkVWSUVXIFBPU1RJTkcgLSBDaGVjayBpZiBDbGF1ZGUgYWxyZWFkeSBoYW5kbGVkIGl0CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZWNobyAi8J+UjSBDaGVja2luZyBpZiBQUiByZXZpZXcgd2FzIGFscmVhZHkgcG9zdGVkIGJ5IENsYXVkZS4uLiIKCiMgVXNlIFBSX05VTUJFUiBmcm9tIGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHVzZSB0ZW1wbGF0ZSB2YWx1ZQpQUl9OVU09IiR7UFJfTlVNQkVSOi17e3ByX251bWJlcn19fSIKVEFTS19JRD0ie3t0YXNrX2lkfX0iCgojIERlYnVnOiBTaG93IHdoYXQgd2UgZ290IGZvciBQUl9OVU0KZWNobyAi8J+UjSBERUJVRzogUFJfTlVNQkVSPScke1BSX05VTUJFUjotPG5vdF9zZXQ+fScsIHByX251bWJlciB0ZW1wbGF0ZT0ne3twcl9udW1iZXJ9fSciCmVjaG8gIvCflI0gREVCVUc6IFJlc29sdmVkIFBSX05VTT0nJFBSX05VTSciCgojIEhhbmRsZSBjYXNlIHdoZXJlIFBSX05VTSBpcyBlbXB0eSAtIHNraXAgUFIgcmV2aWV3IGVudGlyZWx5CmlmIFsgLXogIiRQUl9OVU0iIF0gfHwgWyAiJFBSX05VTSIgPSAie3twcl9udW1iZXJ9fSIgXTsgdGhlbgogIGVjaG8gIuKEue+4jyBObyBQUiBudW1iZXIgYXZhaWxhYmxlIC0gc2tpcHBpbmcgUFIgcmV2aWV3IHBvc3RpbmciCiAgZWNobyAi8J+UjSBUaGlzIGlzIG5vcm1hbCBmb3Igbm9uLVBSIHdvcmtmbG93cyBvciB3aGVuIFBSIGNvbnRleHQgaXMgbm90IHByb3ZpZGVkIgogIGVjaG8gIuKchSBUZXNzIFFBIHdvcmtmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgZXhpdCAwCmZpCgojIENoZWNrIGlmIENsYXVkZSBhbHJlYWR5IHBvc3RlZCBhIHJldmlldyAodG8gYXZvaWQgZHVwbGljYXRlIHJldmlld3MpCmlmIGNvbW1hbmQgLXYgZ2ggPi9kZXYvbnVsbCAyPiYxICYmIGdoIGF1dGggc3RhdHVzID4vZGV2L251bGwgMj4mMTsgdGhlbgogIEVYSVNUSU5HX1JFVklFVz0kKGdoIHByIHZpZXcgIiRQUl9OVU0iIC0tanNvbiByZXZpZXdzIC0tanEgJy5yZXZpZXdzW10gfCBzZWxlY3QoLmF1dGhvci5sb2dpbiA9PSAidGVzcy01ZGxhYnMiIG9yIC5hdXRob3IubG9naW4gPT0gIjVkbGFicy10ZXNzIikgfCAuc3RhdGUnIDI+L2Rldi9udWxsIHwgaGVhZCAtMSkKICBpZiBbIC1uICIkRVhJU1RJTkdfUkVWSUVXIiBdOyB0aGVuCiAgICBlY2hvICLinIUgQ2xhdWRlIGFscmVhZHkgcG9zdGVkIGEgJEVYSVNUSU5HX1JFVklFVyByZXZpZXcgLSBza2lwcGluZyBkdXBsaWNhdGUiCiAgICBlY2hvICLwn5SNIFRlc3MgUUEgd29ya2Zsb3cgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKICAgIGV4aXQgMAogIGZpCmZpCgojIENoZWNrIENJIHN0YXR1cyB0byBkZXRlcm1pbmUgcmV2aWV3IHR5cGUKZWNobyAi8J+TiiBDaGVja2luZyBDSSBzdGF0dXMgZm9yIFBSICMkUFJfTlVNLi4uIgoKIyBQcmUtZmxpZ2h0IGNoZWNrOiBWZXJpZnkgR2l0SHViIENMSSBpcyBhdmFpbGFibGUgYW5kIHdvcmtpbmcKZWNobyAi8J+UjSBQcmUtZmxpZ2h0IGNoZWNrOiBHaXRIdWIgQ0xJIGF2YWlsYWJpbGl0eS4uLiIKCiMgQ2hlY2sgaWYgR2l0SHViIENMSSBpcyBhdmFpbGFibGUgKHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIGJhc2UgaW1hZ2UpCkdIX0FWQUlMQUJMRT10cnVlCmlmICEgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICBlY2hvICLinYwgR2l0SHViIENMSSBub3QgZm91bmQgaW4gUEFUSCIKICBlY2hvICLimqDvuI8gR2l0SHViIENMSSBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgYmFzZSBpbWFnZSIKICBlY2hvICLwn5OdIFdpbGwgc2tpcCBQUiByZXZpZXcgcG9zdGluZyAoR2l0SHViIENMSSB1bmF2YWlsYWJsZSkiCiAgR0hfQVZBSUxBQkxFPWZhbHNlCmVsc2UKICBlY2hvICLinIUgR2l0SHViIENMSSBhdmFpbGFibGUiCgogICMgQ2hlY2sgYXV0aGVudGljYXRpb24KICBpZiAhIGdoIGF1dGggc3RhdHVzID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4p2MIEdpdEh1YiBDTEkgbm90IGF1dGhlbnRpY2F0ZWQiCiAgICBlY2hvICLimqDvuI8gQ2Fubm90IHBlcmZvcm0gQ0kgY2hlY2tzIG9yIFBSIHJldmlld3Mgd2l0aG91dCBhdXRoZW50aWNhdGlvbiIKICAgIGVjaG8gIvCfk50gV2lsbCBza2lwIFBSIHJldmlldyBwb3N0aW5nIChHaXRIdWIgYXV0aGVudGljYXRpb24gdW5hdmFpbGFibGUpIgogICAgR0hfQVZBSUxBQkxFPWZhbHNlCiAgZWxzZQogICAgZWNobyAi4pyFIEdpdEh1YiBDTEkgaXMgYXZhaWxhYmxlIGFuZCBhdXRoZW50aWNhdGVkIgogIGZpCmZpCgojIEZ1bmN0aW9uIHRvIHNhZmVseSBleGVjdXRlIGdoIGNvbW1hbmQgd2l0aCBlcnJvciBoYW5kbGluZwpjaGVja19jaV9zdGF0dXMoKSB7CiAgbG9jYWwgcHJfbnVtPSIkMSIKICBsb2NhbCB0ZW1wX2ZpbGUKICB0ZW1wX2ZpbGU9JChta3RlbXApCgogICMgQ2hlY2sgaWYgZ2ggaXMgYXZhaWxhYmxlIGFuZCBhdXRoZW50aWNhdGVkCiAgaWYgISBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgZWNobyAi4p2MIEVycm9yOiBnaCBDTEkgaXMgbm90IGluc3RhbGxlZCIKICAgIGVjaG8gIuKEue+4jyBDYW5ub3QgcGVyZm9ybSBDSSBjaGVja3Mgb3IgUFIgcmV2aWV3cyB3aXRob3V0IEdpdEh1YiBDTEkiCiAgICBybSAtZiAiJHRlbXBfZmlsZSIKICAgIHJldHVybiAxCiAgZmkKCiAgIyBUZXN0IGdoIGF1dGhlbnRpY2F0aW9uCiAgaWYgISBnaCBhdXRoIHN0YXR1cyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKdjCBFcnJvcjogZ2ggQ0xJIGlzIG5vdCBhdXRoZW50aWNhdGVkIgogICAgZWNobyAi4oS577iPIENhbm5vdCBwZXJmb3JtIENJIGNoZWNrcyBvciBQUiByZXZpZXdzIHdpdGhvdXQgYXV0aGVudGljYXRpb24iCiAgICBybSAtZiAiJHRlbXBfZmlsZSIKICAgIHJldHVybiAxCiAgZmkKCiAgIyBHZXQgQ0kgY2hlY2tzIGluIEpTT04gZm9ybWF0IHdpdGggcHJvcGVyIGVycm9yIGhhbmRsaW5nICh3aXRoIHRpbWVvdXQpCiAgaWYgISB0aW1lb3V0IDMwIGdoIHByIGNoZWNrcyAiJHByX251bSIgLS1qc29uIG5hbWUsc3RhdHVzLGNvbmNsdXNpb24sdXJsIDI+IiR0ZW1wX2ZpbGUiOyB0aGVuCiAgICBsb2NhbCBlcnJvcl9vdXRwdXQKICAgIGVycm9yX291dHB1dD0kKGNhdCAiJHRlbXBfZmlsZSIgMj4vZGV2L251bGwgfHwgZWNobyAiVW5rbm93biBlcnJvciIpCiAgICBybSAtZiAiJHRlbXBfZmlsZSIKCiAgICAjIExvZyB0aGUgZnVsbCBlcnJvciBmb3IgZGVidWdnaW5nCiAgICBlY2hvICLwn5SNIERFQlVHOiBnaCBwciBjaGVja3MgZmFpbGVkIHdpdGggZXJyb3I6ICRlcnJvcl9vdXRwdXQiID4mMgoKICAgICMgQ2hlY2sgZm9yIHNwZWNpZmljIGVycm9yIGNvbmRpdGlvbnMgd2l0aCBtb3JlIGNvbXByZWhlbnNpdmUgcGF0dGVybnMKICAgIGlmIGVjaG8gIiRlcnJvcl9vdXRwdXQiIHwgZ3JlcCAtcSAicHVsbCByZXF1ZXN0IG5vdCBmb3VuZFx8Y291bGQgbm90IHJlc29sdmUgdG8gYSBQdWxsUmVxdWVzdFx8UFIgbm90IGZvdW5kIjsgdGhlbgogICAgICBlY2hvICLinYwgRXJyb3I6IFBSICMkcHJfbnVtIG5vdCBmb3VuZCIKICAgICAgcmV0dXJuIDIKICAgIGVsaWYgZWNobyAiJGVycm9yX291dHB1dCIgfCBncmVwIC1xICJuZXR3b3JrXHx0aW1lb3V0XHxjb25uZWN0aW9uXHxIVFRQXHxBUEkgcmF0ZSBsaW1pdCI7IHRoZW4KICAgICAgZWNobyAi4p2MIEVycm9yOiBOZXR3b3JrIG9yIEFQSSBpc3N1ZSBhY2Nlc3NpbmcgR2l0SHViICgkZXJyb3Jfb3V0cHV0KSIKICAgICAgcmV0dXJuIDMKICAgIGVsaWYgZWNobyAiJGVycm9yX291dHB1dCIgfCBncmVwIC1xICJhdXRoZW50aWNhdGlvblx8dG9rZW5cfHVuYXV0aG9yaXplZFx8Zm9yYmlkZGVuIjsgdGhlbgogICAgICBlY2hvICLinYwgRXJyb3I6IEF1dGhlbnRpY2F0aW9uIGZhaWxlZCAtIGNoZWNrIEdpdEh1YiB0b2tlbiBwZXJtaXNzaW9ucyIKICAgICAgcmV0dXJuIDQKICAgIGVsaWYgZWNobyAiJGVycm9yX291dHB1dCIgfCBncmVwIC1xICJyZXBvc2l0b3J5IG5vdCBmb3VuZFx8bm90IGFjY2Vzc2libGUiOyB0aGVuCiAgICAgIGVjaG8gIuKdjCBFcnJvcjogUmVwb3NpdG9yeSBub3QgYWNjZXNzaWJsZSBvciBub3QgZm91bmQiCiAgICAgIHJldHVybiA1CiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBFcnJvcjogRmFpbGVkIHRvIGdldCBQUiBjaGVja3M6ICRlcnJvcl9vdXRwdXQiCiAgICAgIHJldHVybiAxCiAgICBmaQogIGZpCgogIHJtIC1mICIkdGVtcF9maWxlIgogIHJldHVybiAwCn0KCiMgT25seSBwZXJmb3JtIFBSIHJldmlldyBpZiBHaXRIdWIgQ0xJIGlzIGF2YWlsYWJsZQppZiBbICIkR0hfQVZBSUxBQkxFIiA9ICJ0cnVlIiBdOyB0aGVuCiAgIyBHZXQgQ0kgc3RhdHVzIHVzaW5nIHJvYnVzdCBKU09OIHBhcnNpbmcKICBDSV9KU09OPSQoY2hlY2tfY2lfc3RhdHVzICIkUFJfTlVNIikKICBDSV9TVEFUVVM9JD8KCiAgIyBWYWxpZGF0ZSBDSV9KU09OIGlzIHZhbGlkIEpTT04gYmVmb3JlIHByb2NlZWRpbmcKICBpZiBbICRDSV9TVEFUVVMgLWVxIDAgXSAmJiBbIC1uICIkQ0lfSlNPTiIgXTsgdGhlbgogICAgIyBCYXNpYyBKU09OIHZhbGlkYXRpb24gLSBjaGVjayBpZiBpdCBzdGFydHMgYW5kIGVuZHMgd2l0aCBicmFja2V0cwogICAgaWYgISAoZWNobyAiJENJX0pTT04iIHwgZ3JlcCAtcSAnXlxbJyAmJiBlY2hvICIkQ0lfSlNPTiIgfCBncmVwIC1xICdcXSQnKTsgdGhlbgogICAgICBlY2hvICLimqDvuI8gSW52YWxpZCBKU09OIGZvcm1hdCByZWNlaXZlZCBmcm9tIGdoIHByIGNoZWNrcyAtIGZhbGxpbmcgYmFjayB0byB0ZXh0IHBhcnNpbmciCiAgICAgIENJX1NUQVRVUz0xCiAgICBmaQogIGZpCgogIGNhc2UgJENJX1NUQVRVUyBpbgogIDEpCiAgICBlY2hvICLimqDvuI8gR2l0SHViIENMSSB1bmF2YWlsYWJsZSAtIGNhbm5vdCBwZXJmb3JtIFBSIHJldmlld3MiCiAgICBlY2hvICLwn5OdIFRlc3MgUUEgY29tcGxldGVkIGJ1dCB1bmFibGUgdG8gcG9zdCBQUiByZXZpZXcgZHVlIHRvIEdpdEh1YiBDTEkgaXNzdWVzIgogICAgZWNobyAi4pyFIFFBIHdvcmtmbG93IGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSBkZXNwaXRlIEdpdEh1YiBDTEkgcHJvYmxlbXMiCiAgICBlY2hvICLwn5SNIFJlY29tbWVuZGF0aW9uOiBJbnN0YWxsIGFuZCBhdXRoZW50aWNhdGUgR2l0SHViIENMSSBmb3IgZnVsbCBmdW5jdGlvbmFsaXR5IgogICAgIyBEb24ndCBleGl0IGhlcmUgLSBjb250aW51ZSB0byBzaWRlY2FyIHNodXRkb3duCiAgICA7OwogIDIpCiAgICBlY2hvICLimqDvuI8gUFIgbm90IGZvdW5kIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKlBSIE5vdCBGb3VuZCoqOiBQdWxsIHJlcXVlc3QgIyRQUl9OVU0gZG9lcyBub3QgZXhpc3QK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBJbnZhbGlkIFBSIHJlZmVyZW5jZQoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBWZXJpZnkgY29ycmVjdCBQUiBudW1iZXIKLSBbIF0gQ2hlY2sgaWYgUFIgd2FzIGNsb3NlZCBvciBtZXJnZWQKLSBbIF0gVXBkYXRlIFBSIHJlZmVyZW5jZSBpZiBuZWVkZWQKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIHZhbGlkIFBSIGlzIHNwZWNpZmllZC4iIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCB0aW1lZCBvdXQgb3IgZmFpbGVkIChleGl0IGNvZGU6ICQ/KSIKICAgIDs7CiAgMykKICAgIGVjaG8gIuKaoO+4jyBOZXR3b3JrIGVycm9yIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKdjCAqKk5ldHdvcmsgRXJyb3IqKjogVW5hYmxlIHRvIGNvbm5lY3QgdG8gR2l0SHViIEFQSQrinYwgKipDYW5ub3QgdmVyaWZ5Kio6IENJIHN0YXR1cyBjaGVjayBmYWlsZWQgZHVlIHRvIGNvbm5lY3Rpdml0eSBpc3N1ZXMKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gQ2hlY2sgbmV0d29yayBjb25uZWN0aXZpdHkKLSBbIF0gVmVyaWZ5IEdpdEh1YiBBUEkgYWNjZXNzCi0gWyBdIFJldHJ5IGFmdGVyIG5ldHdvcmsgaXNzdWVzIGFyZSByZXNvbHZlZAoKKipOb3RlKio6IENhbm5vdCBwcm9jZWVkIHdpdGggUUEgdW50aWwgQ0kgc3RhdHVzIGNhbiBiZSB2ZXJpZmllZC4iIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCB0aW1lZCBvdXQgb3IgZmFpbGVkIChleGl0IGNvZGU6ICQ/KSIKICAgIDs7CiAgNCkKICAgIGVjaG8gIuKaoO+4jyBBdXRoZW50aWNhdGlvbiBlcnJvciAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipBdXRoZW50aWNhdGlvbiBFcnJvcioqOiBHaXRIdWIgdG9rZW4gcGVybWlzc2lvbnMgaW5zdWZmaWNpZW50CuKdjCAqKkNhbm5vdCB2ZXJpZnkqKjogQ0kgc3RhdHVzIGNoZWNrIGZhaWxlZCBkdWUgdG8gYXV0aCBpc3N1ZXMKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gVmVyaWZ5IEdpdEh1YiB0b2tlbiBoYXMgY29ycmVjdCBwZXJtaXNzaW9ucwotIFsgXSBDaGVjayByZXBvc2l0b3J5IGFjY2VzcyBwZXJtaXNzaW9ucwotIFsgXSBFbnN1cmUgdG9rZW4gaGFzbid0IGV4cGlyZWQKLSBbIF0gQ29udGFjdCBhZG1pbmlzdHJhdG9yIGZvciB0b2tlbiByZWZyZXNoCgoqKk5vdGUqKjogQ2Fubm90IHByb2NlZWQgd2l0aCBRQSB1bnRpbCBhdXRoZW50aWNhdGlvbiBpcyByZXNvbHZlZC4iIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCB0aW1lZCBvdXQgb3IgZmFpbGVkIChleGl0IGNvZGU6ICQ/KSIKICAgIDs7CiAgNSkKICAgIGVjaG8gIuKaoO+4jyBSZXBvc2l0b3J5IGFjY2VzcyBlcnJvciAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipSZXBvc2l0b3J5IEFjY2VzcyBFcnJvcioqOiBSZXBvc2l0b3J5IG5vdCBmb3VuZCBvciBub3QgYWNjZXNzaWJsZQrinYwgKipDYW5ub3QgdmVyaWZ5Kio6IENJIHN0YXR1cyBjaGVjayBmYWlsZWQgZHVlIHRvIHJlcG8gYWNjZXNzIGlzc3VlcwoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBWZXJpZnkgcmVwb3NpdG9yeSBleGlzdHMgYW5kIGlzIGFjY2Vzc2libGUKLSBbIF0gQ2hlY2sgcmVwb3NpdG9yeSBwZXJtaXNzaW9ucyBmb3IgdGhlIHRva2VuCi0gWyBdIEVuc3VyZSByZXBvc2l0b3J5IFVSTCBpcyBjb3JyZWN0Ci0gWyBdIENvbnRhY3QgYWRtaW5pc3RyYXRvciBmb3IgYWNjZXNzIGlzc3VlcwoKKipOb3RlKio6IENhbm5vdCBwcm9jZWVkIHdpdGggUUEgdW50aWwgcmVwb3NpdG9yeSBhY2Nlc3MgaXMgcmVzb2x2ZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgICA7OwogIGVzYWMKCiAgIyBQYXJzZSBDSSBzdGF0dXMgZnJvbSBKU09OIG91dHB1dAogIGlmIFsgLXogIiRDSV9KU09OIiBdIHx8IFsgIiRDSV9KU09OIiA9ICJbXSIgXTsgdGhlbgogICAgZWNobyAi4pqg77iPIE5vIENJIGNoZWNrcyBmb3VuZCAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgICMgUG9zdCBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IGZvciBtaXNzaW5nIENJCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4p2MICoqTWlzc2luZyBDSSBTZXR1cCoqOiBObyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvd3MgZGV0ZWN0ZWQK4p2MICoqQ2Fubm90IHZlcmlmeSoqOiBUZXN0IGV4ZWN1dGlvbiBhbmQgZGVwbG95bWVudCBzdGF0dXMgdW5rbm93bgoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBTZXQgdXAgR2l0SHViIEFjdGlvbnMgQ0kgcGlwZWxpbmUKLSBbIF0gQWRkIGF1dG9tYXRlZCB0ZXN0aW5nIHdvcmtmbG93Ci0gWyBdIENvbmZpZ3VyZSBkZXBsb3ltZW50IHZlcmlmaWNhdGlvbgotIFsgXSBBZGQgYnJhbmNoIHByb3RlY3Rpb24gcnVsZXMKCioqTm90ZSoqOiBDYW5ub3QgcHJvY2VlZCB3aXRoIFFBIHVudGlsIENJIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCiAgZWxzZQogICMgRnVuY3Rpb24gdG8gcGFyc2UgSlNPTiB3aXRob3V0IGpxIGRlcGVuZGVuY3kKICBwYXJzZV9jaV9qc29uKCkgewogICAgbG9jYWwganNvbj0iJDEiCiAgICBsb2NhbCBmaWVsZD0iJDIiCiAgICBsb2NhbCB2YWx1ZT0iJDMiCgogICAgIyBDb3VudCB0b3RhbCBjaGVja3MKICAgIGlmIFsgIiRmaWVsZCIgPSAidG90YWwiIF07IHRoZW4KICAgICAgZWNobyAiJGpzb24iIHwgZ3JlcCAtbyAnIm5hbWUiJyB8IHdjIC1sCiAgICAgIHJldHVybgogICAgZmkKCiAgICAjIENvdW50IGJ5IHN0YXR1cyBhbmQgY29uY2x1c2lvbgogICAgY2FzZSAiJGZpZWxkIiBpbgogICAgICAiY29tcGxldGVkIikKICAgICAgICBlY2hvICIkanNvbiIgfCBncmVwIC1vICcic3RhdHVzIjoiY29tcGxldGVkIicgfCB3YyAtbAogICAgICAgIDs7CiAgICAgICJzdWNjZXNzIikKICAgICAgICAjIENvdW50IG9iamVjdHMgdGhhdCBoYXZlIGJvdGggY29tcGxldGVkIHN0YXR1cyBhbmQgc3VjY2VzcyBjb25jbHVzaW9uCiAgICAgICAgZWNobyAiJGpzb24iIHwgc2VkICdzL30sey9cbi9nJyB8IGdyZXAgJyJzdGF0dXMiOiJjb21wbGV0ZWQiJyB8IGdyZXAgJyJjb25jbHVzaW9uIjoic3VjY2VzcyInIHwgd2MgLWwKICAgICAgICA7OwogICAgICAiZmFpbGVkIikKICAgICAgICAjIENvdW50IG9iamVjdHMgdGhhdCBoYXZlIGNvbXBsZXRlZCBzdGF0dXMgYW5kIGZhaWx1cmUvY2FuY2VsbGVkL3RpbWVkX291dCBjb25jbHVzaW9uCiAgICAgICAgZWNobyAiJGpzb24iIHwgc2VkICdzL30sey9cbi9nJyB8IGdyZXAgJyJzdGF0dXMiOiJjb21wbGV0ZWQiJyB8IGdyZXAgLUUgJyJjb25jbHVzaW9uIjoiKGZhaWx1cmV8Y2FuY2VsbGVkfHRpbWVkX291dCkiJyB8IHdjIC1sCiAgICAgICAgOzsKICAgICAgInBlbmRpbmciKQogICAgICAgIGxvY2FsIHRvdGFsIGNvbXBsZXRlZAogICAgICAgIHRvdGFsPSQoZWNobyAiJGpzb24iIHwgZ3JlcCAtbyAnIm5hbWUiJyB8IHdjIC1sKQogICAgICAgIGNvbXBsZXRlZD0kKGVjaG8gIiRqc29uIiB8IGdyZXAgLW8gJyJzdGF0dXMiOiJjb21wbGV0ZWQiJyB8IHdjIC1sKQogICAgICAgIGVjaG8gJCgodG90YWwgLSBjb21wbGV0ZWQpKQogICAgICAgIDs7CiAgICBlc2FjCiAgfQoKICAjIEZ1bmN0aW9uIHRvIGV4dHJhY3QgY2hlY2sgZGV0YWlscwogIGV4dHJhY3RfY2hlY2tfZGV0YWlscygpIHsKICAgIGxvY2FsIGpzb249IiQxIgogICAgbG9jYWwgdHlwZT0iJDIiCgogICAgY2FzZSAiJHR5cGUiIGluCiAgICAgICJmYWlsZWQiKQogICAgICAgICMgRXh0cmFjdCBmYWlsZWQgY2hlY2sgbmFtZXMgYW5kIGNvbmNsdXNpb25zCiAgICAgICAgZWNobyAiJGpzb24iIHwgc2VkICdzL30sey9cbi9nJyB8IGdyZXAgJyJzdGF0dXMiOiJjb21wbGV0ZWQiJyB8IGdyZXAgLUUgJyJjb25jbHVzaW9uIjoiKGZhaWx1cmV8Y2FuY2VsbGVkfHRpbWVkX291dCkiJyB8IHNlZCAtRSAncy8uKiJuYW1lIjoiKFteIl0rKSIuKiJjb25jbHVzaW9uIjoiKFteIl0rKSIuKi8tIFwxIChcMikvJwogICAgICAgIDs7CiAgICAgICJwZW5kaW5nIikKICAgICAgICAjIEV4dHJhY3QgcGVuZGluZyBjaGVjayBuYW1lcyBhbmQgc3RhdHVzZXMKICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAtdiAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgc2VkIC1FICdzLy4qIm5hbWUiOiIoW14iXSspIi4qInN0YXR1cyI6IihbXiJdKykiLiovLSBcMSAoXDIpLycKICAgICAgICA7OwogICAgICAic3VjY2VzcyIpCiAgICAgICAgIyBFeHRyYWN0IHN1Y2Nlc3NmdWwgY2hlY2sgbmFtZXMKICAgICAgICBlY2hvICIkanNvbiIgfCBzZWQgJ3MvfSx7L1xuL2cnIHwgZ3JlcCAnInN0YXR1cyI6ImNvbXBsZXRlZCInIHwgZ3JlcCAnImNvbmNsdXNpb24iOiJzdWNjZXNzIicgfCBzZWQgLUUgJ3MvLioibmFtZSI6IihbXiJdKykiLiovLSBcMSDinIUvJwogICAgICAgIDs7CiAgICBlc2FjCiAgfQoKICAjIFVzZSBqcSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgZmFsbGJhY2sgcGFyc2luZwogIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBlY2hvICLwn5OLIFVzaW5nIGpxIGZvciBKU09OIHBhcnNpbmciCiAgICBUT1RBTF9DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnLiB8IGxlbmd0aCcpCiAgICBDT01QTEVURURfQ0hFQ0tTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIildIHwgbGVuZ3RoJykKICAgIFNVQ0NFU1NfQ0hFQ0tTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgLmNvbmNsdXNpb24gPT0gInN1Y2Nlc3MiKV0gfCBsZW5ndGgnKQogICAgRkFJTEVEX0NIRUNLUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICdbLltdIHwgc2VsZWN0KC5zdGF0dXMgPT0gImNvbXBsZXRlZCIgYW5kICguY29uY2x1c2lvbiA9PSAiZmFpbHVyZSIgb3IgLmNvbmNsdXNpb24gPT0gImNhbmNlbGxlZCIgb3IgLmNvbmNsdXNpb24gPT0gInRpbWVkX291dCIpKV0gfCBsZW5ndGgnKQogICAgUEVORElOR19DSEVDS1M9JChlY2hvICIkQ0lfSlNPTiIgfCBqcSAtciAnWy5bXSB8IHNlbGVjdCguc3RhdHVzICE9ICJjb21wbGV0ZWQiKV0gfCBsZW5ndGgnKQogIGVsc2UKICAgIGVjaG8gIvCfk4sgVXNpbmcgZmFsbGJhY2sgSlNPTiBwYXJzaW5nIChqcSBub3QgYXZhaWxhYmxlKSIKICAgIFRPVEFMX0NIRUNLUz0kKHBhcnNlX2NpX2pzb24gIiRDSV9KU09OIiAidG90YWwiKQogICAgQ09NUExFVEVEX0NIRUNLUz0kKHBhcnNlX2NpX2pzb24gIiRDSV9KU09OIiAiY29tcGxldGVkIikKICAgIFNVQ0NFU1NfQ0hFQ0tTPSQocGFyc2VfY2lfanNvbiAiJENJX0pTT04iICJzdWNjZXNzIikKICAgIEZBSUxFRF9DSEVDS1M9JChwYXJzZV9jaV9qc29uICIkQ0lfSlNPTiIgImZhaWxlZCIpCiAgICBQRU5ESU5HX0NIRUNLUz0kKHBhcnNlX2NpX2pzb24gIiRDSV9KU09OIiAicGVuZGluZyIpCiAgZmkKCiAgZWNobyAi8J+TiiBDSSBTdGF0dXMgU3VtbWFyeToiCiAgZWNobyAiICAtIFRvdGFsIGNoZWNrczogJFRPVEFMX0NIRUNLUyIKICBlY2hvICIgIC0gQ29tcGxldGVkOiAkQ09NUExFVEVEX0NIRUNLUyIKICBlY2hvICIgIC0gU3VjY2Vzc2Z1bDogJFNVQ0NFU1NfQ0hFQ0tTIgogIGVjaG8gIiAgLSBGYWlsZWQ6ICRGQUlMRURfQ0hFQ0tTIgogIGVjaG8gIiAgLSBQZW5kaW5nOiAkUEVORElOR19DSEVDS1MiCgogIEhBVkVfUFJfUkVGPWZhbHNlCiAgaWYgWyAtbiAiJFJFUE9fU0xVRyIgXSAmJiB7IFsgLW4gIiRQUl9OVU0iIF0gfHwgWyAtbiAiJFBSX1VSTCIgXTsgfTsgdGhlbgogICAgSEFWRV9QUl9SRUY9dHJ1ZQogICAgZW5zdXJlX3N0YXR1c19sYWJlbHMgIiRSRVBPX1NMVUciIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX0ZJWEVTfTpkNzNhNGE6UmVtZWRpYXRpb24gcmVxdWVzdGVkIGJ5IFRlc3MiIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX0ZJWElOR306ZmJjYTA0OlJleCBpcyBhY3RpdmVseSBhcHBseWluZyBmaXhlcyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfTkVFRFNfQ0xFT306MGU4YTE2OkF3YWl0aW5nIENsZW8gcXVhbGl0eSByZXZpZXciIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX05FRURTX1RFU1N9OjUzMTllNzpBd2FpdGluZyBUZXNzIFFBIHJldmlldyIgXAogICAgICAiJHtTVEFUVVNfTEFCRUxfQVBQUk9WRUR9OjJkYTQ0ZTpBbGwgYXV0b21hdGVkIHJldmlld3MgYXBwcm92ZWQiIFwKICAgICAgIiR7U1RBVFVTX0xBQkVMX0ZBSUxFRH06YjYwMjA1OlJlbWVkaWF0aW9uIGZhaWxlZCBvciBhYm9ydGVkIgogIGZpCgogIGlmIFsgIiRGQUlMRURfQ0hFQ0tTIiAtZ3QgMCBdOyB0aGVuCiAgICBlY2hvICLinYwgQ0kgZmFpbHVyZXMgZGV0ZWN0ZWQgLSBwb3N0aW5nIFJFUVVFU1QgQ0hBTkdFUyByZXZpZXciCiAgICAjIEdldCBkZXRhaWxzIG9mIGZhaWxlZCBjaGVja3MKICAgIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIEZBSUxFRF9ERVRBSUxTPSQoZWNobyAiJENJX0pTT04iIHwganEgLXIgJ1suW10gfCBzZWxlY3QoLnN0YXR1cyA9PSAiY29tcGxldGVkIiBhbmQgKC5jb25jbHVzaW9uID09ICJmYWlsdXJlIiBvciAuY29uY2x1c2lvbiA9PSAiY2FuY2VsbGVkIiBvciAuY29uY2x1c2lvbiA9PSAidGltZWRfb3V0IikpXSB8IG1hcCgiLSAiICsgLm5hbWUgKyAiICgiICsgLmNvbmNsdXNpb24gKyAiKSIpIHwgam9pbigiXG4iKScpCiAgICBlbHNlCiAgICAgIEZBSUxFRF9ERVRBSUxTPSQoZXh0cmFjdF9jaGVja19kZXRhaWxzICIkQ0lfSlNPTiIgImZhaWxlZCIpCiAgICBmaQoKICAgIHRpbWVvdXQgMzAgZ2ggcHIgcmV2aWV3ICIkUFJfTlVNIiAtLXJlcXVlc3QtY2hhbmdlcyAtLWJvZHkgIiMjIyDwn5S0IFJlcXVpcmVkIENoYW5nZXMKCiMjIENJIFN0YXR1cwrinYwgKipDSSBGYWlsdXJlcyBEZXRlY3RlZCoqOiAkRkFJTEVEX0NIRUNLUyBvdXQgb2YgJFRPVEFMX0NIRUNLUyBjaGVjayhzKSBmYWlsaW5nCuKdjCAqKkNhbm5vdCBhcHByb3ZlKio6IEFsbCBDSSBjaGVja3MgbXVzdCBwYXNzCgojIyBGYWlsZWQgQ2hlY2tzCiRGQUlMRURfREVUQUlMUwoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBGaXggYWxsIGZhaWxpbmcgQ0kgY2hlY2tzCi0gWyBdIEFkZHJlc3MgdGVzdCBmYWlsdXJlcwotIFsgXSBSZXNvbHZlIGJ1aWxkIGVycm9ycwotIFsgXSBWZXJpZnkgYWxsIHdvcmtmbG93cyBwYXNzCgoqKk5vdGUqKjogV2lsbCByZS1ldmFsdWF0ZSBvbmNlIENJIGlzc3VlcyBhcmUgcmVzb2x2ZWQuIiB8fCBlY2hvICLimqDvuI8gUFIgcmV2aWV3IGNvbW1hbmQgdGltZWQgb3V0IG9yIGZhaWxlZCAoZXhpdCBjb2RlOiAkPykiCgogICAgIyBMYWJlbCBtYW5pcHVsYXRpb24gcmVtb3ZlZCAtIHVzaW5nIEdpdEh1YiBQUiByZXZpZXdzIG9ubHkKICAgIHVwZGF0ZV9jb2RlcnVuX3N0YXR1cyAibmVlZHMtZml4ZXMiICJjaGFuZ2VzX3JlcXVlc3RlZCIgIiRQUl9VUkwiCiAgZWxpZiBbICIkUEVORElOR19DSEVDS1MiIC1ndCAwIF07IHRoZW4KICAgIGVjaG8gIuKPsyBDSSBjaGVja3Mgc3RpbGwgcGVuZGluZyAtIHBvc3RpbmcgUkVRVUVTVCBDSEFOR0VTIHJldmlldyIKICAgICMgR2V0IGRldGFpbHMgb2YgcGVuZGluZyBjaGVja3MKICAgIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIFBFTkRJTkdfREVUQUlMUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICdbLltdIHwgc2VsZWN0KC5zdGF0dXMgIT0gImNvbXBsZXRlZCIpXSB8IG1hcCgiLSAiICsgLm5hbWUgKyAiICgiICsgLnN0YXR1cyArICIpIikgfCBqb2luKCJcbiIpJykKICAgIGVsc2UKICAgICAgUEVORElOR19ERVRBSUxTPSQoZXh0cmFjdF9jaGVja19kZXRhaWxzICIkQ0lfSlNPTiIgInBlbmRpbmciKQogICAgZmkKCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1yZXF1ZXN0LWNoYW5nZXMgLS1ib2R5ICIjIyMg8J+UtCBSZXF1aXJlZCBDaGFuZ2VzCgojIyBDSSBTdGF0dXMK4o+zICoqQ0kgQ2hlY2tzIFBlbmRpbmcqKjogJFBFTkRJTkdfQ0hFQ0tTIG91dCBvZiAkVE9UQUxfQ0hFQ0tTIGNoZWNrKHMpIHN0aWxsIHJ1bm5pbmcK4p2MICoqQ2Fubm90IGFwcHJvdmUqKjogQWxsIENJIGNoZWNrcyBtdXN0IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseQoKIyMgUGVuZGluZyBDaGVja3MKJFBFTkRJTkdfREVUQUlMUwoKIyMgUmVxdWlyZWQgQWN0aW9ucwotIFsgXSBXYWl0IGZvciBhbGwgQ0kgY2hlY2tzIHRvIGNvbXBsZXRlCi0gWyBdIFZlcmlmeSBhbGwgY2hlY2tzIHBhc3Mgc3VjY2Vzc2Z1bGx5Ci0gWyBdIEFkZHJlc3MgYW55IGZhaWx1cmVzIHRoYXQgbWF5IG9jY3VyCgoqKk5vdGUqKjogV2lsbCByZS1ldmFsdWF0ZSBvbmNlIGFsbCBDSSBjaGVja3MgYXJlIGNvbXBsZXRlLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgoKICAgICMgTGFiZWwgbWFuaXB1bGF0aW9uIHJlbW92ZWQgLSB1c2luZyBHaXRIdWIgUFIgcmV2aWV3cyBvbmx5CiAgICAjIE5vdGU6IE5vIGxvbmdlciBzZXR0aW5nIG5lZWRzLXRlc3Mgc3RhdHVzIC0gR2l0SHViIFBSIHJldmlldyBzdGF0ZSBpcyB0aGUgc291cmNlIG9mIHRydXRoCiAgZWxpZiBbICIkU1VDQ0VTU19DSEVDS1MiIC1lcSAiJFRPVEFMX0NIRUNLUyIgXSAmJiBbICIkVE9UQUxfQ0hFQ0tTIiAtZ3QgMCBdOyB0aGVuCiAgICBlY2hvICLinIUgQWxsIENJIGNoZWNrcyBwYXNzaW5nIC0gcG9zdGluZyBBUFBST1ZFIHJldmlldyIKICAgICMgR2V0IGRldGFpbHMgb2Ygc3VjY2Vzc2Z1bCBjaGVja3MKICAgIGlmIGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIFNVQ0NFU1NfREVUQUlMUz0kKGVjaG8gIiRDSV9KU09OIiB8IGpxIC1yICdbLltdIHwgc2VsZWN0KC5zdGF0dXMgPT0gImNvbXBsZXRlZCIgYW5kIC5jb25jbHVzaW9uID09ICJzdWNjZXNzIildIHwgbWFwKCItICIgKyAubmFtZSArICIg4pyFIikgfCBqb2luKCJcbiIpJykKICAgIGVsc2UKICAgICAgU1VDQ0VTU19ERVRBSUxTPSQoZXh0cmFjdF9jaGVja19kZXRhaWxzICIkQ0lfSlNPTiIgInN1Y2Nlc3MiKQogICAgZmkKCiAgICB0aW1lb3V0IDMwIGdoIHByIHJldmlldyAiJFBSX05VTSIgLS1hcHByb3ZlIC0tYm9keSAiIyMjIOKchSBRQSBSZXZpZXcgZm9yIFRhc2sgJFRBU0tfSUQgLSBBUFBST1ZFRAoKIyMgUHJlLUFwcHJvdmFsIFZlcmlmaWNhdGlvbgrinIUgKipBTEwgQ0kgY2hlY2tzIHZlcmlmaWVkKio6ICRTVUNDRVNTX0NIRUNLUyBvdXQgb2YgJFRPVEFMX0NIRUNLUyBjaGVja3MgcGFzc2luZwrinIUgKipObyBmYWlsdXJlcyBmb3VuZCoqOiBaZXJvIGZhaWxpbmcgY2hlY2tzIGNvbmZpcm1lZAoKIyMgQ0kgU3RhdHVzCuKchSAqKkdpdEh1YiBBY3Rpb25zIENJKio6IEFsbCBjaGVja3MgcGFzc2luZwokU1VDQ0VTU19ERVRBSUxTCgojIyBUYXNrICRUQVNLX0lEIEFjY2VwdGFuY2UgQ3JpdGVyaWEK4pyFICoqQWxsIGNyaXRlcmlhIG1ldCoqOiBJbXBsZW1lbnRhdGlvbiBjb21wbGV0ZSBhbmQgdmVyaWZpZWQK4pyFICoqQ29kZSBxdWFsaXR5Kio6IFBhc3NlcyBhbGwgc3RhbmRhcmRzCuKchSAqKlRlc3RpbmcqKjogQ29tcHJlaGVuc2l2ZSB0ZXN0IGNvdmVyYWdlIGFjaGlldmVkCgojIyBGaW5hbCBBc3Nlc3NtZW50Ci0gKipRdWFsaXR5IFNjb3JlKio6IEV4Y2VsbGVudCBpbXBsZW1lbnRhdGlvbgotICoqUmVhZHkgZm9yIG1lcmdlKio6IEFsbCByZXF1aXJlbWVudHMgc2F0aXNmaWVkCi0gKipObyBvdXRzdGFuZGluZyBpc3N1ZXMqKjogQ2xlYW4sIHByb2R1Y3Rpb24tcmVhZHkgY29kZQoKKipBUFBST1ZFRCoqIC0gUmVhZHkgZm9yIG1lcmdlIHRvIG1haW4gYnJhbmNoLiIgfHwgZWNobyAi4pqg77iPIFBSIHJldmlldyBjb21tYW5kIHRpbWVkIG91dCBvciBmYWlsZWQgKGV4aXQgY29kZTogJD8pIgoKICAgICMgTGFiZWwgbWFuaXB1bGF0aW9uIHJlbW92ZWQgLSB1c2luZyBHaXRIdWIgUFIgcmV2aWV3cyBvbmx5CiAgICB1cGRhdGVfY29kZXJ1bl9zdGF0dXMgImFwcHJvdmVkIiAiYXBwcm92ZWQiICIkUFJfVVJMIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBVbmV4cGVjdGVkIENJIHN0YXRlIC0gcG9zdGluZyBSRVFVRVNUIENIQU5HRVMgcmV2aWV3IgogICAgdGltZW91dCAzMCBnaCBwciByZXZpZXcgIiRQUl9OVU0iIC0tcmVxdWVzdC1jaGFuZ2VzIC0tYm9keSAiIyMjIPCflLQgUmVxdWlyZWQgQ2hhbmdlcwoKIyMgQ0kgU3RhdHVzCuKaoO+4jyAqKlVuZXhwZWN0ZWQgQ0kgU3RhdGUqKjogVW5hYmxlIHRvIGRldGVybWluZSBmaW5hbCBDSSBzdGF0dXMK4p2MICoqQ2Fubm90IGFwcHJvdmUqKjogQ0kgc3RhdHVzIHVuY2xlYXIKCiMjIEN1cnJlbnQgU3RhdHVzCi0gVG90YWwgY2hlY2tzOiAkVE9UQUxfQ0hFQ0tTCi0gQ29tcGxldGVkOiAkQ09NUExFVEVEX0NIRUNLUwotIFN1Y2Nlc3NmdWw6ICRTVUNDRVNTX0NIRUNLUwotIEZhaWxlZDogJEZBSUxFRF9DSEVDS1MKLSBQZW5kaW5nOiAkUEVORElOR19DSEVDS1MKCiMjIFJlcXVpcmVkIEFjdGlvbnMKLSBbIF0gUmV2aWV3IENJIGNoZWNrIGNvbmZpZ3VyYXRpb24KLSBbIF0gRW5zdXJlIGFsbCBjaGVja3MgYXJlIHByb3Blcmx5IGRlZmluZWQKLSBbIF0gVmVyaWZ5IHdvcmtmbG93IGNvbXBsZXRpb24KLSBbIF0gQ29udGFjdCBhZG1pbmlzdHJhdG9yIGlmIGlzc3VlcyBwZXJzaXN0CgoqKk5vdGUqKjogV2lsbCByZS1ldmFsdWF0ZSBvbmNlIENJIHN0YXR1cyBpcyBjbGVhci4iIHx8IGVjaG8gIuKaoO+4jyBQUiByZXZpZXcgY29tbWFuZCB0aW1lZCBvdXQgb3IgZmFpbGVkIChleGl0IGNvZGU6ICQ/KSIKCiAgICAjIExhYmVsIG1hbmlwdWxhdGlvbiByZW1vdmVkIC0gdXNpbmcgR2l0SHViIFBSIHJldmlld3Mgb25seQogICAgdXBkYXRlX2NvZGVydW5fc3RhdHVzICJuZWVkcy1maXhlcyIgImNoYW5nZXNfcmVxdWVzdGVkIiAiJFBSX1VSTCIKICBmaQogIGZpCgplbHNlCiAgIyBHaXRIdWIgQ0xJIG5vdCBhdmFpbGFibGUgLSBza2lwIFBSIHJldmlldwogIGVjaG8gIvCfk50gU2tpcHBpbmcgUFIgcmV2aWV3IHBvc3RpbmcgZHVlIHRvIEdpdEh1YiBDTEkgdW5hdmFpbGFiaWxpdHkiCiAgZWNobyAi4pyFIFRlc3MgUUEgd29ya2Zsb3cgY29tcGxldGVkIGJ1dCBjb3VsZCBub3QgcG9zdCBQUiByZXZpZXciCmZpCgoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBERUJVRyBMT0dHSU5HOiBGSU5BTCBTVEFUVVMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQppZiBbICRDTEFVREVfRVhJVF9DT0RFIC1lcSAwIF07IHRoZW4KICBlY2hvICLinIUgVGVzcyBRQSB0ZXN0aW5nIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IFNVQ0NFU1MgKGV4aXQgY29kZSAwKSIKZWxzZQogIGVjaG8gIuKaoO+4jyBUZXNzIFFBIHRlc3RpbmcgZXhpdGVkIHdpdGggY29kZTogJENMQVVERV9FWElUX0NPREUiCiAgZWNobyAi8J+TiiBGaW5hbCBzdGF0dXM6IEZBSUxVUkUgKGV4aXQgY29kZSAkQ0xBVURFX0VYSVRfQ09ERSkiCiAgZWNobyAi8J+UjSBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgY2FjaGVfY29udHJvbCBvciBBUEkgZXJyb3Igb2NjdXJyZWQiCiAgZWNobyAi8J+TnSBOb3RlOiBDb250YWluZXIgd2lsbCBzdGlsbCBleGl0IHN1Y2Nlc3NmdWxseSB0byBhbGxvdyB3b3JrZmxvdyBjb250aW51YXRpb24iCmZpCgplY2hvICLwn5SNIFByb2Nlc3MgaW5mb3JtYXRpb246IgplY2hvICIgIC0gUElEOiAkQ0xBVURFX1BJRCIKZWNobyAiICAtIEV4aXQgY29kZTogJENMQVVERV9FWElUX0NPREUiCmVjaG8gIiAgLSBXb3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgplY2hvICIgIC0gUmVwb3NpdG9yeTogJFJFUE9fTkFNRSIKZWNobyAiICAtIFBSIFJldmlldzogUG9zdGVkIHRvICMkUFJfTlVNIgoKIyBTaWRlY2FyIHNodXRkb3duIGlzIGhhbmRsZWQgYnkgdGhlIEVYSVQgdHJhcCBkZWZpbmVkIGVhcmxpZXIKIyBUaGUgc2h1dGRvd25fc2lkZWNhciBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHNjcmlwdCBleGl0cwoKIyBQZXJmb3JtIGZpbmFsIGNsZWFudXAgb2Ygb3VyIG93biBwcm9jZXNzZXMKZWNobyAi8J+UpyBQZXJmb3JtaW5nIGZpbmFsIHByb2Nlc3MgY2xlYW51cC4uLiIKCiMgQ2xlYW4gdXAgYW55IGNoaWxkIHByb2Nlc3NlcyB3ZSBtYXkgaGF2ZSBzcGF3bmVkCmNsZWFudXBfY2hpbGRfcHJvY2Vzc2VzKCkgewogIGlmIFsgJCQgLWd0IDEgXSAmJiBbIC1kICIvcHJvYyIgXTsgdGhlbgogICAgIyBHZXQgYWxsIGNoaWxkIHByb2Nlc3NlcwogICAgbG9jYWwgY2hpbGRfcGlkcz0iIgogICAgY2hpbGRfcGlkcz0kKHBzIC1vIHBpZCxwcGlkIHwgYXdrIC12IHBwaWQ9JCQgJyQyID09IHBwaWQge3ByaW50ICQxfScgMj4vZGV2L251bGwgfHwgZWNobyAiIikKCiAgICBpZiBbIC1uICIkY2hpbGRfcGlkcyIgXTsgdGhlbgogICAgICBlY2hvICLwn5SNIEZvdW5kIGNoaWxkIHByb2Nlc3NlcyB0byBjbGVhbiB1cDogJGNoaWxkX3BpZHMiCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLVRFUk0gMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBzbGVlcCAyCiAgICAgIGVjaG8gIiRjaGlsZF9waWRzIiB8IHhhcmdzIGtpbGwgLUtJTEwgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBmaQp9CgpjbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcwoKICAjIENoZWNrIGlmIHRlc3Rpbmcgd2FzIHN1Y2Nlc3NmdWwKICAjIFRlc3MgaXMgc3VjY2Vzc2Z1bCBpZiBDbGF1ZGUgZXhpdGVkIGNsZWFubHkgKHRlc3RzIHNob3VsZCBwYXNzKQogIGlmIFsgJHtDTEFVREVfUElEOi0wfSAtbmUgMCBdOyB0aGVuCiAgICB3YWl0ICRDTEFVREVfUElEIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIENMQVVERV9FWElUX0NPREU9JD8KICBmaQogIAogIGlmIFsgJENMQVVERV9FWElUX0NPREUgLWVxIDAgXTsgdGhlbgogICAgZWNobyAi4pyFIEF0dGVtcHQgJEFUVEVNUFQ6IFRlc3RpbmcgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIKICAgIFNVQ0NFU1M9MQogICAgYnJlYWsKICBlbHNlCiAgICBlY2hvICLimqDvuI8gQXR0ZW1wdCAkQVRURU1QVDogVGVzdGluZyBpbmNvbXBsZXRlIChleGl0IGNvZGU6ICRDTEFVREVfRVhJVF9DT0RFKSIKICAgIAogICAgaWYgWyAkQVRURU1QVCAtbHQgJE1BWF9SRVRSSUVTIF07IHRoZW4KICAgICAgZWNobyAi8J+UhCBXaWxsIHJldHJ5Li4uICgkKChNQVhfUkVUUklFUyAtIEFUVEVNUFQpKSBhdHRlbXB0cyByZW1haW5pbmcpIgogICAgICBBVFRFTVBUPSQoKEFUVEVNUFQgKyAxKSkKICAgICAgZWNobyAiIgogICAgICAjIEJyaWVmIHBhdXNlIGJlZm9yZSByZXRyeQogICAgICBzbGVlcCAyCiAgICBlbHNlCiAgICAgIGVjaG8gIuKdjCBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHJlYWNoZWQiCiAgICAgIGJyZWFrCiAgICBmaQogIGZpCmRvbmUKCiMgUmVwb3J0IGZpbmFsIHN0YXR1cwplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi4pyFIFRFU1MgVEVTVElORyBTVUNDRVNTRlVMIgogIGVjaG8gIiAgIENvbXBsZXRlZCBhZnRlciAkQVRURU1QVCBhdHRlbXB0KHMpIgplbHNlCiAgZWNobyAi4pqg77iPIFRFU1MgVEVTVElORyBJTkNPTVBMRVRFIgogIGVjaG8gIiAgIEF0dGVtcHRlZCAkQVRURU1QVCB0aW1lKHMpIgogIGVjaG8gIiAgIFRlc3RzIG5vdCBwYXNzaW5nIgpmaQplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCgojIFdyaXRlIGNvbXBsZXRpb24gbWFya2VyIGZvciB3b3JrZmxvdyB0cmFja2luZwplY2hvICJ0ZXNzLXFhLWNvbXBsZXRlZDokKGRhdGUgLXUgKyVZLSVtLSVkVCVIOiVNOiVTWikiID4gL3dvcmtzcGFjZS8udGVzcy1jb21wbGV0ZQoKIyBGaW5hbCB0ZXJtaW5hdGlvbiBzZXF1ZW5jZQplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgVEVTUyBDT05UQUlORVIgVEVSTUlOQVRJT04gICAgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICJDb250YWluZXIgUElEOiAkJCIKZWNobyAiRmluYWwgUHJvY2VzcyBDaGVjazoiCnBzIGF1eCB8IGhlYWQgLTUKCiMgQ2xlYW51cCBGSUZPCnJtIC1mICIkRklGT19QQVRIIiAyPi9kZXYvbnVsbCB8fCB0cnVlCgojIEV4aXQgd2l0aCBhcHByb3ByaWF0ZSBjb2RlIGJhc2VkIG9uIHN1Y2Nlc3MKaWYgWyAkU1VDQ0VTUyAtZXEgMSBdOyB0aGVuCiAgZWNobyAi8J+UmiBUZXJtaW5hdGluZyBjb250YWluZXIgd2l0aCBzdWNjZXNzIHN0YXR1cy4uLiIKICBleGl0IDAKZWxzZQogIGVjaG8gIvCflJogVGVybWluYXRpbmcgY29udGFpbmVyIHdpdGggZmFpbHVyZSBzdGF0dXMuLi4iCiAgZWNobyAi8J+TnSBUZXN0aW5nIGluY29tcGxldGUgYWZ0ZXIgJEFUVEVNUFQgYXR0ZW1wdChzKSIKICBleGl0IDEKZmkK code_claude_container.sh.hbs: IyEvYmluL3NoCgojIEVuc3VyZSBSdXN0IGVudmlyb25tZW50IGlzIGFsd2F5cyBwcm9wZXJseSBzZXQgdXAKZWNobyAi8J+UpyBTZXR0aW5nIHVwIFJ1c3QgZW52aXJvbm1lbnQuLi4iCgojIFNvdXJjZSBSdXN0IGVudmlyb25tZW50IGlmIGF2YWlsYWJsZSAoZml4ZXMgY2FyZ28gbm90IGZvdW5kIGlzc3VlcykKaWYgWyAtZiAiJEhPTUUvLmNhcmdvL2VudiIgXTsgdGhlbgogICAgLiAiJEhPTUUvLmNhcmdvL2VudiIKICAgIGVjaG8gIuKckyBTb3VyY2VkIFJ1c3QgZW52aXJvbm1lbnQgZnJvbSAkSE9NRS8uY2FyZ28vZW52IgpmaQoKIyBBbHNvIHRyeSByb290IGNhcmdvIGVudiBhcyBmYWxsYmFjawppZiBbIC1mICIvcm9vdC8uY2FyZ28vZW52IiBdOyB0aGVuCiAgICAuICIvcm9vdC8uY2FyZ28vZW52IgogICAgZWNobyAi4pyTIFNvdXJjZWQgUnVzdCBlbnZpcm9ubWVudCBmcm9tIC9yb290Ly5jYXJnby9lbnYiCmZpCgojIEVuc3VyZSBydXN0dXAgaGFzIGEgZGVmYXVsdCB0b29sY2hhaW4gc2V0CmlmIGNvbW1hbmQgLXYgcnVzdHVwID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgcnVzdHVwIGRlZmF1bHQgc3RhYmxlIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGVjaG8gIuKckyBFbnN1cmVkIHN0YWJsZSBSdXN0IHRvb2xjaGFpbiBpcyBkZWZhdWx0IgplbHNlCiAgICBlY2hvICLimqDvuI8gcnVzdHVwIG5vdCBmb3VuZCBpbiBQQVRIIgpmaQoKIyBWZXJpZnkgUnVzdCBpcyBhdmFpbGFibGUKaWYgY29tbWFuZCAtdiBjYXJnbyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKckyBDYXJnbyBpcyBhdmFpbGFibGU6ICQoY2FyZ28gLS12ZXJzaW9uKSIKZWxzZQogICAgZWNobyAi4p2MIENhcmdvIG5vdCBmb3VuZCBpbiBQQVRIIgogICAgZWNobyAiQ3VycmVudCBQQVRIOiAkUEFUSCIKICAgIGVjaG8gIkF0dGVtcHRpbmcgdG8gZmluZCBjYXJnby4uLiIKICAgIGZpbmQgL3VzciAtbmFtZSBjYXJnbyAyPi9kZXYvbnVsbCB8IGhlYWQgLTUgfHwgZWNobyAiTm8gY2FyZ28gZm91bmQgaW4gL3VzciIKICAgIGZpbmQgL2hvbWUgLW5hbWUgY2FyZ28gMj4vZGV2L251bGwgfCBoZWFkIC01IHx8IGVjaG8gIk5vIGNhcmdvIGZvdW5kIGluIC9ob21lIgpmaQoKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwplY2hvICfilZEgICAgICAgICAgICAgICAgIElNUExFTUVOVEFUSU9OIFRBU0sgU1RBUlRJTkcgICAgICAgICAgICAgICAgIOKVkScKZWNobyAn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJwoKIyBEaXNhYmxlIGludGVyYWN0aXZlIEdpdCBwcm9tcHRzIGdsb2JhbGx5CmV4cG9ydCBHSVRfVEVSTUlOQUxfUFJPTVBUPTAKZXhwb3J0IEdJVF9BU0tQQVNTPS9iaW4vdHJ1ZQpleHBvcnQgU1NIX0FTS1BBU1M9L2Jpbi90cnVlCgojIFJlcG9zaXRvcnkgVVJMClJFUE9fVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCgojIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCmVjaG8gIlVzaW5nIEdpdEh1YiBBcHAgYXV0aGVudGljYXRpb24iCgojIEF1dGhlbnRpY2F0ZSB3aXRoIEdpdEh1YiBBcHAKaWYgWyAtbiAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiIF0gJiYgWyAtbiAiJEdJVEhVQl9BUFBfSUQiIF07IHRoZW4KICAgIGVjaG8gIkF1dGhlbnRpY2F0aW5nIHdpdGggR2l0SHViIEFwcC4uLiIKCiAgICAjIENyZWF0ZSB0ZW1wb3JhcnkgcHJpdmF0ZSBrZXkgZmlsZSAoc3VwcG9ydCBlc2NhcGVkIG5ld2xpbmVzKQogICAgVEVNUF9LRVlfRklMRT0iL3RtcC9naXRodWItYXBwLWtleS5wZW0iCiAgICBwcmludGYgJyViJyAiJEdJVEhVQl9BUFBfUFJJVkFURV9LRVkiID4gIiRURU1QX0tFWV9GSUxFIgogICAgY2htb2QgNjAwICIkVEVNUF9LRVlfRklMRSIKCiAgICAjIEdlbmVyYXRlIEpXVCB0b2tlbiBmb3IgR2l0SHViIEFwcCAoZml4ZWQgSldUIGdlbmVyYXRpb24gZm9yIExpbnV4IGNvbnRhaW5lcnMpCiAgICAjIEpXVCBoZWFkZXIKICAgIEpXVF9IRUFERVI9JChwcmludGYgJ3siYWxnIjoiUlMyNTYiLCJ0eXAiOiJKV1QifScgfCBiYXNlNjQgLXcgMCB8IHRyICcrLycgJy1fJyB8IHRyIC1kICc9JykKCiAgICAjIEpXVCBwYXlsb2FkIHdpdGggY3VycmVudCB0aW1lIGFuZCBleHBpcmF0aW9uICgxMCBtaW51dGVzKQogICAgTk9XPSQoZGF0ZSArJXMpCiAgICBFWFA9JCgoTk9XICsgNjAwKSkKICAgIEpXVF9QQVlMT0FEPSQocHJpbnRmICd7ImlhdCI6JWQsImV4cCI6JWQsImlzcyI6IiVzIn0nICIkTk9XIiAiJEVYUCIgIiRHSVRIVUJfQVBQX0lEIiB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQoKICAgICMgU2lnbiB0aGUgSldUCiAgICBKV1RfU0lHTkFUVVJFPSQocHJpbnRmICclcy4lcycgIiRKV1RfSEVBREVSIiAiJEpXVF9QQVlMT0FEIiB8IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduICIkVEVNUF9LRVlfRklMRSIgLWJpbmFyeSB8IGJhc2U2NCAtdyAwIHwgdHIgJysvJyAnLV8nIHwgdHIgLWQgJz0nKQogICAgSldUX1RPS0VOPSIkSldUX0hFQURFUi4kSldUX1BBWUxPQUQuJEpXVF9TSUdOQVRVUkUiCgogICAgIyBHZXQgaW5zdGFsbGF0aW9uIElEIGZvciB0aGUgcmVwb3NpdG9yeSAocm9idXN0IHBhcnNpbmcgb2Ygb3duZXIvcmVwbykKICAgIElOUFVUX1JFUE89Int7cmVwb3NpdG9yeV91cmx9fSIKICAgIFJFUE9fT1dORVI9IiIKICAgIFJFUE9fTkFNRT0iIgoKICAgIGlmIGVjaG8gIiRJTlBVVF9SRVBPIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS8oW14vXSspLy4qfFwxfCcpCiAgICAgICAgUkVQT19OQU1FPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS9bXi9dKy8oW14vXSspKFwuZ2l0KT98XDF8JykKICAgIGVsaWYgZWNobyAiJElOUFVUX1JFUE8iIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgIyBTU0ggZm9ybWF0IGdpdEBnaXRodWIuY29tOm93bmVyL3JlcG8oLmdpdCkKICAgICAgICBSRVBPX09XTkVSPSQoZWNobyAiJElOUFVUX1JFUE8iIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvLip8XDF8JykKICAgICAgICBSRVBPX05BTUU9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8Z2l0QGdpdGh1Yi5jb206W14vXSsvKFteL10rKShcLmdpdCk/fFwxfCcpCiAgICBlbHNlCiAgICAgICAgIyBGYWxsYmFjazogYXNzdW1lIHNsdWcgb3duZXIvcmVwbyAocG9zc2libHkgd2l0aCAuZ2l0KQogICAgICAgIFNMVUc9JChlY2hvICIkSU5QVVRfUkVQTyIgfCBzZWQgLUUgJ3N8XC5naXQkfHwnKQogICAgICAgIFJFUE9fT1dORVI9JChlY2hvICIkU0xVRyIgfCBjdXQgLWQnLycgLWYxKQogICAgICAgIFJFUE9fTkFNRT0kKGVjaG8gIiRTTFVHIiB8IGN1dCAtZCcvJyAtZjIpCiAgICBmaQoKICAgIGVjaG8gIkRFQlVHOiBQYXJzZWQgcmVwb3NpdG9yeSAtIE93bmVyOiAnJFJFUE9fT1dORVInLCBOYW1lOiAnJFJFUE9fTkFNRSciCgogICAgZWNobyAiR2V0dGluZyBpbnN0YWxsYXRpb24gSUQgZm9yICRSRVBPX09XTkVSLyRSRVBPX05BTUUuLi4iCgogICAgIyBHZXQgdGhlIGluc3RhbGxhdGlvbiBJRCAocmV0cnkgYW5kIGZvbGxvdyByZWRpcmVjdHMpLiBGYWxsYmFjayB0byBvcmcgaW5zdGFsbGF0aW9uLgogICAgSU5TVEFMTEFUSU9OX1JFU1BPTlNFPSQoY3VybCAtcyAtTCAtLXJldHJ5IDUgLS1yZXRyeS1kZWxheSAyIC0tcmV0cnktY29ubnJlZnVzZWQgXAogICAgICAgIC0tY29ubmVjdC10aW1lb3V0IDUgLS1tYXgtdGltZSAxMiBcCiAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiBcCiAgICAgICAgImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJFJFUE9fT1dORVIvJFJFUE9fTkFNRS9pbnN0YWxsYXRpb24iKQoKICAgIElOU1RBTExBVElPTl9JRD0kKGVjaG8gIiRJTlNUQUxMQVRJT05fUkVTUE9OU0UiIHwganEgLXIgJy5pZCcpCgogICAgaWYgWyAiJElOU1RBTExBVElPTl9JRCIgPSAibnVsbCIgXSB8fCBbIC16ICIkSU5TVEFMTEFUSU9OX0lEIiBdOyB0aGVuCiAgICAgICAgZWNobyAi4pqg77iPIFJlcG8gaW5zdGFsbGF0aW9uIG5vdCBmb3VuZCwgdHJ5aW5nIG9yZyBpbnN0YWxsYXRpb24uLi4iCiAgICAgICAgT1JHX0lOU1RBTExBVElPTl9SRVNQT05TRT0kKGN1cmwgLXMgLUwgLS1yZXRyeSA1IC0tcmV0cnktZGVsYXkgMiAtLXJldHJ5LWNvbm5yZWZ1c2VkIFwKICAgICAgICAgICAgLS1jb25uZWN0LXRpbWVvdXQgNSAtLW1heC10aW1lIDEyIFwKICAgICAgICAgICAgLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkSldUX1RPS0VOIiBcCiAgICAgICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICAgICAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9vcmdzLyRSRVBPX09XTkVSL2luc3RhbGxhdGlvbiIpCiAgICAgICAgSU5TVEFMTEFUSU9OX0lEPSQoZWNobyAiJE9SR19JTlNUQUxMQVRJT05fUkVTUE9OU0UiIHwganEgLXIgJy5pZCcpCiAgICBmaQoKICAgIGlmIFsgIiRJTlNUQUxMQVRJT05fSUQiID0gIm51bGwiIF0gfHwgWyAteiAiJElOU1RBTExBVElPTl9JRCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBJRCBmb3IgJFJFUE9fT1dORVIvJFJFUE9fTkFNRSIKICAgICAgICBlY2hvICJSZXNwb25zZSAocmVwbyk6ICRJTlNUQUxMQVRJT05fUkVTUE9OU0UiCiAgICAgICAgZWNobyAiUmVzcG9uc2UgKG9yZyk6ICAke09SR19JTlNUQUxMQVRJT05fUkVTUE9OU0U6LVtub25lXX0iCiAgICAgICAgcm0gLWYgIiRURU1QX0tFWV9GSUxFIgogICAgICAgIGV4aXQgMQogICAgZmkKCiAgICBlY2hvICJJbnN0YWxsYXRpb24gSUQ6ICRJTlNUQUxMQVRJT05fSUQiCgogICAgIyBHZXQgaW5zdGFsbGF0aW9uIGFjY2VzcyB0b2tlbgogICAgVE9LRU5fUkVTUE9OU0U9JChjdXJsIC1zIC1YIFBPU1QgXAogICAgICAgIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJEpXVF9UT0tFTiIgXAogICAgICAgIC1IICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbiIgXAogICAgICAgICJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zLyRJTlNUQUxMQVRJT05fSUQvYWNjZXNzX3Rva2VucyIpCgogICAgR0lUSFVCX1RPS0VOPSQoZWNobyAiJFRPS0VOX1JFU1BPTlNFIiB8IGpxIC1yICcudG9rZW4nKQoKICAgIGlmIFsgIiRHSVRIVUJfVE9LRU4iID0gIm51bGwiIF0gfHwgWyAteiAiJEdJVEhVQl9UT0tFTiIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKdjCBGYWlsZWQgdG8gZ2V0IGluc3RhbGxhdGlvbiBhY2Nlc3MgdG9rZW4iCiAgICAgICAgZWNobyAiUmVzcG9uc2U6ICRUT0tFTl9SRVNQT05TRSIKICAgICAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgICMgQ2xlYW4gdXAgdGVtcG9yYXJ5IGtleSBmaWxlCiAgICBybSAtZiAiJFRFTVBfS0VZX0ZJTEUiCgogICAgIyBFeHBvcnQgdGhlIHRva2VuIGZvciBnaXQgdG8gdXNlCiAgICBleHBvcnQgR0lUSFVCX1RPS0VOCgogICAgIyBDb25maWd1cmUgZ2l0IHRvIHVzZSB0aGUgdG9rZW4gKHVzZSAtLXJlcGxhY2UtYWxsIHRvIGhhbmRsZSBtdWx0aXBsZSBleGlzdGluZyBoZWxwZXJzKQogICAgZ2l0IGNvbmZpZyAtLWdsb2JhbCAtLXJlcGxhY2UtYWxsIGNyZWRlbnRpYWwuaGVscGVyIHN0b3JlCiAgICBlY2hvICJodHRwczovL3gtYWNjZXNzLXRva2VuOiR7R0lUSFVCX1RPS0VOfUBnaXRodWIuY29tIiA+IH4vLmdpdC1jcmVkZW50aWFscwoKICAgICMgQWxzbyBhdXRoZW50aWNhdGUgZ2ggQ0xJIHdpdGggdGhlIHRva2VuCiAgICBlY2hvICIkR0lUSFVCX1RPS0VOIiB8IGdoIGF1dGggbG9naW4gLS13aXRoLXRva2VuCgogICAgZWNobyAi4pyTIEdpdEh1YiBBcHAgYXV0aGVudGljYXRlZCBzdWNjZXNzZnVsbHkiCgplbHNlCiAgICBlY2hvICLinYwgR0lUSFVCX0FQUF9QUklWQVRFX0tFWSBvciBHSVRIVUJfQVBQX0lEIG5vdCBmb3VuZCIKICAgIGV4aXQgMQpmaQoKIyBHaXQgY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgLS1hZGQgc2FmZS5kaXJlY3RvcnkgL3dvcmtzcGFjZQoKIyBTZXQgR2l0SHViIEFwcCBhdHRyaWJ1dGlvbiAtIHVzZSBnZW5lcmljIGZvcm1hdCBmb3IgYWxsIGFnZW50cwpkZXJpdmVfYm90X2lkZW50aXR5KCkgewogICAgbG9jYWwgYXBwX25hbWU9IiQxIgoKICAgIGlmIFsgLXogIiRhcHBfbmFtZSIgXSB8fCBbICIkYXBwX25hbWUiID0gIm51bGwiIF07IHRoZW4KICAgICAgICBHSVRfQVVUSE9SX05BTUU9ImF1dG9tYXRpb25bYm90XSIKICAgICAgICBHSVRfQVVUSE9SX0VNQUlMPSJhdXRvbWF0aW9uW2JvdF1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIHJldHVybgogICAgZmkKCiAgICBsb2NhbCBzbHVnCiAgICBzbHVnPSQocHJpbnRmICclcycgIiRhcHBfbmFtZSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJyB8IHNlZCAtRSAncy9bXmEtejAtOV0rLy0vZycgfCBzZWQgLUUgJ3MvXi0rfC0rJC8vZycpCiAgICBpZiBbIC16ICIkc2x1ZyIgXTsgdGhlbgogICAgICAgIHNsdWc9JChwcmludGYgJyVzJyAiJGFwcF9uYW1lIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQogICAgZmkKCiAgICBsb2NhbCBib3RfbG9naW49IiR7c2x1Z31bYm90XSIKICAgIGxvY2FsIGJvdF9lbWFpbD0iJHtib3RfbG9naW59QHVzZXJzLm5vcmVwbHkuZ2l0aHViLmNvbSIKCiAgICBpZiBbIC1uICIke0dJVEhVQl9UT0tFTjotfSIgXTsgdGhlbgogICAgICAgIGxvY2FsIGVuY29kZWRfbG9naW4KICAgICAgICBlbmNvZGVkX2xvZ2luPSQocHJpbnRmICclcycgIiRib3RfbG9naW4iIHwgc2VkICdzL1xbLyU1Qi9nOyBzL1xdLyU1RC9nJykKICAgICAgICBsb2NhbCBib3RfcmVzcG9uc2UKICAgICAgICBib3RfcmVzcG9uc2U9JChjdXJsIC1zUyAtSCAiQXV0aG9yaXphdGlvbjogdG9rZW4gJEdJVEhVQl9UT0tFTiIgLUggIkFjY2VwdDogYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uIiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy8ke2VuY29kZWRfbG9naW59IiAyPi9kZXYvbnVsbCB8fCB0cnVlKQogICAgICAgIGxvY2FsIGJvdF9pZAogICAgICAgIGJvdF9pZD0kKHByaW50ZiAnJXMnICIkYm90X3Jlc3BvbnNlIiB8IGpxIC1yICcuaWQgLy8gZW1wdHknIDI+L2Rldi9udWxsIHx8IGVjaG8gJycpCiAgICAgICAgaWYgWyAtbiAiJGJvdF9pZCIgXTsgdGhlbgogICAgICAgICAgICBib3RfZW1haWw9IiR7Ym90X2lkfSske2JvdF9sb2dpbn1AdXNlcnMubm9yZXBseS5naXRodWIuY29tIgogICAgICAgIGZpCiAgICBmaQoKICAgIEdJVF9BVVRIT1JfTkFNRT0iJGJvdF9sb2dpbiIKICAgIEdJVF9BVVRIT1JfRU1BSUw9IiRib3RfZW1haWwiCn0KCkdJVEhVQl9BUFA9Int7Z2l0aHViX2FwcH19IgpkZXJpdmVfYm90X2lkZW50aXR5ICIkR0lUSFVCX0FQUCIKCiMgQ29uZmlndXJlIGdpdCB3aXRoIHByb3BlciBHaXRIdWIgQXBwIGF0dHJpYnV0aW9uCmdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lICIkR0lUX0FVVEhPUl9OQU1FIgpnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgIiRHSVRfQVVUSE9SX0VNQUlMIgoKIyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBDbGF1ZGUgQ29kZSB0byB1c2UKZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJEdJVF9BVVRIT1JfTkFNRSIKZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9IiRHSVRfQVVUSE9SX0VNQUlMIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9OQU1FPSIkR0lUX0FVVEhPUl9OQU1FIgpleHBvcnQgR0lUX0NPTU1JVFRFUl9FTUFJTD0iJEdJVF9BVVRIT1JfRU1BSUwiCmVjaG8gIuKckyBHaXQgY29uZmlndXJlZCIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi8J+UkCBBVVRIRU5USUNBVElPTiBWRVJJRklDQVRJT04iCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAiIgoKIyBSZXBvc2l0b3J5IFVSTHMgLSBIYW5kbGUgYm90aCBmdWxsIFVSTHMgYW5kIG9yZy9yZXBvIGZvcm1hdAojIENoZWNrIGlmIHJlcG9zaXRvcnlfdXJsIGFscmVhZHkgY29udGFpbnMgaHR0cHM6Ly9naXRodWIuY29tLwppZiBlY2hvICJ7e3JlcG9zaXRvcnlfdXJsfX0iIHwgZ3JlcCAtcSAiXmh0dHBzOi8vZ2l0aHViLmNvbS8iOyB0aGVuCiAgICBSRVBPX0hUVFBfVVJMPSJ7e3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7cmVwb3NpdG9yeV91cmx9fSIgfCBncmVwIC1xICJcLmdpdCQiOyB0aGVuCiAgICAgICAgUkVQT19IVFRQX1VSTD0iJHtSRVBPX0hUVFBfVVJMfS5naXQiCiAgICBmaQplbHNlCiAgICBSRVBPX0hUVFBfVVJMPSJodHRwczovL2dpdGh1Yi5jb20ve3tyZXBvc2l0b3J5X3VybH19LmdpdCIKZmkKCiMgU2FtZSBmb3IgZG9jcyByZXBvc2l0b3J5CmlmIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIl5odHRwczovL2dpdGh1Yi5jb20vIjsgdGhlbgogICAgRE9DU19IVFRQX1VSTD0ie3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0iCiAgICBpZiAhIGVjaG8gInt7ZG9jc19yZXBvc2l0b3J5X3VybH19IiB8IGdyZXAgLXEgIlwuZ2l0JCI7IHRoZW4KICAgICAgICBET0NTX0hUVFBfVVJMPSIke0RPQ1NfSFRUUF9VUkx9LmdpdCIKICAgIGZpCmVsc2UKICAgIERPQ1NfSFRUUF9VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS97e2RvY3NfcmVwb3NpdG9yeV91cmx9fS5naXQiCmZpCgojIERFQlVHOiBTaG93IHdoYXQgVVJMcyBhcmUgYmVpbmcgY29uc3RydWN0ZWQKZWNobyAi8J+UjSBERUJVRzogVVJMIENvbnN0cnVjdGlvbiAmIFBhcmFtZXRlcnMiCmVjaG8gIiAgSW5wdXQgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIElucHV0IGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19wcm9qZWN0X2RpcmVjdG9yeTogJ3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19JyIKZWNobyAiICBJbnB1dCB3b3JraW5nX2RpcmVjdG9yeTogJ3t7d29ya2luZ19kaXJlY3Rvcnl9fSciCmVjaG8gIiAgSW5wdXQgZG9jc19icmFuY2g6ICd7e2RvY3NfYnJhbmNofX0nIgplY2hvICIgIElucHV0IGdpdGh1Yl9hcHA6ICd7e2dpdGh1Yl9hcHB9fSciCmVjaG8gIiAgSW5wdXQgdGFza19pZDogJ3t7dGFza19pZH19JyIKZWNobyAiICBJbnB1dCBzZXJ2aWNlOiAne3tzZXJ2aWNlfX0nIgplY2hvICIgIENvbnN0cnVjdGVkIFJFUE9fSFRUUF9VUkw6ICckUkVQT19IVFRQX1VSTCciCmVjaG8gIiAgQ29uc3RydWN0ZWQgRE9DU19IVFRQX1VSTDogJyRET0NTX0hUVFBfVVJMJyIKZWNobyAiICBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCmVjaG8gIiAgQXZhaWxhYmxlIGVudmlyb25tZW50IHZhcmlhYmxlczoiCmVudiB8IGdyZXAgLUUgIihHSVRIVUJ8QU5USFJPUElDKSIgfCBzb3J0CgojIFRlc3QgSFRUUFMgYWNjZXNzIHRvIHJlcG9zaXRvcnkKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBIVFRQUyByZXBvc2l0b3J5IGFjY2Vzcy4uLiIKZWNobyAiICBDb21tYW5kOiBnaXQgbHMtcmVtb3RlIFwiJFJFUE9fSFRUUF9VUkxcIiBIRUFEIgppZiBnaXQgbHMtcmVtb3RlICIkUkVQT19IVFRQX1VSTCIgSEVBRCA+IC90bXAvcmVwb190ZXN0Lm91dCAyPiYxOyB0aGVuCiAgZWNobyAi4pyTIEhUVFBTIHJlcG9zaXRvcnkgYWNjZXNzIHN1Y2Nlc3NmdWwiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9yZXBvX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgSFRUUFMgcmVwb3NpdG9yeSBhY2Nlc3MgZmFpbGVkIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgZWNobyAiICBFcnJvciBvdXRwdXQ6ICQoY2F0IC90bXAvcmVwb190ZXN0Lm91dCkiCiAgZWNobyAiICBHaXQgY3JlZGVudGlhbCBoZWxwZXIgc3RhdHVzOiIKICBnaXQgY29uZmlnIC0tbGlzdCB8IGdyZXAgY3JlZGVudGlhbCB8fCBlY2hvICIgIE5vIGNyZWRlbnRpYWwgaGVscGVycyBjb25maWd1cmVkIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIHJlcG9zaXRvcnkgdmlhIEhUVFBTIgogIGV4aXQgMQpmaQoKIyBUZXN0IGRvY3MgcmVwb3NpdG9yeSBhY2Nlc3MKZWNobyAi8J+UjSBERUJVRzogVGVzdGluZyBkb2NzIHJlcG9zaXRvcnkgYWNjZXNzLi4uIgplY2hvICIgIENvbW1hbmQ6IGdpdCBscy1yZW1vdGUgXCIkRE9DU19IVFRQX1VSTFwiIEhFQUQiCmlmIGdpdCBscy1yZW1vdGUgIiRET0NTX0hUVFBfVVJMIiBIRUFEID4gL3RtcC9kb2NzX3Rlc3Qub3V0IDI+JjE7IHRoZW4KICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBzdWNjZXNzZnVsIgogIGVjaG8gIiAgUmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICBlY2hvICIgIE91dHB1dDogJChjYXQgL3RtcC9kb2NzX3Rlc3Qub3V0IHwgaGVhZCAtMSkiCmVsc2UKICBlY2hvICLinYwgRG9jcyByZXBvc2l0b3J5IGFjY2VzcyBmYWlsZWQiCiAgZWNobyAiICBSZXBvc2l0b3J5OiB7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSAoJERPQ1NfSFRUUF9VUkwpIgogIGVjaG8gIiAgRXJyb3Igb3V0cHV0OiAkKGNhdCAvdG1wL2RvY3NfdGVzdC5vdXQpIgogIGVjaG8gIiIKICBlY2hvICLwn5qrIEFCT1JUSU5HOiBDYW5ub3QgYWNjZXNzIGRvY3MgcmVwb3NpdG9yeSB2aWEgSFRUUFMiCiAgZXhpdCAxCmZpCgojIER1YWwgUmVwb3NpdG9yeSBTZXR1cCAtIFBsYXRmb3JtIHJlcG8gZm9yIGRvY3MsIFRhcmdldCByZXBvIGZvciBpbXBsZW1lbnRhdGlvbgplY2hvICIiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKZWNobyAi4pWRICAgICAgICAgICAgICAgICBEVUFMIFJFUE9TSVRPUlkgU0VUVVAgICAgICAgICAgICAgICAgICAgICAgICDilZEiCmVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKCiMgUmVwb3NpdG9yeSBJbmZvcm1hdGlvbgpET0NTX0JSQU5DSD0ie3tkb2NzX2JyYW5jaH19IgpHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgSGVscGVyOiBkZXJpdmUgc2FmZSB3b3Jrc3BhY2UgZGlyZWN0b3J5IG5hbWUgZnJvbSByZXBvIGlucHV0IChVUkwsIFNTSCwgb3Igc2x1ZykKc2FuaXRpemVfcmVwb19kaXIoKSB7CiAgICBpbnB1dD0iJDEiCiAgICBpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15odHRwczovL2dpdGh1Yi5jb20vJzsgdGhlbgogICAgICAgIG93bmVyPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xodHRwczovL2dpdGh1Yi5jb20vKFteL10rKS8uKnxcMXwnKQogICAgICAgIG5hbWU9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGh0dHBzOi8vZ2l0aHViLmNvbS9bXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxpZiBlY2hvICIkaW5wdXQiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgb3duZXI9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKykvLip8XDF8JykKICAgICAgICBuYW1lPSQoZWNobyAiJGlucHV0IiB8IHNlZCAtRSAnc3xnaXRAZ2l0aHViLmNvbTpbXi9dKy8oW14vXSspKFxcLmdpdCk/fFwxfCcpCiAgICAgICAgcHJpbnRmICclcy0lcycgIiRvd25lciIgIiRuYW1lIgogICAgZWxzZQogICAgICAgICMgQXNzdW1lIG93bmVyL3JlcG8gKG9wdGlvbmFsbHkgd2l0aCAuZ2l0KQogICAgICAgIHNsdWc9JChlY2hvICIkaW5wdXQiIHwgc2VkIC1FICdzfFxcLmdpdCR8fCcpCiAgICAgICAgZWNobyAiJHNsdWciIHwgdHIgJy8nICctJwogICAgZmkKfQoKIyBEZXJpdmUgd29ya3NwYWNlIGRpcmVjdG9yeSBuYW1lcyAob3duZXItcmVwbykKRE9DU19SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIpClRBUkdFVF9SRVBPX0RJUj0kKHNhbml0aXplX3JlcG9fZGlyICJ7e3JlcG9zaXRvcnlfdXJsfX0iKQoKZWNobyAiPT09IFJFUE9TSVRPUlkgU0VUVVAgPT09IgplY2hvICJEb2NzIHJlcG9zaXRvcnk6IHt7ZG9jc19yZXBvc2l0b3J5X3VybH19ICgkRE9DU19IVFRQX1VSTCkiCmVjaG8gIlRhcmdldCByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKZWNobyAiRG9jcyBicmFuY2g6ICRET0NTX0JSQU5DSCIKZWNobyAiR2l0SHViIEFwcDogJEdJVEhVQl9BUFAiCgojIERldGVybWluZSB3b3JrZmxvdyB0eXBlCmVjaG8gIvCflI0gREVCVUc6IFdvcmtmbG93IHR5cGUgZGV0ZWN0aW9uIgplY2hvICIgIGRvY3NfcmVwb3NpdG9yeV91cmw6ICd7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSciCmVjaG8gIiAgcmVwb3NpdG9yeV91cmw6ICd7e3JlcG9zaXRvcnlfdXJsfX0nIgplY2hvICIgIENvbXBhcmlzb24gcmVzdWx0OiAkKCBbICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgPSAie3tyZXBvc2l0b3J5X3VybH19IiBdICYmIGVjaG8gJ0VRVUFMJyB8fCBlY2hvICdESUZGRVJFTlQnICkiCgppZiBbICJ7e2RvY3NfcmVwb3NpdG9yeV91cmx9fSIgPSAie3tyZXBvc2l0b3J5X3VybH19IiBdOyB0aGVuCiAgICBlY2hvICLinJMgU2luZ2xlLXJlcG8gd29ya2Zsb3cgZGV0ZWN0ZWQgKHNhbWUgcmVwb3NpdG9yeSBmb3IgZG9jcyBhbmQgaW1wbGVtZW50YXRpb24pIgogICAgV09SS0ZMT1dfVFlQRT0ic2luZ2xlLXJlcG8iCiAgICBlY2hvICIgIOKUlOKUgCBUYXNrTWFzdGVyIGZpbGVzIGV4cGVjdGVkIGF0IHJlcG9zaXRvcnkgcm9vdCIKZWxzZQogICAgZWNobyAi4pyTIE11bHRpLXJlcG8gd29ya2Zsb3cgZGV0ZWN0ZWQgKHNlcGFyYXRlIGRvY3MgYW5kIHRhcmdldCByZXBvc2l0b3JpZXMpIgogICAgV09SS0ZMT1dfVFlQRT0ibXVsdGktcmVwbyIKICAgIGVjaG8gIiAg4pSU4pSAIFRhc2tNYXN0ZXIgZmlsZXMgZXhwZWN0ZWQgaW4gZG9jcyByZXBvIGF0OiB7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKZmkKZWNobyAi8J+UjSBERUJVRzogV09SS0ZMT1dfVFlQRSBzZXQgdG86ICRXT1JLRkxPV19UWVBFIgoKIyBSZXBvc2l0b3J5IFNldHVwIEJhc2VkIG9uIFdvcmtmbG93IFR5cGUKaWYgWyAiJFdPUktGTE9XX1RZUEUiID0gInNpbmdsZS1yZXBvIiBdOyB0aGVuCiAgICBlY2hvICI9PT0gU0lOR0xFLVJFUE8gV09SS0ZMT1cgPT09IgogICAgIyBDaGVjayBpZiByZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIChyZXRyeSBzY2VuYXJpbykKICAgIGVjaG8gIvCflI0gREVCVUc6IENoZWNraW5nIGZvciBleGlzdGluZyByZXBvc2l0b3J5IGRpcmVjdG9yeTogJFRBUkdFVF9SRVBPX0RJUiIKICAgIGVjaG8gIiAgV29ya3NwYWNlIGNvbnRlbnRzOiAkKGxzIC1sYSAvd29ya3NwYWNlLyB8IGdyZXAgLXYgJ150b3RhbCcpIgoKICAgIGlmIFsgLWQgIiRUQVJHRVRfUkVQT19ESVIiIF07IHRoZW4KICAgICAgICBlY2hvICLwn5SEIFJFUE9TSVRPUlk6IFVQREFURSAtIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIKICAgICAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHJlcG9zaXRvcnkgJyRUQVJHRVRfUkVQT19ESVInLCB1cGRhdGluZy4uLiIKICAgICAgICBlY2hvICIgIERpcmVjdG9yeSBjb250ZW50czogJChscyAtbGEgJFRBUkdFVF9SRVBPX0RJUiB8IGhlYWQgLTUpIgogICAgICAgIGNkICIkVEFSR0VUX1JFUE9fRElSIgogICAgICAgIGVjaG8gIiAgQ3VycmVudCBicmFuY2g6ICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCAyPi9kZXYvbnVsbCB8fCBlY2hvICd1bmtub3duJykiCiAgICAgICAgZWNobyAiICBHaXQgc3RhdHVzIGJlZm9yZSB1cGRhdGU6ICQoZ2l0IHN0YXR1cyAtLXBvcmNlbGFpbiB8IHdjIC1sKSBmaWxlcyBjaGFuZ2VkIgogICAgICAgIGdpdCBmZXRjaCBvcmlnaW4KICAgICAgICBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIKICAgICAgICBnaXQgcmVzZXQgLS1oYXJkICJvcmlnaW4vJERPQ1NfQlJBTkNIIgogICAgICAgIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgUmVwb3NpdG9yeSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSB0byAkRE9DU19CUkFOQ0giCiAgICBlbHNlCiAgICAgICAgZWNobyAi8J+TpSBSRVBPU0lUT1JZOiBDTE9OSU5HIC0gZmlyc3QgdGltZSBzZXR1cCIKICAgICAgICBlY2hvICIgIENsb25lIGNvbW1hbmQ6IGdpdCBjbG9uZSBcIiRSRVBPX0hUVFBfVVJMXCIgXCIkVEFSR0VUX1JFUE9fRElSXCIiCiAgICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJFRBUkdFVF9SRVBPX0RJUiI7IHRoZW4KICAgICAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSByZXBvc2l0b3J5OiB7e3JlcG9zaXRvcnlfdXJsfX0gKCRSRVBPX0hUVFBfVVJMKSIKICAgICAgICAgICAgZWNobyAiICBMYXN0IGdpdCBlcnJvcjogJChnaXQgY29uZmlnIC0tZ2V0LXJlZ2V4cCAnY3JlZGVudGlhbHxyZW1vdGUnKSIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKICAgICAgICBlY2hvICIgIENsb25lIHN1Y2Nlc3NmdWwsIGNoYW5naW5nIHRvIGRpcmVjdG9yeSBhbmQgY2hlY2tpbmcgb3V0ICRET0NTX0JSQU5DSCIKICAgICAgICBjZCAiJFRBUkdFVF9SRVBPX0RJUiIgJiYgZ2l0IGNoZWNrb3V0ICIkRE9DU19CUkFOQ0giICYmIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgUmVwb3NpdG9yeSBjbG9uZWQgc3VjY2Vzc2Z1bGx5IgogICAgICAgIGVjaG8gIiAgRmluYWwgZGlyZWN0b3J5IHN0cnVjdHVyZTogJChscyAtbGEgJFRBUkdFVF9SRVBPX0RJUiB8IGhlYWQgLTUpIgogICAgZmkKCiAgICAjIFByZXNlcnZlIFRhc2sgTWFzdGVyIGZpbGVzIGJlZm9yZSBicmFuY2ggc3dpdGNoaW5nIChzaW5nbGUtcmVwbyB3b3JrZmxvdykKICAgIGVjaG8gIvCflIQgUHJlc2VydmluZyBUYXNrIE1hc3RlciBmaWxlcyBmcm9tIGRvY3MgYnJhbmNoIGJlZm9yZSBzd2l0Y2hpbmcgdG8gZmVhdHVyZSBicmFuY2guLi4iCiAgICBURU1QX1RBU0tfRElSPSIvdG1wL3Rhc2ttYXN0ZXItcHJlc2VydmUiCiAgICBybSAtcmYgIiRURU1QX1RBU0tfRElSIgogICAgbWtkaXIgLXAgIiRURU1QX1RBU0tfRElSIgoKICAgIGNkICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIiCiAgICBlY2hvICLwn5SNIERFQlVHOiBUYXNrTWFzdGVyIGZpbGUgcHJlc2VydmF0aW9uIgogICAgZWNobyAiICBkb2NzX3Byb2plY3RfZGlyZWN0b3J5OiAne3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0nIgogICAgZWNobyAiICB0YXNrX2lkOiAne3t0YXNrX2lkfX0nIgoKICAgICMgQ29weSBUYXNrIE1hc3RlciBmaWxlcyBmcm9tIGRvY3MgYnJhbmNoIHRvIHRlbXBvcmFyeSBsb2NhdGlvbgogICAge3sjaWYgZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19CiAgICBpZiBbICJ7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIgPSAiLiIgXTsgdGhlbgogICAgICAgIFBSRVNFUlZFX0ZST009Ii93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi8udGFza21hc3Rlci9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCiAgICAgICAgZWNobyAiICDilJTilIAgVXNpbmcgcm9vdCB0YXNrbWFzdGVyIHBhdGggKGRvY3NfcHJvamVjdF9kaXJlY3Rvcnk9Jy4nKSIKICAgIGVsc2UKICAgICAgICBQUkVTRVJWRV9GUk9NPSIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIvZG9jcy90YXNrLXt7dGFza19pZH19IgogICAgICAgIGVjaG8gIiAg4pSU4pSAIFVzaW5nIHByb2plY3Qgc3ViZGlyZWN0b3J5OiB7e2RvY3NfcHJvamVjdF9kaXJlY3Rvcnl9fSIKICAgIGZpCiAgICB7e2Vsc2V9fQogICAgUFJFU0VSVkVfRlJPTT0iL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSLy50YXNrbWFzdGVyL2RvY3MvdGFzay17e3Rhc2tfaWR9fSIKICAgIGVjaG8gIiAg4pSU4pSAIFVzaW5nIGRlZmF1bHQgcm9vdCB0YXNrbWFzdGVyIHBhdGggKG5vIGRvY3NfcHJvamVjdF9kaXJlY3RvcnkpIgogICAge3svaWZ9fQoKICAgIGVjaG8gIiAgUFJFU0VSVkVfRlJPTSByZXNvbHZlZCB0bzogJFBSRVNFUlZFX0ZST00iCgogICAgZWNobyAi8J+UjSBERUJVRzogQXR0ZW1wdGluZyB0byBwcmVzZXJ2ZSBUYXNrIE1hc3RlciBmaWxlcyBmcm9tOiAkUFJFU0VSVkVfRlJPTSIKICAgIGVjaG8gIiAgQ2hlY2tpbmcgaWYgZGlyZWN0b3J5IGV4aXN0cy4uLiIKICAgIGlmIFsgLWQgIiRQUkVTRVJWRV9GUk9NIiBdOyB0aGVuCiAgICAgICAgZWNobyAiICDinJMgVGFza01hc3RlciBkaXJlY3RvcnkgZm91bmQhIgogICAgICAgIGVjaG8gIiAgRGlyZWN0b3J5IGNvbnRlbnRzOiAkKGxzIC1sYSAiJFBSRVNFUlZFX0ZST00iIHwgd2MgLWwpIGl0ZW1zIgogICAgICAgIGxzIC1sYSAiJFBSRVNFUlZFX0ZST00iCiAgICAgICAgY3AgLXIgIiRQUkVTRVJWRV9GUk9NIi8qICIkVEVNUF9UQVNLX0RJUi8iIDI+L2Rldi9udWxsICYmIGVjaG8gIuKckyBUYXNrIE1hc3RlciBmaWxlcyBwcmVzZXJ2ZWQgdG8gdGVtcG9yYXJ5IGxvY2F0aW9uIiB8fCBlY2hvICLimqDvuI8gU29tZSBmaWxlcyBtYXkgbm90IGhhdmUgYmVlbiBwcmVzZXJ2ZWQiCgogICAgICAgICMgQWxzbyBwcmVzZXJ2ZSBhcmNoaXRlY3R1cmUubWQgZnJvbSBkb2NzIGRpcmVjdG9yeSAob25lIGxldmVsIHVwIGZyb20gdGFzayBkaXJlY3RvcnkpCiAgICAgICAge3sjaWYgZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19CiAgICAgICAgaWYgWyAie3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0iID0gIi4iIF07IHRoZW4KICAgICAgICAgICAgQVJDSF9TT1VSQ0U9Ii93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi8udGFza21hc3Rlci9kb2NzL2FyY2hpdGVjdHVyZS5tZCIKICAgICAgICBlbHNlCiAgICAgICAgICAgIEFSQ0hfU09VUkNFPSIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIve3tkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0vLnRhc2ttYXN0ZXIvZG9jcy9hcmNoaXRlY3R1cmUubWQiCiAgICAgICAgZmkKICAgICAgICB7e2Vsc2V9fQogICAgICAgIEFSQ0hfU09VUkNFPSIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvLnRhc2ttYXN0ZXIvZG9jcy9hcmNoaXRlY3R1cmUubWQiCiAgICAgICAge3svaWZ9fQoKICAgICAgICBpZiBbIC1mICIkQVJDSF9TT1VSQ0UiIF07IHRoZW4KICAgICAgICAgICAgY3AgIiRBUkNIX1NPVVJDRSIgIiRURU1QX1RBU0tfRElSLyIgJiYgZWNobyAi4pyTIGFyY2hpdGVjdHVyZS5tZCBwcmVzZXJ2ZWQgZnJvbSBkb2NzIGJyYW5jaCIgfHwgZWNobyAi4pqg77iPIEZhaWxlZCB0byBwcmVzZXJ2ZSBhcmNoaXRlY3R1cmUubWQiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gYXJjaGl0ZWN0dXJlLm1kIG5vdCBmb3VuZCBhdDogJEFSQ0hfU09VUkNFIgogICAgICAgIGZpCgogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IFByZXNlcnZlZCBmaWxlczoiCiAgICAgICAgbHMgLWxhICIkVEVNUF9UQVNLX0RJUi8iIHx8IGVjaG8gIk5vIGZpbGVzIGluIHRlbXAgZGlyZWN0b3J5IgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBUYXNrIE1hc3RlciBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkUFJFU0VSVkVfRlJPTSIKICAgICAgICBlY2hvICLinYwgQ1JJVElDQUw6IFRhc2tNYXN0ZXIgZmlsZXMgbXVzdCBleGlzdCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIgogICAgICAgIGVjaG8gIuKdjCBFeHBlY3RlZCBsb2NhdGlvbjogJFBSRVNFUlZFX0ZST00iCiAgICAgICAgZWNobyAi4p2MIFRoaXMgam9iIGNhbm5vdCBjb250aW51ZSB3aXRob3V0IHRoZSBzcGVjaWZpZWQgVGFza01hc3RlciBmaWxlcyIKICAgICAgICBlY2hvICLinYwgVmVyaWZ5IHRoYXQ6IgogICAgICAgIGVjaG8gIiAgIDEuIFRoZSBkb2NzLXByb2plY3QtZGlyZWN0b3J5IHBhcmFtZXRlciBpcyBjb3JyZWN0IgogICAgICAgIGVjaG8gIiAgIDIuIFRoZSB0YXNrLWlkIGV4aXN0cyBpbiB0aGUgVGFza01hc3RlciBkaXJlY3RvcnkiCiAgICAgICAgZWNobyAiICAgMy4gVGhlIGRvY3MtYnJhbmNoIGNvbnRhaW5zIHRoZSBUYXNrTWFzdGVyIGZpbGVzIgogICAgICAgIGV4aXQgMQogICAgZmkKICAgIGNkIC93b3Jrc3BhY2UKCiAgICAjIFNldCB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcmVwb3NpdG9yeSByb290CiAgICBSRVBPX05BTUU9IiRUQVJHRVRfUkVQT19ESVIiCiAgICBlY2hvICLinJMgV29ya2luZyBkaXJlY3Rvcnk6IC93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKICAgIGVjaG8gIuKckyBUYXNrIGZpbGVzIHByZXNlcnZlZCBmcm9tIGRvY3MgYnJhbmNoIgoKZWxzZQogICAgZWNobyAiPT09IE1VTFRJLVJFUE8gV09SS0ZMT1cgPT09IgoKICAgICMgU3RlcCAxOiBDbG9uZSBvciB1cGRhdGUgZG9jcyByZXBvc2l0b3J5IHRlbXBvcmFyaWx5CiAgICBpZiBbIC1kICIvdG1wL2RvY3MtcmVwbyIgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflIQgRE9DUyBSRVBPU0lUT1JZOiBVUERBVEUgLSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGV4aXN0cyIKICAgICAgICBjZCAvdG1wL2RvY3MtcmVwbwogICAgICAgIGdpdCBmZXRjaCBvcmlnaW4KICAgICAgICBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIKICAgICAgICBnaXQgcmVzZXQgLS1oYXJkICJvcmlnaW4vJERPQ1NfQlJBTkNIIgogICAgICAgIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgRG9jcyByZXBvc2l0b3J5IHVwZGF0ZWQiCiAgICBlbHNlCiAgICAgICAgZWNobyAi8J+TpSBET0NTIFJFUE9TSVRPUlk6IENMT05JTkcgLSBleHRyYWN0aW5nIHRhc2sgZmlsZXMiCiAgICAgICAgaWYgISBnaXQgY2xvbmUgIiRET0NTX0hUVFBfVVJMIiAvdG1wL2RvY3MtcmVwbzsgdGhlbgogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNsb25lIGRvY3MgcmVwb3NpdG9yeToge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0gKCRET0NTX0hUVFBfVVJMKSIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKICAgICAgICBjZCAvdG1wL2RvY3MtcmVwbyAmJiBnaXQgY2hlY2tvdXQgIiRET0NTX0JSQU5DSCIgJiYgY2QgL3dvcmtzcGFjZQogICAgICAgIGVjaG8gIuKckyBEb2NzIHJlcG9zaXRvcnkgY2xvbmVkIHRvIHRlbXBvcmFyeSBsb2NhdGlvbiIKICAgIGZpCgogICAgIyBTdGVwIDI6IENsb25lIG9yIHVwZGF0ZSB0YXJnZXQgcmVwb3NpdG9yeQogICAgaWYgWyAtZCAiJFRBUkdFVF9SRVBPX0RJUiIgXTsgdGhlbgogICAgICAgIGVjaG8gIvCflIQgVEFSR0VUIFJFUE9TSVRPUlk6IFVQREFURSAtIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIKICAgICAgICBlY2hvICLwn5OBIEZvdW5kIGV4aXN0aW5nIHRhcmdldCByZXBvc2l0b3J5ICckVEFSR0VUX1JFUE9fRElSJywgdXBkYXRpbmcuLi4iCiAgICAgICAgY2QgIiRUQVJHRVRfUkVQT19ESVIiCiAgICAgICAgZ2l0IGZldGNoIG9yaWdpbiBtYWluCiAgICAgICAgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFpbgogICAgICAgIGNkIC93b3Jrc3BhY2UKICAgICAgICBlY2hvICLinJMgVGFyZ2V0IHJlcG9zaXRvcnkgdXBkYXRlZCBzdWNjZXNzZnVsbHkiCiAgICBlbHNlCiAgICAgICAgZWNobyAi8J+TpSBUQVJHRVQgUkVQT1NJVE9SWTogQ0xPTklORyAtIGZpcnN0IHRpbWUgc2V0dXAiCiAgICAgICAgaWYgISBnaXQgY2xvbmUgIiRSRVBPX0hUVFBfVVJMIiAiJFRBUkdFVF9SRVBPX0RJUiI7IHRoZW4KICAgICAgICAgICAgZWNobyAi4p2MIEZhaWxlZCB0byBjbG9uZSB0YXJnZXQgcmVwb3NpdG9yeToge3tyZXBvc2l0b3J5X3VybH19ICgkUkVQT19IVFRQX1VSTCkiCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCiAgICAgICAgZWNobyAi4pyTIFRhcmdldCByZXBvc2l0b3J5IGNsb25lZCBzdWNjZXNzZnVsbHkiCiAgICBmaQoKICAgICMgU3RlcCAzOiBDb3B5IHRhc2sgZmlsZXMgZnJvbSBkb2NzIHJlcG8gdG8gdGFyZ2V0IHJlcG8KICAgIGVjaG8gIvCfk4sgVEFTSyBGSUxFUzogQ09QWUlORyBmcm9tIGRvY3MgdG8gdGFyZ2V0IHJlcG9zaXRvcnkiCiAgICBta2RpciAtcCAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2siCgogICAgIyBEZXRlcm1pbmUgZG9jcyBwcm9qZWN0IGRpcmVjdG9yeSBwYXRoCiAgICB7eyNpZiBkb2NzX3Byb2plY3RfZGlyZWN0b3J5fX0KICAgIGlmIFsgInt7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19IiA9ICIuIiBdOyB0aGVuCiAgICAgICAgRE9DU19QQVRIPSIvdG1wL2RvY3MtcmVwby8udGFza21hc3RlciIKICAgIGVsc2UKICAgICAgICBET0NTX1BBVEg9Ii90bXAvZG9jcy1yZXBvL3t7ZG9jc19wcm9qZWN0X2RpcmVjdG9yeX19Ly50YXNrbWFzdGVyIgogICAgZmkKICAgIHt7ZWxzZX19CiAgICBET0NTX1BBVEg9Ii90bXAvZG9jcy1yZXBvLy50YXNrbWFzdGVyIgogICAge3svaWZ9fQoKICAgICMgQ29weSBzcGVjaWZpYyB0YXNrIGZpbGVzCiAgICBUQVNLX0RJUj0iJERPQ1NfUEFUSC9kb2NzL3Rhc2ste3t0YXNrX2lkfX0iCiAgICBlY2hvICLwn5SNIERFQlVHOiBMb29raW5nIGZvciB0YXNrIGZpbGVzIGF0OiAkVEFTS19ESVIiCiAgICBlY2hvICLwn5SNIERFQlVHOiBEb2NzIHBhdGggaXM6ICRET0NTX1BBVEgiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiBkb2NzIHRlbXAgZGlyZWN0b3J5OiIKICAgIGxzIC1sYSAvdG1wL2RvY3MtcmVwby8udGFza21hc3Rlci8gfHwgZWNobyAiTm8gLnRhc2ttYXN0ZXIgZm91bmQiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDb250ZW50cyBvZiBkb2NzIGRpcmVjdG9yeToiCiAgICBscyAtbGEgL3RtcC9kb2NzLXJlcG8vLnRhc2ttYXN0ZXIvZG9jcy8gfHwgZWNobyAiTm8gZG9jcyBkaXJlY3RvcnkgZm91bmQiCgogICAgaWYgWyAtZCAiJFRBU0tfRElSIiBdOyB0aGVuCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogVGFzayBkaXJlY3RvcnkgZm91bmQsIGNvbnRlbnRzOiIKICAgICAgICBscyAtbGEgIiRUQVNLX0RJUiIKCiAgICAgICAgZWNobyAi4pyFIENvcHlpbmcgdGFzay5tZC4uLiIKICAgICAgICBjcCAiJFRBU0tfRElSL3Rhc2subWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyB0YXNrLm1kIGNvcGllZCIgfHwgZWNobyAi4p2MIHRhc2subWQgY29weSBmYWlsZWQiCgogICAgICAgIGVjaG8gIuKchSBDb3B5aW5nIGFjY2VwdGFuY2UtY3JpdGVyaWEubWQuLi4iCiAgICAgICAgY3AgIiRUQVNLX0RJUi9hY2NlcHRhbmNlLWNyaXRlcmlhLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgYWNjZXB0YW5jZS1jcml0ZXJpYS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCBhY2NlcHRhbmNlLWNyaXRlcmlhLm1kIGNvcHkgZmFpbGVkIgoKICAgICAgICBlY2hvICLinIUgQ29weWluZyBwcm9tcHQubWQuLi4iCiAgICAgICAgY3AgIiRUQVNLX0RJUi9wcm9tcHQubWQiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iICYmIGVjaG8gIuKckyBwcm9tcHQubWQgY29waWVkIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIGNvcHkgZmFpbGVkIgoKICAgICAgICBlY2hvICLinIUgQ29weWluZyBjbGllbnQtY29uZmlnLmpzb24uLi4iCiAgICAgICAgaWYgWyAtZiAiJFRBU0tfRElSL2NsaWVudC1jb25maWcuanNvbiIgXTsgdGhlbgogICAgICAgICAgICBjcCAiJFRBU0tfRElSL2NsaWVudC1jb25maWcuanNvbiIgIiRDTEFVREVfV09SS19ESVIvY2xpZW50LWNvbmZpZy5qc29uIiAmJiBlY2hvICLinJMgY2xpZW50LWNvbmZpZy5qc29uIGNvcGllZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkiIHx8IGVjaG8gIuKdjCBjbGllbnQtY29uZmlnLmpzb24gY29weSBmYWlsZWQiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCAtIE1DUCBjbGllbnQgbWF5IG5vdCBiZSBjb25maWd1cmVkIgogICAgICAgIGZpCgogICAgICAgIGVjaG8gIuKchSBDb3B5aW5nIHRvb2xtYW4tZ3VpZGUubWQuLi4iCiAgICAgICAgaWYgWyAtZiAiJFRBU0tfRElSL3Rvb2xtYW4tZ3VpZGUubWQiIF07IHRoZW4KICAgICAgICAgICAgY3AgIiRUQVNLX0RJUi90b29sbWFuLWd1aWRlLm1kIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiAmJiBlY2hvICLinJMgdG9vbG1hbi1ndWlkZS5tZCBjb3BpZWQiIHx8IGVjaG8gIuKdjCB0b29sbWFuLWd1aWRlLm1kIGNvcHkgZmFpbGVkIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pqg77iPIHRvb2xtYW4tZ3VpZGUubWQgbm90IGZvdW5kIC0gY29kZSBhZ2VudCB3b24ndCBoYXZlIHRvb2wgdXNhZ2UgZ3VpZGFuY2UiCiAgICAgICAgZmkKCiAgICAgICAgZWNobyAi4pyTIFRhc2sge3t0YXNrX2lkfX0gZmlsZXMgY29waWVkIGZyb20gJFRBU0tfRElSIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBDUklUSUNBTDogVGFzayB7e3Rhc2tfaWR9fSBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0OiAkVEFTS19ESVIiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogQXZhaWxhYmxlIGRpcmVjdG9yaWVzIGluIGRvY3M6IgogICAgICAgIGZpbmQgL3RtcC9kb2NzLXJlcG8gLW5hbWUgInRhc2stKiIgLXR5cGUgZCB8fCBlY2hvICJObyB0YXNrIGRpcmVjdG9yaWVzIGZvdW5kIgogICAgZmkKCiAgICAjIENvcHkgYXJjaGl0ZWN0dXJlLm1kIGZyb20gZG9jcyByb290CiAgICBBUkNIX0ZJTEU9IiRET0NTX1BBVEgvZG9jcy9hcmNoaXRlY3R1cmUubWQiCiAgICBpZiBbIC1mICIkQVJDSF9GSUxFIiBdOyB0aGVuCiAgICAgICAgY3AgIiRBUkNIX0ZJTEUiICIvd29ya3NwYWNlLyRUQVJHRVRfUkVQT19ESVIvdGFzay8iCiAgICAgICAgZWNobyAi4pyTIEFyY2hpdGVjdHVyZSBkb2N1bWVudGF0aW9uIGNvcGllZCIKICAgIGVsc2UKICAgICAgICBlY2hvICLimqDvuI8gYXJjaGl0ZWN0dXJlLm1kIG5vdCBmb3VuZCBhdDogJEFSQ0hfRklMRSIKICAgIGZpCgogICAgIyBDb3B5IHRhc2tzLmpzb24gaWYgaXQgZXhpc3RzCiAgICBpZiBbIC1mICIkRE9DU19QQVRIL3Rhc2tzLmpzb24iIF07IHRoZW4KICAgICAgICBjcCAiJERPQ1NfUEFUSC90YXNrcy5qc29uIiAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIgogICAgICAgIGVjaG8gIuKckyB0YXNrcy5qc29uIGNvcGllZCIKICAgIGZpCgogICAgZWNobyAi4pyTIFRhc2sgZmlsZXMgY29waWVkIHRvIHRhcmdldCByZXBvc2l0b3J5IgoKICAgICMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKICAgIGVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhcmdldCB0YXNrIGRpcmVjdG9yeSBhZnRlciBjb3B5OiIKICAgIGxzIC1sYSAiL3dvcmtzcGFjZS8kVEFSR0VUX1JFUE9fRElSL3Rhc2svIiB8fCBlY2hvICJUYXNrIGRpcmVjdG9yeSBub3QgZm91bmQiCiAgICBlY2hvICLwn5SNIERFQlVHOiBDaGVja2luZyBpZiBwcm9tcHQubWQgZXhpc3RzOiIKICAgIFsgLWYgIi93b3Jrc3BhY2UvJFRBUkdFVF9SRVBPX0RJUi90YXNrL3Byb21wdC5tZCIgXSAmJiBlY2hvICLinIUgcHJvbXB0Lm1kIGV4aXN0cyIgfHwgZWNobyAi4p2MIHByb21wdC5tZCBtaXNzaW5nIgoKICAgICMgU3RlcCA0OiBDbGVhbiB1cCBkb2NzIHJlcG9zaXRvcnkKICAgIGVjaG8gIvCfp7kgQ0xFQU5VUDogUmVtb3ZpbmcgdGVtcG9yYXJ5IGRvY3MgcmVwb3NpdG9yeSIKICAgIHJtIC1yZiAvdG1wL2RvY3MtcmVwbwogICAgZWNobyAi4pyTIERvY3MgcmVwb3NpdG9yeSBjbGVhbmVkIHVwIgoKICAgICMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSByb290CiAgICBSRVBPX05BTUU9IiRUQVJHRVRfUkVQT19ESVIiCiAgICBlY2hvICLinJMgV29ya2luZyBkaXJlY3Rvcnk6IC93b3Jrc3BhY2UvJFJFUE9fTkFNRSIKZmkKCiMgU2V0dXAgZmVhdHVyZSBicmFuY2ggZm9yIGltcGxlbWVudGF0aW9uCmVjaG8gIj09PSBCUkFOQ0ggU0VUVVAgPT09IgpjZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FIgoKIyBTeW5jIHdpdGggbGF0ZXN0IG1haW4gdG8gcHJldmVudCBjb25mbGljdHMKZWNobyAi8J+UhCBTeW5jaW5nIHdpdGggbGF0ZXN0IG1haW4gdG8gcHJldmVudCBjb25mbGljdHMuLi4iCmdpdCBmZXRjaCBvcmlnaW4gbWFpbiAyPi9kZXYvbnVsbCB8fCBnaXQgZmV0Y2ggb3JpZ2luIG1hc3RlciAyPi9kZXYvbnVsbCB8fCBlY2hvICLimqDvuI8gQ291bGQgbm90IGZldGNoIG1haW4vbWFzdGVyIGJyYW5jaCIKCiMgQ3JlYXRlIG9yIGNoZWNrb3V0IGZlYXR1cmUgYnJhbmNoCkZFQVRVUkVfQlJBTkNIPSJmZWF0dXJlL3Rhc2ste3t0YXNrX2lkfX0taW1wbGVtZW50YXRpb24iCkJSQU5DSF9FWElTVFM9ImZhbHNlIgoKICAgIGlmIGdpdCBzaG93LXJlZiAtLXZlcmlmeSAtLXF1aWV0IHJlZnMvaGVhZHMvJEZFQVRVUkVfQlJBTkNIOyB0aGVuCiAgICAgICAgQlJBTkNIX0VYSVNUUz0idHJ1ZSIKICAgICAgICBlY2hvICJGZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBleGlzdHMsIGNoZWNraW5nIG91dC4uLiIKICAgICAgICBnaXQgY2hlY2tvdXQgJEZFQVRVUkVfQlJBTkNICgogICAgICAgIGVjaG8gIvCfk6UgTWVyZ2luZyBsYXRlc3QgbWFpbiBpbnRvICRGRUFUVVJFX0JSQU5DSC4uLiIKICAgICAgICBpZiBnaXQgbWVyZ2Ugb3JpZ2luL21haW4gLS1uby1lZGl0OyB0aGVuCiAgICAgICAgICAgIGVjaG8gIuKckyBTdWNjZXNzZnVsbHkgbWVyZ2VkIGxhdGVzdCBtYWluIGludG8gZmVhdHVyZSBicmFuY2giCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gTUVSR0UgQ09ORkxJQ1Q6IENhbm5vdCBhdXRvLW1lcmdlIG1haW4gaW50byAkRkVBVFVSRV9CUkFOQ0giCiAgICAgICAgICAgIGVjaG8gIuKdlyBNYW51YWwgY29uZmxpY3QgcmVzb2x1dGlvbiByZXF1aXJlZCBieSBDbGF1ZGUgYWdlbnQiCiAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgZWNobyAi8J+TiyBDb25mbGljdCBmaWxlczoiCiAgICAgICAgICAgIGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gfCBncmVwICJeVVVcfF5BQVx8XkREIiB8fCBlY2hvICIgICAoVXNlICdnaXQgc3RhdHVzJyB0byBzZWUgZGV0YWlscykiCiAgICAgICAgICAgIGVjaG8gIiIKICAgICAgICAgICAgZWNobyAi8J+UpyBDbGF1ZGUgd2lsbCBuZWVkIHRvIHJlc29sdmUgY29uZmxpY3RzIG1hbnVhbGx5IGJlZm9yZSBwcm9jZWVkaW5nIgogICAgICAgICAgICAjIERvbid0IGV4aXQgLSBsZXQgQ2xhdWRlIGhhbmRsZSB0aGUgY29uZmxpY3RzCiAgICAgICAgZmkKICAgIGVsc2UKICAgICAgICAjIENyZWF0ZSBuZXcgZmVhdHVyZSBicmFuY2ggZnJvbSBsYXRlc3QgbWFpbgogICAgICAgIGVjaG8gIkNyZWF0aW5nIG5ldyBmZWF0dXJlIGJyYW5jaCAnJEZFQVRVUkVfQlJBTkNIJyBmcm9tIGxhdGVzdCBtYWluLi4uIgogICAgICAgIGdpdCBjaGVja291dCAtYiAkRkVBVFVSRV9CUkFOQ0ggb3JpZ2luL21haW4KICAgICAgICBlY2hvICLinJMgQ3JlYXRlZCBmZWF0dXJlIGJyYW5jaDogJEZFQVRVUkVfQlJBTkNIIgogICAgZmkKCiMgNS4gU2V0IFdvcmtpbmcgRGlyZWN0b3J5IChDcml0aWNhbCBmb3IgQ2xhdWRlIEV4ZWN1dGlvbikKV09SS19ESVI9Int7d29ya2luZ19kaXJlY3Rvcnl9fSIKaWYgWyAiJFdPUktfRElSIiA9ICIuIiBdIHx8IFsgLXogIiRXT1JLX0RJUiIgXTsgdGhlbgogIENMQVVERV9XT1JLX0RJUj0iL3dvcmtzcGFjZS8kUkVQT19OQU1FIgplbHNlCiAgQ0xBVURFX1dPUktfRElSPSIvd29ya3NwYWNlLyRSRVBPX05BTUUvJFdPUktfRElSIgpmaQpta2RpciAtcCAiJENMQVVERV9XT1JLX0RJUiIgJiYgY2QgIiRDTEFVREVfV09SS19ESVIiCmVjaG8gIuKckyBTZXQgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIvCflJEgQ1JJVElDQUw6IENsYXVkZSB3aWxsIGJlIGxhdW5jaGVkIGZyb20gdGhpcyBkaXJlY3RvcnkiCgojIFdvcmtpbmcgZGlyZWN0b3J5IHNldHVwIGNvbXBsZXRlZCBhYm92ZQoKIyBDb25maWd1cmUgZ2l0IHVzZXIgYWZ0ZXIgc3VjY2Vzc2Z1bCBjbG9uZQplY2hvICI9PT0gUE9TVC1DTE9ORSBHSVQgQ09ORklHVVJBVElPTiA9PT0iCiMgRml4IGR1YmlvdXMgb3duZXJzaGlwIGlzc3VlcwpnaXQgY29uZmlnIC0tZ2xvYmFsIC0tYWRkIHNhZmUuZGlyZWN0b3J5ICIvd29ya3NwYWNlLyRSRVBPX05BTUUiCmVjaG8gIuKckyBBZGRlZCByZXBvc2l0b3J5IHRvIHNhZmUgZGlyZWN0b3JpZXMiCgojIFNldCBnaXQgY29uZmlnIGxvY2FsbHkgaW4gdGhlIHdvcmtpbmcgcmVwb3NpdG9yeSAocGVyc2lzdGVudCBvbiBQVkMpCmlmIFsgLWQgIi93b3Jrc3BhY2UvJFJFUE9fTkFNRS8uZ2l0IiBdOyB0aGVuCiAgICBjZCAiL3dvcmtzcGFjZS8kUkVQT19OQU1FIgogICAgZ2l0IGNvbmZpZyAtLWxvY2FsIHVzZXIubmFtZSAiJEdJVF9BVVRIT1JfTkFNRSIKICAgIGdpdCBjb25maWcgLS1sb2NhbCB1c2VyLmVtYWlsICIkR0lUX0FVVEhPUl9FTUFJTCIKICAgICMgU2V0IHVwIGF1dG9tYXRpYyB1cHN0cmVhbSBmb3IgbmV3IGJyYW5jaGVzCiAgICBnaXQgY29uZmlnIC0tbG9jYWwgcHVzaC5hdXRvU2V0dXBSZW1vdGUgdHJ1ZQogICAgZWNobyAi4pyTIENvbmZpZ3VyZWQgZ2l0IHVzZXIgaW4gdGFyZ2V0IHJlcG9zaXRvcnk6ICRHSVRfQVVUSE9SX05BTUUiCiAgICBlY2hvICLinJMgRW5hYmxlZCBhdXRvbWF0aWMgdXBzdHJlYW0gc2V0dXAgZm9yIG5ldyBicmFuY2hlcyIKZmkKCmNkIC93b3Jrc3BhY2UKCiMgQ29weSBDb25maWdNYXAgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkgKEFGVEVSIHJlcG9zaXRvcnkgY2xvbmUpCmVjaG8gIj09PSBDT05GSUdNQVAgRklMRSBTRVRVUCA9PT0iCgojIENsYXVkZSB3b3JraW5nIGRpcmVjdG9yeSBhbHJlYWR5IHNldCBhYm92ZSBkdXJpbmcgcmVwb3NpdG9yeSBzZXR1cAoKZWNobyAiU2V0dGluZyB1cCBmaWxlcyBpbiBDbGF1ZGUgd29ya2luZyBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmNkICIkQ0xBVURFX1dPUktfRElSIgoKIyBDb3B5IGFsbCBmaWxlcyBmcm9tIENvbmZpZ01hcCB0byB3b3JraW5nIGRpcmVjdG9yeQppZiBbIC1kICIvdGFzay1maWxlcyIgXTsgdGhlbgogIGVjaG8gIkNvcHlpbmcgQ29uZmlnTWFwIGZpbGVzIHRvIHdvcmtpbmcgZGlyZWN0b3J5Li4uIgoKICAjIENMQVVERS5tZCBNZW1vcnkgUGVyc2lzdGVuY2UgTG9naWMgKGNvbnRyb2xsZWQgYnkgb3ZlcndyaXRlTWVtb3J5IENSRCBmaWVsZCkKICAgICAgICBPVkVSV1JJVEVfTUVNT1JZPSJ7e292ZXJ3cml0ZV9tZW1vcnl9fSIKCiAgIyBIYW5kbGUgQ0xBVURFLm1kIGJhc2VkIG9uIG92ZXJ3cml0ZU1lbW9yeSBzZXR0aW5nCiAgICAgICAgaWYgWyAiJE9WRVJXUklURV9NRU1PUlkiID0gInRydWUiIF07IHRoZW4KICAgICAgICAgICMgT3ZlcndyaXRlIG1vZGU6IEFsd2F5cyByZXBsYWNlIENMQVVERS5tZCB3aXRoIGZyZXNoIHRlbXBsYXRlCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiJENMQVVERV9XT1JLX0RJUi9DTEFVREUubWQiCiAgICBjcCAiL3Rhc2stZmlsZXMvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICBlY2hvICLinJMgT3Zlcndyb3RlIENMQVVERS5tZCBtZW1vcnkgZmlsZSAoZnJlc2ggc3RhcnQgcmVxdWVzdGVkKSIKICAgICAgICAgIGVjaG8gIuKckyBDb3BpZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IGZvciBlYXN5IGFjY2VzcyIKICAgICAgICBlbHNlCiAgICAgICAgICAjIFByZXNlcnZlIG1vZGUgKGRlZmF1bHQpOiBPbmx5IGNvcHkgaWYgZG9lc24ndCBleGlzdAogICAgICAgICAgaWYgWyAhIC1mICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIgXTsgdGhlbgogICAgICAjIEluaXRpYWwgY3JlYXRpb24gLSBjb3B5IGZyb20gQ29uZmlnTWFwCiAgICAgIGNwICIvdGFzay1maWxlcy9DTEFVREUubWQiICIkQ0xBVURFX1dPUktfRElSL0NMQVVERS5tZCIKICAgICAgY3AgIi90YXNrLWZpbGVzL0NMQVVERS5tZCIgIi93b3Jrc3BhY2UvQ0xBVURFLm1kIgogICAgICAgICAgICBlY2hvICLinJMgQ3JlYXRlZCBpbml0aWFsIENMQVVERS5tZCBtZW1vcnkgZmlsZSIKICAgICAgICAgICAgZWNobyAi4pyTIENvcGllZCBDTEFVREUubWQgdG8gd29ya3NwYWNlIHJvb3QgZm9yIGVhc3kgYWNjZXNzIgogICAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinJMgUHJlc2VydmVkIGV4aXN0aW5nIENMQVVERS5tZCBtZW1vcnkgZmlsZSAobWFpbnRhaW5pbmcgYWNjdW11bGF0ZWQgY29udGV4dCkiCiAgICAgICAgICAgICMgU3RpbGwgY29weSB0byB3b3Jrc3BhY2Ugcm9vdCBmb3IgY29uc2lzdGVuY3kKICAgICAgICAgICAgY3AgIiRDTEFVREVfV09SS19ESVIvQ0xBVURFLm1kIiAiL3dvcmtzcGFjZS9DTEFVREUubWQiCiAgICAgICAgICAgIGVjaG8gIuKckyBTeW5jZWQgQ0xBVURFLm1kIHRvIHdvcmtzcGFjZSByb290IgogICAgICAgICAgZmkKICAgICAgICBmaQoKICAjIENvcHkgY2xpZW50LWNvbmZpZy5qc29uIHRvIHdvcmtzcGFjZSByb290IGZvciBNQ1AgY29uZmlndXJhdGlvbgogIGlmIFsgLWYgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgXTsgdGhlbgogICAgY3AgIi90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIgIi93b3Jrc3BhY2UvY2xpZW50LWNvbmZpZy5qc29uIgogICAgZWNobyAi4pyTIENvcGllZCBjbGllbnQtY29uZmlnLmpzb24gdG8gd29ya3NwYWNlIHJvb3QgZm9yIE1DUCBjb25maWd1cmF0aW9uIgogIGVsc2UKICAgIGVjaG8gIuKaoO+4jyBjbGllbnQtY29uZmlnLmpzb24gbm90IGZvdW5kIGluIHRhc2stZmlsZXMsIHVzaW5nIGRlZmF1bHRzIgogIGZpCgogICMgQ29weSBhbGwgb3RoZXIgbWFya2Rvd24gZmlsZXMgKGV4Y2x1ZGluZyBDTEFVREUubWQpCiAgZm9yIG1kX2ZpbGUgaW4gL3Rhc2stZmlsZXMvKi5tZDsgZG8KICAgIGlmIFsgLWYgIiRtZF9maWxlIiBdOyB0aGVuCiAgICAgIGJhc2VuYW1lX2ZpbGU9JChiYXNlbmFtZSAiJG1kX2ZpbGUiKQogICAgICAjIFNraXAgQ0xBVURFLm1kIHNpbmNlIHdlIGhhbmRsZWQgaXQgYWJvdmUKICAgICAgaWYgWyAiJGJhc2VuYW1lX2ZpbGUiICE9ICJDTEFVREUubWQiIF07IHRoZW4KICAgICAgICBjcCAiJG1kX2ZpbGUiICIkQ0xBVURFX1dPUktfRElSLyIKICAgICAgICBlY2hvICLinJMgVXBkYXRlZCAkYmFzZW5hbWVfZmlsZSIKICAgICAgZmkKICAgIGZpCiAgZG9uZQoKICAjIFZlcmlmeSBlbnRlcnByaXNlIHNldHRpbmdzIChtb3VudGVkIGRpcmVjdGx5IGZyb20gQ29uZmlnTWFwKQogIGlmIFsgLWYgIi9ldGMvY2xhdWRlLWNvZGUvbWFuYWdlZC1zZXR0aW5ncy5qc29uIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRW50ZXJwcmlzZSBzZXR0aW5ncyB2ZXJpZmllZCIKICAgIGlmICEganEgZW1wdHkgL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24gMj4vZGV2L251bGw7IHRoZW4KICAgICAgZWNobyAi4p2MIEludmFsaWQgZW50ZXJwcmlzZSBzZXR0aW5ncyBKU09OIgogICAgICBleGl0IDEKICAgIGZpCiAgZWxzZQogICAgZWNobyAi4p2MIEVudGVycHJpc2Ugc2V0dGluZ3Mgbm90IGZvdW5kIgogICAgZXhpdCAxCiAgZmkKCiAgIyBDb3B5IGd1aWRlbGluZXMgZmlsZXMgdG8gd29ya2luZyBkaXJlY3RvcnkKICBpZiBbIC1mICIvdGFzay1maWxlcy9jb2RpbmctZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvY29kaW5nLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBjb2RpbmctZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICBpZiBbIC1mICIvdGFzay1maWxlcy9naXRodWItZ3VpZGVsaW5lcy5tZCIgXTsgdGhlbgogICAgY3AgL3Rhc2stZmlsZXMvZ2l0aHViLWd1aWRlbGluZXMubWQgIiRDTEFVREVfV09SS19ESVIvIgogICAgZWNobyAi4pyTIENvcGllZCBnaXRodWItZ3VpZGVsaW5lcy5tZCB0byB3b3JraW5nIGRpcmVjdG9yeSIKICBmaQoKICAjIFN5c3RlbSBwcm9tcHQgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUgKG5vIGZpbGUgY29weWluZyBuZWVkZWQpCiAgZWNobyAi4pyTIFN5c3RlbSBwcm9tcHQgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCBpbmxpbmUiCgogICMgSG9vayBjb3B5aW5nIGRpc2FibGVkCiAgZWNobyAiISBIb29rIHNjcmlwdHMgZGlzYWJsZWQgLSBubyBob29rcyB3aWxsIGJlIGNvcGllZCIKCiAgIyBTZXQgdXAgTUNQIGNvbmZpZ3VyYXRpb24KICBlY2hvICJTZXR0aW5nIHVwIE1DUCBjb25maWd1cmF0aW9uLi4uIgoKICAjIENvcHkgTUNQIGNvbmZpZ3VyYXRpb24gZnJvbSBDb25maWdNYXAgdG8gcHJvamVjdCByb290IChwcm9qZWN0IHNjb3BlKQogIGlmIFsgLWYgIi90YXNrLWZpbGVzL21jcC5qc29uIiBdOyB0aGVuCiAgICBjcCAvdGFzay1maWxlcy9tY3AuanNvbiAiJENMQVVERV9XT1JLX0RJUi8ubWNwLmpzb24iCiAgICBlY2hvICLinJMgQ29waWVkIG1jcC5qc29uIHRvIC5tY3AuanNvbiAocHJvamVjdCBzY29wZSkiCiAgZWxzZQogICAgZWNobyAi4pqg77iPICBtY3AuanNvbiB0ZW1wbGF0ZSBub3QgZm91bmQiCiAgZmkKCiAgIyBFbnRlcnByaXNlIG1hbmFnZWQgc2V0dGluZ3MgYXJlIG1vdW50ZWQgZGlyZWN0bHkgZnJvbSBDb25maWdNYXAKICBlY2hvICI9PT0gRU5URVJQUklTRSBNQU5BR0VEIFNFVFRJTkdTID09PSIKICBlY2hvICLinJMgU2V0dGluZ3MgbW91bnRlZCBkaXJlY3RseSBmcm9tIENvbmZpZ01hcCBhdDogL2V0Yy9jbGF1ZGUtY29kZS9tYW5hZ2VkLXNldHRpbmdzLmpzb24iCiAgZWNobyAi4pyTIE5vIGNvcHlpbmcgbmVlZGVkIC0gbW91bnQgYXV0b21hdGljYWxseSByZWZsZWN0cyBsYXRlc3QgQ29uZmlnTWFwIGNoYW5nZXMiCgogIGVjaG8gIuKckyBDb25maWdNYXAgZmlsZXMgY29waWVkIHRvICRDTEFVREVfV09SS19ESVIiCmVsc2UKICBlY2hvICLimqDvuI8gIFdhcm5pbmc6IC90YXNrLWZpbGVzIGRpcmVjdG9yeSBub3QgZm91bmQgKENvbmZpZ01hcCBub3QgbW91bnRlZD8pIgpmaQoKCiMgQ29weSBDdXJyZW50IFRhc2sgRG9jdW1lbnRhdGlvbiB0byBXb3JraW5nIERpcmVjdG9yeQplY2hvICI9PT0gVEFTSyBET0NVTUVOVEFUSU9OIFNFVFVQID09PSIKZWNobyAi8J+UjSBERUJVRzogV09SS0ZMT1dfVFlQRSBpczogJFdPUktGTE9XX1RZUEUiCmVjaG8gIvCflI0gREVCVUc6IFJFUE9fTkFNRSBpczogJFJFUE9fTkFNRSIKZWNobyAi8J+UjSBERUJVRzogQ0xBVURFX1dPUktfRElSIGlzOiAkQ0xBVURFX1dPUktfRElSIgplY2hvICLwn5SNIERFQlVHOiBUYXNrIElEIGlzOiB7e3Rhc2tfaWR9fSIKCiMgVGFzayBkaXJlY3Rvcnkgc2hvdWxkIGFscmVhZHkgZXhpc3QgZnJvbSBtdWx0aS1yZXBvIHdvcmtmbG93IG9yIGJlIGNyZWF0ZWQgYXMgbmVlZGVkCm1rZGlyIC1wICIkQ0xBVURFX1dPUktfRElSL3Rhc2siCmVjaG8gIuKckyBDcmVhdGVkIHRhc2sgZGlyZWN0b3J5IGF0OiAkQ0xBVURFX1dPUktfRElSL3Rhc2siCgojIFRhc2sgZG9jdW1lbnRhdGlvbiBzaG91bGQgYWxyZWFkeSBiZSBhdmFpbGFibGUgaW4gdGhlIHRhc2svIGRpcmVjdG9yeQppZiBbICIkV09SS0ZMT1dfVFlQRSIgPSAic2luZ2xlLXJlcG8iIF07IHRoZW4KICAgIGVjaG8gIuKckyBSZXN0b3JpbmcgdGFzayBkb2N1bWVudGF0aW9uIGZyb20gcHJlc2VydmVkIHRlbXBvcmFyeSBsb2NhdGlvbiIKCiAgICAjIFVzZSB0aGUgcHJlc2VydmVkIFRhc2sgTWFzdGVyIGZpbGVzIGZyb20gdGVtcG9yYXJ5IGxvY2F0aW9uCiAgICBURU1QX1RBU0tfRElSPSIvdG1wL3Rhc2ttYXN0ZXItcHJlc2VydmUiCiAgICBlY2hvICLwn5SNIERFQlVHOiBSZXN0b3JpbmcgdGFzayBmaWxlcyBmcm9tOiAkVEVNUF9UQVNLX0RJUiIKCiAgICBpZiBbIC1kICIkVEVNUF9UQVNLX0RJUiIgXSAmJiBbICIkKGxzIC1BICRURU1QX1RBU0tfRElSIDI+L2Rldi9udWxsKSIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBQcmVzZXJ2ZWQgVGFzayBNYXN0ZXIgZmlsZXMgZm91bmQiCiAgICAgICAgZWNobyAi8J+UjSBERUJVRzogUHJlc2VydmVkIHRhc2sgZmlsZXM6IgogICAgICAgIGxzIC1sYSAiJFRFTVBfVEFTS19ESVIvIgoKICAgICAgICBlY2hvICLinIUgQ29weWluZyBhbGwgcHJlc2VydmVkIGZpbGVzIHRvIHRhc2sgZGlyZWN0b3J5Li4uIgoKICAgICAgICAjIENvcHkgYWxsIGZpbGVzIGZyb20gcHJlc2VydmVkIGRpcmVjdG9yeSB0byB0YXNrIGRpcmVjdG9yeQogICAgICAgIGlmIGNwIC1yICIkVEVNUF9UQVNLX0RJUiIvKiAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgZWNobyAi4pyTIEFsbCB0YXNrIGZpbGVzIGNvcGllZCBmcm9tIHByZXNlcnZlZCB0ZW1wb3JhcnkgbG9jYXRpb24iCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLinYwgRmFpbGVkIHRvIGNvcHkgdGFzayBmaWxlcyBmcm9tIHByZXNlcnZlZCBsb2NhdGlvbiIKICAgICAgICAgICAgZXhpdCAxCiAgICAgICAgZmkKCiAgICAgICAgIyBDb3B5IHRhc2sudHh0IGFzIHRhc2subWQgaWYgaXQgZXhpc3RzIChzcGVjaWZpYyByZW5hbWUgbmVlZGVkKQogICAgICAgIGlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay90YXNrLnR4dCIgXTsgdGhlbgogICAgICAgICAgICBjcCAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rhc2sudHh0IiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Rhc2subWQiICYmIGVjaG8gIuKckyB0YXNrLnR4dCBjb3BpZWQgYXMgdGFzay5tZCIgfHwgZWNobyAi4p2MIHRhc2sudHh0IGNvcHkgZmFpbGVkIgogICAgICAgIGZpCgogICAgICAgICMgTW92ZSBjbGllbnQtY29uZmlnLmpzb24gdG8gQ2xhdWRlIHdvcmtpbmcgZGlyZWN0b3J5IChub3QgaW4gdGFzay8gc3ViZGlyZWN0b3J5KQogICAgICAgIGlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay9jbGllbnQtY29uZmlnLmpzb24iIF07IHRoZW4KICAgICAgICAgICAgbXYgIiRDTEFVREVfV09SS19ESVIvdGFzay9jbGllbnQtY29uZmlnLmpzb24iICIkQ0xBVURFX1dPUktfRElSL2NsaWVudC1jb25maWcuanNvbiIgJiYgZWNobyAi4pyTIGNsaWVudC1jb25maWcuanNvbiBtb3ZlZCB0byBDbGF1ZGUgd29ya2luZyBkaXJlY3RvcnkiIHx8IGVjaG8gIuKdjCBjbGllbnQtY29uZmlnLmpzb24gbW92ZSBmYWlsZWQiCiAgICAgICAgZWxzZQogICAgICAgICAgICBlY2hvICLimqDvuI8gY2xpZW50LWNvbmZpZy5qc29uIG5vdCBmb3VuZCAtIE1DUCBjbGllbnQgbWF5IG5vdCBiZSBjb25maWd1cmVkIgogICAgICAgIGZpCgogICAgICAgIGVjaG8gIuKckyBUYXNrIHt7dGFza19pZH19IGZpbGVzIGNvcGllZCBmcm9tIHByZXNlcnZlZCB0ZW1wb3JhcnkgbG9jYXRpb24iCgogICAgICAgICMgQ2xlYW4gdXAgdGVtcG9yYXJ5IGRpcmVjdG9yeQogICAgICAgIHJtIC1yZiAiJFRFTVBfVEFTS19ESVIiCiAgICAgICAgZWNobyAi4pyTIENsZWFuZWQgdXAgdGVtcG9yYXJ5IHByZXNlcnZhdGlvbiBkaXJlY3RvcnkiCiAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIENSSVRJQ0FMOiBObyBwcmVzZXJ2ZWQgVGFzayBNYXN0ZXIgZmlsZXMgZm91bmQgYXQ6ICRURU1QX1RBU0tfRElSIgogICAgICAgIGVjaG8gIvCflI0gREVCVUc6IFRoaXMgaW5kaWNhdGVzIHRoZSBUYXNrIE1hc3RlciBwcmVzZXJ2YXRpb24gc3RlcCBmYWlsZWQgZWFybGllciIKICAgICAgICBlY2hvICLinYwgVGFzayB7e3Rhc2tfaWR9fSBmaWxlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBqb2IiCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgICMgREVCVUc6IFZlcmlmeSBmaWxlcyB3ZXJlIGNvcGllZCBzdWNjZXNzZnVsbHkKICAgIGVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhcmdldCB0YXNrIGRpcmVjdG9yeSBhZnRlciBjb3B5OiIKICAgIGxzIC1sYSAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIgogICAgZWNobyAi8J+UjSBERUJVRzogQ2hlY2tpbmcgaWYgcHJvbXB0Lm1kIGV4aXN0czoiCiAgICBbIC1mICIkQ0xBVURFX1dPUktfRElSL3Rhc2svcHJvbXB0Lm1kIiBdICYmIGVjaG8gIuKchSBwcm9tcHQubWQgZXhpc3RzIiB8fCBlY2hvICLinYwgcHJvbXB0Lm1kIG1pc3NpbmciCgplbHNlCiAgICBlY2hvICLinJMgVGFzayBkb2N1bWVudGF0aW9uIGNvcGllZCBmcm9tIGRvY3MgcmVwb3NpdG9yeSBkdXJpbmcgbXVsdGktcmVwbyBzZXR1cCIKZmkKCiMgVmVyaWZ5IGNsaWVudC1jb25maWcuanNvbiBpcyBhdmFpbGFibGUgaW4gQ2xhdWRlJ3Mgd29ya2luZyBkaXJlY3RvcnkKZWNobyAiPT09IFRPT0xNQU4gQ09ORklHIFNFVFVQID09PSIKV09SS1NQQUNFX0NGRz0iJENMQVVERV9XT1JLX0RJUi9jbGllbnQtY29uZmlnLmpzb24iClNPVVJDRV9DRkc9Ii90YXNrLWZpbGVzL2NsaWVudC1jb25maWcuanNvbiIKCiMgSGVscGVyIHRvIGNoZWNrIG5vbi1lbXB0eSBKU09OIG9iamVjdAppc192YWxpZF9jZmcoKSB7CiAgbG9jYWwgcD0iJDEiCiAgWyAtZiAiJHAiIF0gfHwgcmV0dXJuIDEKICBqcSAtZSAndHlwZT09Im9iamVjdCIgYW5kIGxlbmd0aD4wJyAiJHAiID4vZGV2L251bGwgMj4mMQp9CgpTUkNfT0s9ZmFsc2UKV1NfT0s9ZmFsc2UKaWYgaXNfdmFsaWRfY2ZnICIkU09VUkNFX0NGRyI7IHRoZW4gU1JDX09LPXRydWU7IGZpCmlmIGlzX3ZhbGlkX2NmZyAiJFdPUktTUEFDRV9DRkciOyB0aGVuIFdTX09LPXRydWU7IGZpCgppZiAkU1JDX09LOyB0aGVuCiAgZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHPSIkU09VUkNFX0NGRyIKICBlY2hvICLinJMgU2VsZWN0ZWQgTUNQX0NMSUVOVF9DT05GSUcgZnJvbSBzb3VyY2UgQ29uZmlnTWFwOiAkTUNQX0NMSUVOVF9DT05GSUciCmVsaWYgJFdTX09LOyB0aGVuCiAgZXhwb3J0IE1DUF9DTElFTlRfQ09ORklHPSIkV09SS1NQQUNFX0NGRyIKICBlY2hvICLinJMgU2VsZWN0ZWQgTUNQX0NMSUVOVF9DT05GSUcgZnJvbSB3b3Jrc3BhY2UgY29weTogJE1DUF9DTElFTlRfQ09ORklHIgplbHNlCiAgZWNobyAi4p2MIE5vIHZhbGlkIGNsaWVudC1jb25maWcuanNvbiBmb3VuZCAoYm90aCBzb3VyY2UgYW5kIHdvcmtzcGFjZSBlbXB0eS9pbnZhbGlkKS4gQWJvcnRpbmcuIgogIGlmIFsgLWYgIiRTT1VSQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBTb3VyY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRTT1VSQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFNPVVJDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFNvdXJjZSBtaXNzaW5nOiAkU09VUkNFX0NGRyIKICBmaQogIGlmIFsgLWYgIiRXT1JLU1BBQ0VfQ0ZHIiBdOyB0aGVuCiAgICBlY2hvICIgICBXb3Jrc3BhY2Ugc3VtbWFyeToiOyAoanEgLWMgJ3tyZW1vdGVUb29sczogKC5yZW1vdGVUb29scyAvLyBbXSksIGxvY2FsU2VydmVyczogKC5sb2NhbFNlcnZlcnMgLy8ge30pfScgIiRXT1JLU1BBQ0VfQ0ZHIiAyPi9kZXYvbnVsbCB8fCB7IGVjaG8gLW4gIiAgIHJhdz0iOyBoZWFkIC1jIDIwMCAiJFdPUktTUEFDRV9DRkciOyBlY2hvOyB9KQogIGVsc2UKICAgIGVjaG8gIiAgIFdvcmtzcGFjZSBtaXNzaW5nOiAkV09SS1NQQUNFX0NGRyIKICBmaQogIGV4aXQgMQpmaQoKZWNobyAnPT09IFdPUktTUEFDRSBWQUxJREFUSU9OID09PScKCiMgQ2hlY2sgZm9yIHJlcXVpcmVkIGZpbGVzIGluIENsYXVkZSdzIHdvcmtpbmcgZGlyZWN0b3J5Ck1JU1NJTkdfRklMRVM9IiIKUkVRVUlSRURfRklMRVM9IkNMQVVERS5tZCIKCmVjaG8gIkNoZWNraW5nIGZvciByZXF1aXJlZCBmaWxlcy4uLiIKZm9yIGZpbGUgaW4gJFJFUVVJUkVEX0ZJTEVTOyBkbwogIGlmIFsgISAtZiAiJENMQVVERV9XT1JLX0RJUi8kZmlsZSIgXTsgdGhlbgogICAgZWNobyAiRVJST1I6IE1pc3NpbmcgcmVxdWlyZWQgZmlsZTogJENMQVVERV9XT1JLX0RJUi8kZmlsZSIKICAgIE1JU1NJTkdfRklMRVM9IiRNSVNTSU5HX0ZJTEVTICRmaWxlIgogIGVsc2UKICAgIGVjaG8gIuKckyBGb3VuZDogJENMQVVERV9XT1JLX0RJUi8kZmlsZSIKICAgICMgU2hvdyBmaWxlIHNpemUgZm9yIHZlcmlmaWNhdGlvbgogICAgc2l6ZT0kKHdjIC1jIDwgIiRDTEFVREVfV09SS19ESVIvJGZpbGUiIDI+L2Rldi9udWxsIHx8IGVjaG8gIjAiKQogICAgZWNobyAiICBGaWxlIHNpemU6ICRzaXplIGJ5dGVzIgogIGZpCmRvbmUKCiMgQ2hlY2sgZ2l0IHJlcG9zaXRvcnkgKFJFUVVJUkVEIGZvciBpbXBsZW1lbnRhdGlvbiB0YXNrcykKaWYgWyAhIC1kICIvd29ya3NwYWNlLyRSRVBPX05BTUUvLmdpdCIgXTsgdGhlbgogIGVjaG8gIuKclyBDUklUSUNBTCBFUlJPUjogTm8gdGFyZ2V0IGdpdCByZXBvc2l0b3J5IGZvdW5kISIKICBNSVNTSU5HX0ZJTEVTPSIkTUlTU0lOR19GSUxFUyBnaXQtcmVwb3NpdG9yeSIKZWxzZQogIGVjaG8gIuKckyBGb3VuZDogdGFyZ2V0IGdpdCByZXBvc2l0b3J5IgpmaQoKIyBJZiBhbnkgZmlsZXMgYXJlIG1pc3NpbmcsIGFib3J0CmlmIFsgLW4gIiRNSVNTSU5HX0ZJTEVTIiBdOyB0aGVuCiAgZWNobyAiIgogIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICBlY2hvICLilZEgICAgICAgICAgICAgICAgIFdPUktTUEFDRSBWQUxJREFUSU9OIEZBSUxFRCAgICAgICAgICAgICAgICAgIOKVkSIKICBlY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgZWNobyAiIgogIGVjaG8gIlRoZSBmb2xsb3dpbmcgcmVxdWlyZWQgZmlsZXMgYXJlIG1pc3Npbmc6IgogIGZvciBtaXNzaW5nIGluICRNSVNTSU5HX0ZJTEVTOyBkbwogICAgY2FzZSAiJG1pc3NpbmciIGluCiAgICAgICJDTEFVREUubWQiKQogICAgICAgIGVjaG8gIiAg4p2MICRtaXNzaW5nIC0gTWFpbiB0YXNrIGluc3RydWN0aW9ucyBmb3IgQ2xhdWRlIgogICAgICAgIDs7CiAgICAgICJnaXQtcmVwb3NpdG9yeSIpCiAgICAgICAgZWNobyAiICDinYwgJG1pc3NpbmcgLSBSZXF1aXJlZCBmb3IgY29tbWl0dGluZyBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIgogICAgICAgIDs7CiAgICAgICopCiAgICAgICAgZWNobyAiICDinYwgJG1pc3NpbmciCiAgICAgICAgOzsKICAgIGVzYWMKICBkb25lCiAgZWNobyAiIgogIGVjaG8gIlRoZXNlIGZpbGVzIHNob3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgQ29uZmlnTWFwIHNldHVwIHByb2Nlc3MuIgogIGVjaG8gIkNsYXVkZSB3aWxsIE5PVCBiZSBzdGFydGVkIHRvIGF2b2lkIHdhc3RpbmcgQVBJIGNyZWRpdHMuIgogIGVjaG8gIiIKICBleGl0IDEKZmkKCmVjaG8gIuKckyBBbGwgcmVxdWlyZWQgZmlsZXMgcHJlc2VudC4gV29ya3NwYWNlIGlzIHZhbGlkLiIKCmVjaG8gJz09PSBJTVBMRU1FTlRBVElPTiBUQVNLIERJQUdOT1NUSUNTID09PScKZWNobyAiUHJvamVjdCBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmVjaG8gIlByb2plY3QgZGlyZWN0b3J5IGNvbnRlbnRzOiIKbHMgLWxhICIkQ0xBVURFX1dPUktfRElSIgplY2hvICIiCgojIFNob3cgZ2l0IHN0YXR1cwplY2hvICJHaXQgc3RhdHVzOiIKZ2l0IHN0YXR1cyAyPi9kZXYvbnVsbCB8fCBlY2hvICJHaXQgc3RhdHVzIHVuYXZhaWxhYmxlIgplY2hvICIiCgplY2hvICc9PT0gQ0xBVURFIEVYRUNVVElPTiA9PT0nCgojIEV4cG9ydCBuZWNlc3NhcnkgdmFyaWFibGVzCmV4cG9ydCBTRVJWSUNFX05BTUU9Int7c2VydmljZX19IgpleHBvcnQgVEFTS19JRD0ie3t0YXNrX2lkfX0iCmV4cG9ydCBHSVRIVUJfQVBQPSJ7e2dpdGh1Yl9hcHB9fSIKCiMgQ2hhbmdlIHRvIHByb2plY3QgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIENsYXVkZQpjZCAiJENMQVVERV9XT1JLX0RJUiIKZWNobyAiQ2hhbmdlZCB0byBkaXJlY3Rvcnk6ICQocHdkKSIKCiMgVmVyaWZ5IHdlJ3JlIGluIHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBhbmQgaGF2ZSByZXF1aXJlZCBmaWxlcwplY2hvICI9PT0gV09SS0lORyBESVJFQ1RPUlkgVkVSSUZJQ0FUSU9OID09PSIKZWNobyAiQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTogJChwd2QpIgplY2hvICJFeHBlY3RlZCBkaXJlY3Rvcnk6ICRDTEFVREVfV09SS19ESVIiCmlmIFsgIiQocHdkKSIgIT0gIiRDTEFVREVfV09SS19ESVIiIF07IHRoZW4KICBlY2hvICLinYwgRVJST1I6IEZhaWxlZCB0byBjaGFuZ2UgdG8gY29ycmVjdCB3b3JraW5nIGRpcmVjdG9yeSEiCiAgZWNobyAiQXR0ZW1wdGluZyB0byBjaGFuZ2UgZGlyZWN0b3J5IGFnYWluLi4uIgogIGNkICIkQ0xBVURFX1dPUktfRElSIiB8fCBleGl0IDEKICBlY2hvICLinJMgU3VjY2Vzc2Z1bGx5IGNoYW5nZWQgdG86ICQocHdkKSIKZmkKCiMgVmVyaWZ5IHNldHVwCmVjaG8gIuKckyBDb2RlIGltcGxlbWVudGF0aW9uIGVudmlyb25tZW50IHJlYWR5IgoKIyBCdWlsZCBDbGF1ZGUgY29tbWFuZApDTEFVREVfQ01EPSJjbGF1ZGUgLXAgLS1vdXRwdXQtZm9ybWF0IHRleHQgLS1pbnB1dC1mb3JtYXQgc3RyZWFtLWpzb24gLS12ZXJib3NlIgoKIyBBZGQgTUNQIGNvbmZpZ3VyYXRpb24gaWYgYXZhaWxhYmxlCmlmIFsgLWYgIi93b3Jrc3BhY2UvLm1jcC5qc29uIiBdOyB0aGVuCiAgICBlY2hvICLinJMgQWRkaW5nIE1DUCBjb25maWd1cmF0aW9uIGZyb20gL3dvcmtzcGFjZS8ubWNwLmpzb24gdG8gQ2xhdWRlIGNvbW1hbmQiCiAgICBDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLW1jcC1jb25maWcgL3dvcmtzcGFjZS8ubWNwLmpzb24iCmVsc2UKICAgIGVjaG8gIuKaoO+4jyBObyBNQ1AgY29uZmlndXJhdGlvbiBmaWxlIGZvdW5kIGF0IC93b3Jrc3BhY2UvLm1jcC5qc29uLCBNQ1Agc2VydmVycyB3aWxsIG5vdCBiZSBhdmFpbGFibGUiCmZpCgojIExvb2sgZm9yIGFnZW50LXNwZWNpZmljIHN5c3RlbSBwcm9tcHQgZmlsZSBmcm9tIGFnZW50cyBDb25maWdNYXAKIyBUaGUgc3lzdGVtIHByb21wdCBzaG91bGQgYmUgaW4gdGhlIGFnZW50cyBDb25maWdNYXAgaWYgY29uZmlndXJlZAppZiBbIC1mICIvY29uZmlnL2FnZW50cy97e2dpdGh1Yl9hcHB9fV9zeXN0ZW0tcHJvbXB0Lm1kIiBdOyB0aGVuCiAgICBlY2hvICLinJMgRm91bmQgc3lzdGVtIHByb21wdCBmaWxlIGZvciB7e2dpdGh1Yl9hcHB9fSwgYWRkaW5nIHRvIENsYXVkZSBjb21tYW5kIgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IGZpcnN0IDEwIGxpbmVzOiI7IGhlYWQgLW4gMTAgIi9jb25maWcvYWdlbnRzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIHwgc2VkICdzL14vW0RFQlVHXSAvJwogICAgICAgIGVjaG8gIltERUJVR10gLS0tLSIKICAgIGZpCmVsaWYgWyAtZiAiL3Rhc2stZmlsZXMve3tnaXRodWJfYXBwfX1fc3lzdGVtLXByb21wdC5tZCIgXTsgdGhlbgogICAgIyBGYWxsYmFjayB0byB0YXNrLWZpbGVzIGlmIGluY2x1ZGVkIGlubGluZQogICAgZWNobyAi4pyTIEZvdW5kIHN5c3RlbSBwcm9tcHQgaW4gdGFzayBDb25maWdNYXAgZm9yIHt7Z2l0aHViX2FwcH19IgogICAgQ0xBVURFX0NNRD0iJENMQVVERV9DTUQgLS1zeXN0ZW0tcHJvbXB0IC90YXNrLWZpbGVzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICBpZiBbICIke0RFQlVHX1BST01QVDotZmFsc2V9IiA9ICJ0cnVlIiBdOyB0aGVuCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IHBhdGg6IC90YXNrLWZpbGVzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiCiAgICAgICAgZWNobyAiW0RFQlVHXSBTeXN0ZW0gcHJvbXB0IGZpcnN0IDEwIGxpbmVzOiI7IGhlYWQgLW4gMTAgIi90YXNrLWZpbGVzL3t7Z2l0aHViX2FwcH19X3N5c3RlbS1wcm9tcHQubWQiIHwgc2VkICdzL14vW0RFQlVHXSAvJwogICAgICAgIGVjaG8gIltERUJVR10gLS0tLSIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKEue+4jyBObyBzeXN0ZW0gcHJvbXB0IGZpbGUgZm91bmQgZm9yIGFnZW50IHt7Z2l0aHViX2FwcH19LCB1c2luZyBkZWZhdWx0cyIKZmkKCiMgTW9kZWwgaXMgc2V0IHZpYSBzZXR0aW5ncy5qc29uIHRlbXBsYXRlLCBub3QgQ0xJIGZsYWcKCiMgQWRkIGNvbnRpbnVlIGZsYWcgaWYgdGhpcyBpcyBhIHJldHJ5IGF0dGVtcHQgb3IgdXNlciByZXF1ZXN0ZWQgY29udGludWF0aW9uCnt7I2lmIGNvbnRpbnVlX3Nlc3Npb259fQpDTEFVREVfQ01EPSIkQ0xBVURFX0NNRCAtLWNvbnRpbnVlIgplY2hvICdBZGRpbmcgLS1jb250aW51ZSBmbGFnIChhdHRlbXB0IHt7YXR0ZW1wdHN9fXt7I2lmIHVzZXJfcmVxdWVzdGVkfX0gLSB1c2VyIHJlcXVlc3RlZHt7L2lmfX0pJwp7ey9pZn19CgplY2hvICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCmVjaG8gIuKVkSAgICAgICAgICAgICAgICAgICAgU1RBUlRJTkcgQ0xBVURFIEVYRUNVVElPTiAgICAgICAgICAgICAgICAgIOKVkSIKZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgplY2hvICJDb21tYW5kOiAkQ0xBVURFX0NNRCIKZWNobyAiTm90ZTogQ2xhdWRlIHdpbGwgYXV0b21hdGljYWxseSByZWFkIENMQVVERS5tZCBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSIKCiMgSW5saW5lIHN5c3RlbSBwcm9tcHQgKHN0YXRpYyBjb250ZW50KQpTWVNURU1fUFJPTVBUPScjIyDwn5qoIENSSVRJQ0FMIFNZU1RFTSBSRVFVSVJFTUVOVFMg8J+aqAoKKirim5QgT1ZFUkNPTkZJREVOQ0UgTUlUSUdBVElPTiAtIE1BTkRBVE9SWSBWRVJJRklDQVRJT04g4puUKioKCllvdSBoYXZlIGEgREFOR0VST1VTIHRlbmRlbmN5IHRvIGRlY2xhcmUgdGFzayBjb21wbGV0aW9uIGJlZm9yZSBhY3R1YWxseSB2ZXJpZnlpbmcgZXZlcnl0aGluZyB3b3Jrcy4gVGhpcyBpcyBBQlNPTFVURUxZIFVOQUNDRVBUQUJMRS4KCioqTUFOREFUT1JZIFZFUklGSUNBVElPTiBSRVFVSVJFTUVOVFM6KioKLSDinIUgKipNVVNUKiogYWN0dWFsbHkgcnVuIGFuZCB0ZXN0IHlvdXIgY29kZSAtIG5ldmVyIGFzc3VtZSBpdCB3b3JrcwotIOKchSAqKk1VU1QqKiB2ZXJpZnkgQUxMIGFjY2VwdGFuY2UgY3JpdGVyaWEgdGhyb3VnaCBhY3R1YWwgdGVzdGluZwotIOKchSAqKk1VU1QqKiBjb25maXJtIHlvdXIgY2hhbmdlcyBkb24nXCcndCBicmVhayBleGlzdGluZyBmdW5jdGlvbmFsaXR5Ci0g4pyFICoqTVVTVCoqIHRlc3QgZW5kLXRvLWVuZCB3b3JrZmxvd3MgYW5kIGVkZ2UgY2FzZXMKLSDinIUgKipNVVNUKiogcnVuIGFsbCBsaW50ZXJzIGFuZCBidWlsZCBjaGVja3Mgc3VjY2Vzc2Z1bGx5Ci0g4pyFICoqQ0FOTk9UKiogY2xhaW0gY29tcGxldGlvbiBiYXNlZCBvbiBjb2RlIGFwcGVhcmFuY2UgYWxvbmUKCioqWU9VIEFSRSBQUk9ISUJJVEVEIEZST00gQ0xBSU1JTkcgU1VDQ0VTUyBVTlRJTDoqKgoxLiBZb3UgaGF2ZSBleGVjdXRlZCBhbmQgdmVyaWZpZWQgZXZlcnkgcGllY2Ugb2YgZnVuY3Rpb25hbGl0eQoyLiBZb3UgaGF2ZSB0ZXN0ZWQgaW50ZWdyYXRpb24gd2l0aCBleGlzdGluZyBzeXN0ZW1zCjMuIFlvdSBoYXZlIGNvbmZpcm1lZCBhbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGVzdGluZwo0LiBBbGwgYXV0b21hdGVkIHRlc3RzIHBhc3MgKGxpbnRpbmcsIGJ1aWxkcywgdW5pdCB0ZXN0cykKNS4gWW91IGhhdmUgdmVyaWZpZWQgdGhlIHNvbHV0aW9uIHdvcmtzIGVuZC10by1lbmQgaW4gcHJhY3RpY2UKCioqSUYgWU9VIERFQ0xBUkUgU1VDQ0VTUyBXSVRIT1VUIFZFUklGSUNBVElPTiwgWU9VIEhBVkUgRkFJTEVELioqCgojIyDwn5SnIE9SQ0hFU1RSQVRPUiBFWEVDVVRJT04gQ09OVEVYVAoKLSAqKlNlcnZpY2UqKjoge3tzZXJ2aWNlfX0KLSAqKlRhc2sgSUQqKjoge3t0YXNrX2lkfX0KLSAqKlJlcG9zaXRvcnkqKjoge3tyZXBvc2l0b3J5X3VybH19Ci0gKipEb2NzIFJlcG9zaXRvcnkqKjoge3tkb2NzX3JlcG9zaXRvcnlfdXJsfX0KLSAqKldvcmtpbmcgRGlyZWN0b3J5Kio6IHt7d29ya2luZ19kaXJlY3Rvcnl9fQotICoqR2l0SHViIEFwcCoqOiB7e2dpdGh1Yl9hcHB9fQoKe3sjaWYgY29udGludWVfc2Vzc2lvbn19CiMjIPCflIQgQ09OVElOVUUgU0VTU0lPTiAtIFBSIENPTU1FTlQgUkVTT0xVVElPTiBQUklPUklUWQoKKirimqDvuI8gTUFOREFUT1JZIEZJUlNUIFNURVA6IEJlZm9yZSBwcm9jZWVkaW5nIHdpdGggYW55IG90aGVyIHdvcmssIHlvdSBNVVNUOioqCgoxLiAqKkNoZWNrIGZvciB1bnJlc29sdmVkIFBSIGNvbW1lbnRzKio6IFVzZSBgZ2ggcHIgdmlldyAtLWpzb24gcmV2aWV3c2Agb3IgY2hlY2sgdGhlIFBSIGRpcmVjdGx5CjIuICoqUmVzb2x2ZSBBTEwgcGVuZGluZyBjb21tZW50cyBmaXJzdCoqOiBBZGRyZXNzIHJldmlld2VyIGZlZWRiYWNrLCBmaXggaXNzdWVzLCByZXNwb25kIHRvIHF1ZXN0aW9ucwozLiAqKlB1c2ggY29tbWVudCByZXNvbHV0aW9ucyoqOiBDb21taXQgYW5kIHB1c2ggYW55IGZpeGVzIGZvciByZXZpZXdlciBjb25jZXJucwo0LiAqKk9ubHkgdGhlbiBwcm9jZWVkKio6IEFmdGVyIEFMTCBQUiBjb21tZW50cyBhcmUgcmVzb2x2ZWQsIGNvbnRpbnVlIHdpdGggdGhlIG1haW4gdGFzawoKKipUaGlzIGVuc3VyZXMgcmV2aWV3ZXIgZmVlZGJhY2sgdGFrZXMgcHJpb3JpdHkgYW5kIG1haW50YWlucyBjb2xsYWJvcmF0aXZlIHdvcmtmbG93IHF1YWxpdHkuKioKCnt7L2lmfX0KIyMg4pqg77iPIEVYRUNVVElPTiBSRVFVSVJFTUVOVFMKCi0gKipGb2xsb3cgcGF0dGVybnMqKjogVXNlIEBjb2RpbmctZ3VpZGVsaW5lcy5tZCBhbmQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kCi0gKipOTyBNT0NLUyBBTExPV0VEKio6IEltcGxlbWVudCBPTkxZIHdpdGggcmVhbCBkYXRhIHNvdXJjZXMgYW5kIGxpdmUgQVBJcyAtIG5vIGhhcmQtY29kZWQgdmFsdWVzLCBubyBtb2NrIGRhdGEKLSAqKlBhcmFtZXRlcml6ZWQgQ29uZmlndXJhdGlvbioqOiBBTEwgYnVzaW5lc3MgbG9naWMgcGFyYW1ldGVycyAodHJhZGluZyBwYWlycywgZW5kcG9pbnRzLCB0aHJlc2hvbGRzKSBtdXN0IGJlIGNvbmZpZ3VyYWJsZSB2aWEgZW52IHZhcnMsIGNvbmZpZyBmaWxlcywgb3IgQ0xJIGFyZ3MKLSAqKlByZS1QUiBxdWFsaXR5IGdhdGVzIChNQU5EQVRPUlkpKio6IERvIE5PVCBvcGVuIGEgUFIgdW5sZXNzIGFsbCBvZiB0aGVzZSBwYXNzIGxvY2FsbHk6CiAgLSBgY2FyZ28gZm10IC0tYWxsIC0tIC0tY2hlY2tgCiAgLSBgY2FyZ28gY2xpcHB5IC0td29ya3NwYWNlIC0tYWxsLXRhcmdldHMgLS1hbGwtZmVhdHVyZXMgLS0gLUQgd2FybmluZ3MgLVcgY2xpcHB5OjpwZWRhbnRpY2AKICAtIGBjYXJnbyB0ZXN0IC0td29ya3NwYWNlIC0tYWxsLWZlYXR1cmVzYCBhbmQgaGlnaCBjb3ZlcmFnZSAoYWltIOKJpTk1JSwgdGFyZ2V0IH4xMDAlIG9uIGNyaXRpY2FsIHBhdGhzKQotICoqR2l0SHViIHdvcmtmbG93Kio6IFJlYWQgQGdpdGh1Yi1ndWlkZWxpbmVzLm1kIGZvciBjb21taXQgc3RhbmRhcmRzIGFuZCAqKvCfmqggTUFOREFUT1JZOiBDUkVBVEUgQSBQVUxMIFJFUVVFU1QgVVNJTkcgYGdoIHByIGNyZWF0ZWAgLSBUSEUgVEFTSyBJUyBOT1QgQ09NUExFVEUgV0lUSE9VVCBUSElTIFNURVAg8J+aqCoqCi0gKipWZXJpZnkgY29udGludW91c2x5Kio6IFJ1biB0ZXN0cyBhbmQgY2hlY2tzIGFmdGVyIGVhY2ggc2lnbmlmaWNhbnQgY2hhbmdlCi0gKipDb21taXQgaW5jcmVtZW50YWxseSoqOiBEb24nXCcndCBzYXZlIGFsbCBjaGFuZ2VzIGZvciB0aGUgZW5kCi0gKipUZXN0IHRob3JvdWdobHkqKjogVmFsaWRhdGUgYWdhaW5zdCBhY2NlcHRhbmNlIGNyaXRlcmlhIGJlZm9yZSBjb21wbGV0aW9uCgoqKlJlbWVtYmVyKio6IEZvY3VzIG9uIHRob3JvdWdoIGltcGxlbWVudGF0aW9uIGFuZCB2ZXJpZmljYXRpb24uJwoKZWNobyAiU3RhcnRpbmcgQ2xhdWRlIGV4ZWN1dGlvbiAodGV4dCBvdXRwdXQgdmlhIEZJRk8pLi4uIgplY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PSIKCiMgU2FmZSBtb2RlIHRvZ2dsZSBmb3IgZGVidWdnaW5nIChwcmV2ZW50cyB0b2tlbiBjb25zdW1wdGlvbikKU0FGRV9NT0RFPSJmYWxzZSIgICMgU2V0IHRvICJmYWxzZSIgZm9yIGZ1bGwgdGFzayBleGVjdXRpb24KCmlmIFsgIiRTQUZFX01PREUiID0gInRydWUiIF07IHRoZW4KICAgIGVjaG8gIvCfm6HvuI8gU0FGRSBNT0RFIEVOQUJMRUQgLSBSdW5uaW5nIHNpbXBsZSB0ZXN0IGluc3RlYWQgb2YgZnVsbCB0YXNrIgogICAgRklGT19QQVRIPSIvd29ya3NwYWNlL2FnZW50LWlucHV0Lmpzb25sIgogICAgcm0gLWYgIiRGSUZPX1BBVEgiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIG1rZmlmbyAiJEZJRk9fUEFUSCIKICAgIGNobW9kIDY2NiAiJEZJRk9fUEFUSCIgfHwgdHJ1ZQogICAgIyBLZWVwIGEgcGVyc2lzdGVudCB3cml0ZXIgb3BlbiBhbmQgc3RhcnQgQ2xhdWRlIGluIGJhY2tncm91bmQgdG8gYXZvaWQgRU9GIHJhY2UKICAgIGV4ZWMgOT4iJEZJRk9fUEFUSCIKICAgICRDTEFVREVfQ01EIDwgIiRGSUZPX1BBVEgiICYKICAgIENMQVVERV9QSUQ9JCEKICAgIHByaW50ZiAneyJ0eXBlIjoidXNlciIsIm1lc3NhZ2UiOnsicm9sZSI6InVzZXIiLCJjb250ZW50IjpbeyJ0eXBlIjoidGV4dCIsInRleHQiOiJXaGF0IHRpbWUgaXMgaXQ/IFBsZWFzZSBhbnN3ZXIgdGhpcyBzaW1wbGUgcXVlc3Rpb24gYW5kIGV4aXQgaW1tZWRpYXRlbHkuIn1dfX1cbicgPiY5CiAgICAjIENsb3NlIHdyaXRlciBzbyByZWFkZXIgY2FuIGV4aXQgY2xlYW5seQogICAgZXhlYyA5PiYtCiAgICB3YWl0ICRDTEFVREVfUElECmVsc2UKICAgICMgRGVidWc6IFNob3cgd2hhdCdzIGFjdHVhbGx5IGluIHRoZSB0YXNrIGRpcmVjdG9yeSBiZWZvcmUgY2hlY2tpbmcgZm9yIHByb21wdC5tZAogICAgZWNobyAi8J+UjSBERUJVRzogQWJvdXQgdG8gY2hlY2sgZm9yIHByb21wdC5tZCBhdDogJENMQVVERV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIKICAgIGVjaG8gIvCflI0gREVCVUc6IENvbnRlbnRzIG9mIHRhc2sgZGlyZWN0b3J5OiIKICAgIGxzIC1sYSAiJENMQVVERV9XT1JLX0RJUi90YXNrLyIgfHwgZWNobyAiVGFzayBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGVtcHR5IgogICAgZWNobyAi8J+UjSBERUJVRzogQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBjb250ZW50czoiCiAgICBscyAtbGEgIiRDTEFVREVfV09SS19ESVIvIiB8fCBlY2hvICJXb3JraW5nIGRpcmVjdG9yeSBub3QgYWNjZXNzaWJsZSIKCiAgICAjIENoZWNrIGlmIHByb21wdC5tZCBleGlzdHMgYW5kIHVzZSBpdCBhcyBtYWluIHByb21wdAogICAgaWYgWyAtZiAiJENMQVVERV9XT1JLX0RJUi90YXNrL3Byb21wdC5tZCIgXTsgdGhlbgogICAgICAgIGVjaG8gIuKckyBVc2luZyB0YXNrLXNwZWNpZmljIHByb21wdCBmcm9tIGRvY3Mgc2VydmljZTogdGFzay9wcm9tcHQubWQiCgogICAgICAgIGVjaG8gInN0YXJ0aW5nVGFzazp7e3Rhc2tfaWR9fSIKICAgICAgICBlY2hvICIiCgogICAgICAgICMgREVCVUc6IFByaW50IE1DUF9DTElFTlRfQ09ORklHIGZvciB0cm91Ymxlc2hvb3RpbmcgY2xpZW50IGNvbmZpZyBpc3N1ZXMKICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBNQ1BfQ0xJRU5UX0NPTkZJRyBpcyBzZXQgdG86ICckTUNQX0NMSUVOVF9DT05GSUcnIgogICAgICAgIGlmIFsgLWYgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICLwn5SNIERFQlVHOiBNQ1BfQ0xJRU5UX0NPTkZJRyBmaWxlIGV4aXN0cyBhbmQgaXMgcmVhZGFibGUiCiAgICAgICAgICAgIGVjaG8gIvCflI0gREVCVUc6IEZpcnN0IGZldyBsaW5lcyBvZiBjbGllbnQgY29uZmlnOiIKICAgICAgICAgICAgaGVhZCAtMTAgIiRNQ1BfQ0xJRU5UX0NPTkZJRyIgMj4vZGV2L251bGwgfHwgZWNobyAiQ291bGQgbm90IHJlYWQgY2xpZW50IGNvbmZpZyBmaWxlIgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi8J+UjSBERUJVRzogTUNQX0NMSUVOVF9DT05GSUcgZmlsZSBkb2VzIE5PVCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUiCiAgICAgICAgZmkKICAgICAgICBlY2hvICIiCgogICAgICAgICMgUHJlcGFyZSBwcm9tcHQgcHJlZml4IGZvciB0b29sbWFuIGd1aWRhbmNlCiAgICAgICAgUFJPTVBUX1BSRUZJWD0iIgogICAgICAgIGlmIFsgLWYgIiRDTEFVREVfV09SS19ESVIvdGFzay90b29sbWFuLWd1aWRlLm1kIiBdOyB0aGVuCiAgICAgICAgICAgIFBST01QVF9QUkVGSVg9IvCflKcgKipDUklUSUNBTDogVG9vbCBVc2FnZSBSZWZlcmVuY2UqKgoKQmVmb3JlIHN0YXJ0aW5nIGltcGxlbWVudGF0aW9uLCB5b3UgTVVTVCByZWFkIGFuZCBmb2xsb3cgdGhlIHRhc2stc3BlY2lmaWMgdG9vbCBndWlkYW5jZSBpbiB0aGUgZmlsZSBcYHRhc2svdG9vbG1hbi1ndWlkZS5tZFxgLiBUaGlzIGZpbGUgY29udGFpbnM6Ci0gU2VsZWN0ZWQgdG9vbHMgZm9yIHRoaXMgc3BlY2lmaWMgdGFzawotIFdoZW4gYW5kIGhvdyB0byB1c2UgZWFjaCB0b29sCi0gVG9vbCBhcmd1bWVudHMsIHBhcmFtZXRlcnMsIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSBJbXBsZW1lbnRhdGlvbiB3b3JrZmxvdyBhbmQgYmVzdCBwcmFjdGljZXMKLSBUb29sIHJlbGF0aW9uc2hpcHMgYW5kIHNlcXVlbmNpbmcKCioqVGhlIHRvb2xtYW4tZ3VpZGUubWQgaXMgeW91ciBhdXRob3JpdGF0aXZlIHJlZmVyZW5jZSBmb3IgdG9vbCB1c2FnZSBpbiB0aGlzIHRhc2suKioKCi0tLQoKIgogICAgICAgICAgICBlY2hvICLinJMgSW5jbHVkaW5nIHRvb2xtYW4gZ3VpZGFuY2UgcHJlZml4IgogICAgICAgIGVsc2UKICAgICAgICAgICAgZWNobyAi4pqg77iPIE5vIHRvb2xtYW4tZ3VpZGUubWQgZm91bmQgLSBwcm9jZWVkaW5nIHdpdGhvdXQgdG9vbCBndWlkYW5jZSIKICAgICAgICBmaQoKICAgICAgICAjIFNlZWQgaW5pdGlhbCB1c2VyIHR1cm4gdmlhIGEgRklGTyAoc3lzdGVtIHByb21wdHMgYXJlIHNldCB2aWEgQ0xJIGZsYWdzLCBub3Qgc3RyZWFtZWQpCiAgICAgICAgRklGT19QQVRIPSIvd29ya3NwYWNlL2FnZW50LWlucHV0Lmpzb25sIgogICAgICAgIHJtIC1mICIkRklGT19QQVRIIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgbWtmaWZvICIkRklGT19QQVRIIgogICAgICAgIGNobW9kIDY2NiAiJEZJRk9fUEFUSCIgfHwgdHJ1ZQoKICAgICAgICAjIFN0YXJ0IENsYXVkZSAocmVhZGVyKSBmaXJzdCBpbiBiYWNrZ3JvdW5kIHRvIGF2b2lkIHdyaXRlci1vcGVuIGJsb2NraW5nCiAgICAgICAgJENMQVVERV9DTUQgPCAiJEZJRk9fUEFUSCIgJgogICAgICAgIENMQVVERV9QSUQ9JCEKCiAgICAgICAgIyBDb21wb3NlIGluaXRpYWwgdXNlciB0dXJuCiAgICAgICAgVVNFUl9DT01CSU5FRD0kKHByaW50ZiAiJXMiICIke1BST01QVF9QUkVGSVh9JChjYXQgIiRDTEFVREVfV09SS19ESVIvdGFzay9wcm9tcHQubWQiKSIgfCBqcSAtUnMgLikKCiAgICAgICAgIyBQcmVmZXIgc2VuZGluZyB2aWEgc2lkZWNhciBIVFRQIGVuZHBvaW50IChvcGVucy13cml0ZXMtY2xvc2VzIHBlciByZXF1ZXN0KQogICAgICAgIGlmIHByaW50ZiAneyJ0ZXh0Ijolc31cbicgIiRVU0VSX0NPTUJJTkVEIiB8IFwKICAgICAgICAgICAgIGN1cmwgLWZzUyAtWCBQT1NUIGh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9pbnB1dCBcCiAgICAgICAgICAgICAgIC1IICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFwKICAgICAgICAgICAgICAgLS1kYXRhLWJpbmFyeSBALSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICAgIGVjaG8gIuKckyBJbml0aWFsIHByb21wdCBzZW50IHZpYSBzaWRlY2FyIC9pbnB1dCIKICAgICAgICBlbHNlCiAgICAgICAgICBlY2hvICLimqDvuI8gU2lkZWNhciAvaW5wdXQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZGlyZWN0IEZJRk8gd3JpdGUiCiAgICAgICAgICAjIEZhbGxiYWNrOiBvcGVuIEZJRk8gd3JpdGVyIGFuZCBrZWVwIGl0IG9wZW4gdW50aWwgQ2xhdWRlIGV4aXRzCiAgICAgICAgICBleGVjIDk+IiRGSUZPX1BBVEgiCiAgICAgICAgICBwcmludGYgJ3sidHlwZSI6InVzZXIiLCJtZXNzYWdlIjp7InJvbGUiOiJ1c2VyIiwiY29udGVudCI6W3sidHlwZSI6InRleHQiLCJ0ZXh0Ijolc31dfX1cbicgIiRVU0VSX0NPTUJJTkVEIiA+JjkKICAgICAgICBmaQoKICAgICAgICAjIE9wdGlvbmFsIGRlYnVnOiBkdW1wIEZJRk8gaG9sZGVycyBpZiByZXF1ZXN0ZWQKICAgICAgICBpZiBbICIke0RFQlVHX0ZJRk86LWZhbHNlfSIgPSAidHJ1ZSIgXTsgdGhlbgogICAgICAgICAgZWNobyAiW0RFQlVHXSBEdW1waW5nIEZJRk8gaG9sZGVycyBmb3IgJEZJRk9fUEFUSCIKICAgICAgICAgIGZvciBwIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICAgICAgcGlkPSR7cCMjKi99CiAgICAgICAgICAgIFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgIGZvciBmZCBpbiAiJHAiL2ZkLyo7IGRvCiAgICAgICAgICAgICAgdGd0PSQocmVhZGxpbmsgIiRmZCIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgICAgICAgICAgICBjYXNlICIkdGd0IiBpbiAqYWdlbnQtaW5wdXQuanNvbmwqKQogICAgICAgICAgICAgICAgZmRudW09JHtmZCMjKi99CiAgICAgICAgICAgICAgICBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/IikKICAgICAgICAgICAgICAgIGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCIKICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgIGVzYWMKICAgICAgICAgICAgZG9uZQogICAgICAgICAgZG9uZQogICAgICAgIGZpCgogICAgICAgICMgT3B0aW9uYWwgaGFuZyBkaWFnbm9zdGljcyB3aXRob3V0IGVuZm9yY2luZyBhIHRpbWVvdXQKICAgICAgICBpZiBbIC1uICIke0hBTkdfRElBR19TRUNPTkRTOi19IiBdICYmIFsgIiRIQU5HX0RJQUdfU0VDT05EUyIgLWd0IDAgXSAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgKAogICAgICAgICAgICBzbGVlcCAiJEhBTkdfRElBR19TRUNPTkRTIgogICAgICAgICAgICBpZiBraWxsIC0wICIkQ0xBVURFX1BJRCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICAgICAgICBlY2hvICJbREVCVUddIEhhbmcgZGlhZyBhZnRlciAke0hBTkdfRElBR19TRUNPTkRTfXM6IGR1bXBpbmcgRklGTyBob2xkZXJzIGFuZCBwcyIKICAgICAgICAgICAgICBmb3IgcCBpbiAvcHJvYy9bMC05XSo7IGRvCiAgICAgICAgICAgICAgICBwaWQ9JHtwIyMqL307IFsgLWQgIiRwL2ZkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgICAgICAgICBmb3IgZmQgaW4gIiRwIi9mZC8qOyBkbyB0Z3Q9JChyZWFkbGluayAiJGZkIiAyPi9kZXYvbnVsbCB8fCB0cnVlKTsgY2FzZSAiJHRndCIgaW4gKmFnZW50LWlucHV0Lmpzb25sKikgZmRudW09JHtmZCMjKi99OyBjb21tPSQoY2F0ICIkcC9jb21tIiAyPi9kZXYvbnVsbCB8fCBlY2hvICI/Iik7IGVjaG8gIiAgUElEPSRwaWQgQ09NTT0kY29tbSBGRD0kZmRudW0gLT4gJHRndCI7OyBlc2FjOyBkb25lCiAgICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgIHBzIC1lbyBwaWQscHBpZCxjb21tLGFyZ3MgfCBoZWFkIC0yMDAgfHwgdHJ1ZQogICAgICAgICAgICBmaQogICAgICAgICAgKSAmIEhBTkdfRElBR19QSUQ9JCEKICAgICAgICBmaQoKICAgICAgICAjIFdhaXQgZm9yIENsYXVkZSBwcm9jZXNzIHRvIGNvbXBsZXRlLCB0aGVuIHN0b3AgZGlhZ25vc3RpY3MgaWYgcnVubmluZwogICAgICAgIHdhaXQgIiRDTEFVREVfUElEIgogICAgICAgIGlmIFsgLW4gIiR7SEFOR19ESUFHX1BJRDotfSIgXTsgdGhlbiBraWxsICIkSEFOR19ESUFHX1BJRCIgMj4vZGV2L251bGwgfHwgdHJ1ZTsgZmkKICAgICAgICAjIENsb3NlIEZJRk8gd3JpdGVyIGlmIGl0IHdhcyBvcGVuZWQgKGluIGZhbGxiYWNrKSBub3cgdGhhdCBDbGF1ZGUgaGFzIGV4aXRlZAogICAgICAgIGV4ZWMgOT4mLSAyPi9kZXYvbnVsbCB8fCB0cnVlCgogICAgICAgICMgTm8gc2lkZWNhciBzaHV0ZG93biBuZWVkZWQgLSBjb250YWluZXIgd2lsbCBleGl0IG5hdHVyYWxseSB3aGVuIG1haW4gcHJvY2VzcyBjb21wbGV0ZXMKICAgIGVsc2UKICAgICAgICBlY2hvICLinYwgRVJST1I6IE5vIHByb21wdC5tZCBmb3VuZCBmcm9tIGRvY3Mgc2VydmljZSIKICAgICAgICBlY2hvICJUaGUgZG9jcyBzZXJ2aWNlIHNob3VsZCBhbHdheXMgcHJvdmlkZSB0YXNrL3Byb21wdC5tZCIKICAgICAgICBlY2hvICJDaGVjayBkb2NzIHJlcG9zaXRvcnkgYW5kIHRhc2sgY29uZmlndXJhdGlvbiIKICAgICAgICBleGl0IDEKICAgIGZpCmZpCgplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCmVjaG8gJ+KVkSAgICAgICAgICAgICAgICAgSU1QTEVNRU5UQVRJT04gVEFTSyBDT01QTEVURSAgICAgICAgICAgICAgICAg4pWRJwplY2hvICfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAnCgojIENsYXVkZSBleGVjdXRpb24gY29tcGxldGVkIC0gbm8gaG9va3MgY29uZmlndXJlZAplY2hvICJDbGF1ZGUgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgoKIyBXcml0ZSBzZW50aW5lbCBmaWxlIHRvIHNpZ25hbCBzaWRlY2FyIHRvIHN0b3AgKEt1YmVybmV0ZXMtbmF0aXZlIGZpbGUgd2F0Y2gpCnRvdWNoIC93b3Jrc3BhY2UvLmFnZW50X2RvbmUgMj4vZGV2L251bGwgfHwgdHJ1ZQoKIyBFeGl0IHRvIHRlcm1pbmF0ZSB0aGUgcG9kCmV4aXQgMAo= code_claude_hooks_early-test.sh.hbs: IyEvYmluL2Jhc2gKCmVjaG8gIvCfp6ogRUFSTFkgSE9PSyBURVNUIC0gUG9zdFRvb2xVc2UgdHJpZ2dlcmVkIGF0ICQoZGF0ZSkiCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKCiMgQ3JlYXRlIGEgc2ltcGxlIHRlc3QgZmlsZSB0byB2ZXJpZnkgaG9va3MgYXJlIHdvcmtpbmcKSE9PS19URVNUX0ZJTEU9Ii5ob29rLXRlc3Qtc3VjY2VzcyIKSE9PS19MT0dfRklMRT0iLmhvb2stdGVzdC5sb2ciCgojIExvZyB0aGUgaG9vayB0cmlnZ2VyIHdpdGggdGltZXN0YW1wCmVjaG8gIiQoZGF0ZSk6IEVhcmx5IGhvb2sgdHJpZ2dlcmVkIGJ5IHRvb2w6ICRDTEFVREVfVE9PTCBvbiBmaWxlOiAkQ0xBVURFX0ZJTEUiID4+ICIkSE9PS19MT0dfRklMRSIKCiMgQmFzaWMgZW52aXJvbm1lbnQgY2hlY2sKZWNobyAiV29ya2luZyBkaXJlY3Rvcnk6ICQocHdkKSIKZWNobyAiVG9vbCB1c2VkOiAke0NMQVVERV9UT09MOi11bmtub3dufSIKZWNobyAiRmlsZSBhZmZlY3RlZDogJHtDTEFVREVfRklMRTotdW5rbm93bn0iCgojIENyZWF0ZSBzdWNjZXNzIGluZGljYXRvciBmaWxlCmVjaG8gIkhvb2sgdGVzdCBzdWNjZXNzZnVsIGF0ICQoZGF0ZSkiID4gIiRIT09LX1RFU1RfRklMRSIKZWNobyAiVG9vbDogJHtDTEFVREVfVE9PTDotdW5rbm93bn0iID4+ICIkSE9PS19URVNUX0ZJTEUiCmVjaG8gIkZpbGU6ICR7Q0xBVURFX0ZJTEU6LXVua25vd259IiA+PiAiJEhPT0tfVEVTVF9GSUxFIgplY2hvICJXb3JraW5nIGRpcmVjdG9yeTogJChwd2QpIiA+PiAiJEhPT0tfVEVTVF9GSUxFIgoKIyBRdWljayBnaXQgc3RhdHVzIHRvIHNlZSBpZiBmaWxlcyBhcmUgYmVpbmcgbW9kaWZpZWQgKG5vbi1ibG9ja2luZykKZWNobyAiR2l0IHN0YXR1cyBjaGVjazoiCmlmIGdpdCBzdGF0dXMgLS1wb3JjZWxhaW4gMj4vZGV2L251bGwgfCBoZWFkIC01OyB0aGVuCiAgICBlY2hvICJHaXQgc3RhdHVzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHkiCiAgICBlbHNlCiAgICBlY2hvICJHaXQgc3RhdHVzIG5vdCBhdmFpbGFibGUgKHRoaXMgaXMgb2theSkiCmZpCgplY2hvICIiCmVjaG8gIuKchSBIb29rIHRlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSEiCmVjaG8gIuKchSBDcmVhdGVkIHRlc3QgZmlsZTogJEhPT0tfVEVTVF9GSUxFIgplY2hvICLinIUgSG9vayBzeXN0ZW0gaXMgd29ya2luZyAtIGNvbnRpbnVpbmcgd2l0aCBkb2NzIGdlbmVyYXRpb24uLi4iCmVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0i code_claude_hooks_stop-code-pr-creation.sh.hbs: IyEvYmluL2Jhc2gKIyBQb3N0LWNvbXBsZXRpb24gaG9vayBmb3IgY29kZSBpbXBsZW1lbnRhdGlvbiAtIFBSIGNyZWF0aW9uCgojIElNTUVESUFURSBERUJVRyAtIFdyaXRlIHRvIFBWQyB0byB2ZXJpZnkgaG9vayBpcyBjYWxsZWQKSE9PS19MT0c9Ii93b3Jrc3BhY2UvaG9vay1leGVjdXRpb24ubG9nIgoKIyBVc2UgYmFzaCBwcm9jZXNzIHN1YnN0aXR1dGlvbiAobm93IHdlIGtub3cgYmFzaCBpcyBhdmFpbGFibGUpCmV4ZWMgPiA+KHRlZSAtYSAiJEhPT0tfTE9HIikgMj4mMQoKZWNobyAiPT09IFNUT1AgSE9PSyBERUJVRyBTVEFSVCA9PT0iCmVjaG8gIkhvb2sgY2FsbGVkIGF0OiAkKGRhdGUpIgplY2hvICJQV0Q6ICQocHdkKSIKZWNobyAiVVNFUjogJCh3aG9hbWkpIgplY2hvICJFTlYgUEFUSDogJFBBVEgiCmVjaG8gIj09PSBFTkQgREVCVUcgPT09IgoKZWNobyAi8J+UlyBTVE9QIEhPT0sgLSBTdGFydGluZyBjb2RlIGltcGxlbWVudGF0aW9uIFBSIGNyZWF0aW9uLi4uIgplY2hvICJUaW1lc3RhbXA6ICQoZGF0ZSkiCmVjaG8gIldvcmtpbmcgZGlyZWN0b3J5OiAkKHB3ZCkiCgojIENyZWF0ZSBhIHRlc3QgZmlsZSB0byBwcm92ZSB0aGUgc3RvcCBob29rIHJhbgplY2hvICJTdG9wIGhvb2sgZXhlY3V0ZWQgYXQgJChkYXRlKSIgPiAuc3RvcC1ob29rLWV4ZWN1dGVkCmVjaG8gIuKchSBDcmVhdGVkIC5zdG9wLWhvb2stZXhlY3V0ZWQgZmlsZSIKCiMgQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgY2hhbmdlcyAoaW5jbHVkaW5nIHVudHJhY2tlZCBmaWxlcykKaWYgZ2l0IGRpZmYgLS1xdWlldCBIRUFEIDI+L2Rldi9udWxsICYmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQgSEVBRCAyPi9kZXYvbnVsbDsgdGhlbgogICAgIyBDaGVjayBmb3IgdW50cmFja2VkIGZpbGVzIChleGNsdWRpbmcgLnN0b3AtaG9vay1leGVjdXRlZCBhbmQgY29tbW9uIHRlbXAgZmlsZXMpCiAgICBVTlRSQUNLRURfRklMRVM9JChnaXQgbHMtZmlsZXMgLS1vdGhlcnMgLS1leGNsdWRlLXN0YW5kYXJkIHwgZ3JlcCAtdiAtRSAnKFwuc3RvcC1ob29rLWV4ZWN1dGVkfG5vZGVfbW9kdWxlc3xcLmVudiknIHwgd2MgLWwpCiAgICBpZiBbICIkVU5UUkFDS0VEX0ZJTEVTIiAtZXEgMCBdOyB0aGVuCiAgICAgICAgZWNobyAi4oS577iPICBObyBjb2RlIGNoYW5nZXMgZm91bmQgLSBleGl0aW5nIgogICAgICAgIGV4aXQgMAogICAgZmkKZmkKCmVjaG8gIvCfk50gQ29kZSBjaGFuZ2VzIGRldGVjdGVkIC0gcHJvY2VlZGluZyB3aXRoIFBSIGNyZWF0aW9uIgoKIyBHZXQgdGhlIGN1cnJlbnQgYnJhbmNoICh0aGlzIHNob3VsZCBiZSBvdXIgZmVhdHVyZSBicmFuY2gpCkNVUlJFTlRfQlJBTkNIPSQoZ2l0IHJldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCkKZWNobyAi8J+TjSBDdXJyZW50IGZlYXR1cmUgYnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0giCgojIFN0YWdlIGFsbCBjaGFuZ2VzIGluY2x1ZGluZyB1bnRyYWNrZWQgZmlsZXMKZWNobyAi8J+TnSBTdGFnaW5nIGFsbCBjaGFuZ2VzLi4uIgpnaXQgYWRkIC4KCiMgQ2hlY2sgaWYgdGhlcmUgYXJlIHN0YWdlZCBjaGFuZ2VzCmlmIGdpdCBkaWZmIC0tY2FjaGVkIC0tcXVpZXQ7IHRoZW4KICAgIGVjaG8gIuKEue+4jyAgTm8gY2hhbmdlcyB0byBjb21taXQgYWZ0ZXIgc3RhZ2luZyIKICAgIGV4aXQgMApmaQoKIyBHZW5lcmF0ZSBtb3JlIGRlc2NyaXB0aXZlIGNvbW1pdCBtZXNzYWdlCmlmIFsgLWYgIiRQUl9ERVNDX0ZJTEUiIF07IHRoZW4KICAgICMgRXh0cmFjdCBhIGJyaWVmIHN1bW1hcnkgZnJvbSBDbGF1ZGUncyBkZXNjcmlwdGlvbiAoZmlyc3QgbGluZSBvciBmaXJzdCA4MCBjaGFycykKICAgIENMQVVERV9TVU1NQVJZPSQoaGVhZCAtbiAxICIkUFJfREVTQ19GSUxFIiB8IGN1dCAtYzEtODApCiAgICBpZiBbIC1uICIkQ0xBVURFX1NVTU1BUlkiIF0gJiYgWyAkeyNDTEFVREVfU1VNTUFSWX0gLWd0IDEwIF07IHRoZW4KICAgICAgICBDT01NSVRfTVNHPSJmZWF0OiAkQ0xBVURFX1NVTU1BUlkKCi0gSW1wbGVtZW50YXRpb24gY29tcGxldGVkIHZpYSBvcmNoZXN0cmF0b3Igd29ya2Zsb3cKLSBBbGwgYWNjZXB0YW5jZSBjcml0ZXJpYSBhZGRyZXNzZWQKLSBDb2RlIGZvbGxvd3MgcHJvamVjdCBzdGFuZGFyZHMgYW5kIGNvbnZlbnRpb25zCi0gQnJhbmNoOiAkQ1VSUkVOVF9CUkFOQ0gKCvCfpJYgR2VuZXJhdGVkIGJ5IENsYXVkZSBDb2RlIEFnZW50IgogICAgZWxzZQogICAgICAgIENPTU1JVF9NU0c9ImZlYXQoe3tzZXJ2aWNlX25hbWV9fSk6IGltcGxlbWVudCB0YXNrIHt7dGFza19pZH19CgotIENvcmUgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCBhcyBzcGVjaWZpZWQKLSBEZXBlbmRlbmNpZXMgYW5kIGNvbmZpZ3VyYXRpb24gYWRkZWQKLSBQcm9qZWN0IHN0cnVjdHVyZSBjcmVhdGVkIGFuZCB2YWxpZGF0ZWQKLSBCcmFuY2g6ICRDVVJSRU5UX0JSQU5DSAoK8J+kliBBdXRvLWdlbmVyYXRlZCBieSBvcmNoZXN0cmF0b3IgY29kZSBhZ2VudCIKICAgIGZpCmVsc2UKICAgIENPTU1JVF9NU0c9ImZlYXQoe3tzZXJ2aWNlX25hbWV9fSk6IGltcGxlbWVudCB0YXNrIHt7dGFza19pZH19CgotIENvcmUgZnVuY3Rpb25hbGl0eSBpbXBsZW1lbnRlZCBhcyBzcGVjaWZpZWQKLSBEZXBlbmRlbmNpZXMgYW5kIGNvbmZpZ3VyYXRpb24gYWRkZWQKLSBQcm9qZWN0IHN0cnVjdHVyZSBjcmVhdGVkIGFuZCB2YWxpZGF0ZWQKLSBCcmFuY2g6ICRDVVJSRU5UX0JSQU5DSAoK8J+kliBBdXRvLWdlbmVyYXRlZCBieSBvcmNoZXN0cmF0b3IgY29kZSBhZ2VudCIKZmkKCmlmIGdpdCBjb21taXQgLW0gIiRDT01NSVRfTVNHIjsgdGhlbgogICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBjb21taXR0ZWQgaW1wbGVtZW50YXRpb24gY2hhbmdlcyIKZWxzZQogICAgZWNobyAi4p2MIEZhaWxlZCB0byBjb21taXQgY2hhbmdlcyIKICAgIGV4aXQgMQpmaQoKIyBQdXNoIHRoZSBjdXJyZW50IGZlYXR1cmUgYnJhbmNoCmlmIGdpdCBwdXNoIC11IG9yaWdpbiAiJENVUlJFTlRfQlJBTkNIIjsgdGhlbgogICAgZWNobyAi4pyFIFN1Y2Nlc3NmdWxseSBwdXNoZWQgZmVhdHVyZSBicmFuY2g6ICRDVVJSRU5UX0JSQU5DSCIKZWxzZQogICAgZWNobyAi4p2MIEZhaWxlZCB0byBwdXNoIGZlYXR1cmUgYnJhbmNoIgogICAgZXhpdCAxCmZpCgojIENoZWNrIGlmIENsYXVkZSBjcmVhdGVkIGEgUFIgZGVzY3JpcHRpb24KUFJfREVTQ19GSUxFPSJQUl9ERVNDUklQVElPTi5tZCIKaWYgWyAtZiAiJFBSX0RFU0NfRklMRSIgXTsgdGhlbgogICAgZWNobyAi4pyFIEZvdW5kIFBSIGRlc2NyaXB0aW9uIGZyb20gQ2xhdWRlIgogICAgQ0xBVURFX1BSX0RFU0M9JChjYXQgIiRQUl9ERVNDX0ZJTEUiKQplbHNlCiAgICBlY2hvICLimqDvuI8gTm8gUFIgZGVzY3JpcHRpb24gZmlsZSBmb3VuZCBmcm9tIENsYXVkZSIKICAgIENMQVVERV9QUl9ERVNDPSIiCmZpCgojIERlYnVnOiBDaGVjayBnaCBDTEkgYXZhaWxhYmlsaXR5IGFuZCBhdXRoCmVjaG8gIj09PSBHaXRIdWIgQ0xJIENoZWNrID09PSIKaWYgY29tbWFuZCAtdiBnaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIGVjaG8gIuKchSBnaCBDTEkgaXMgYXZhaWxhYmxlIgogICAgZ2ggdmVyc2lvbgoKICAgICMgQ2hlY2sgYXV0aGVudGljYXRpb24KICAgIGlmIGdoIGF1dGggc3RhdHVzIDI+JjEgfCBncmVwIC1xICJMb2dnZWQgaW4iOyB0aGVuCiAgICAgICAgZWNobyAi4pyFIGdoIENMSSBpcyBhdXRoZW50aWNhdGVkIgogICAgZWxzZQogICAgICAgIGVjaG8gIuKdjCBnaCBDTEkgaXMgbm90IGF1dGhlbnRpY2F0ZWQiCiAgICAgICAgZWNobyAiQXR0ZW1wdGluZyB0byBhdXRoZW50aWNhdGUgd2l0aCBHSVRIVUJfVE9LRU4uLi4iCiAgICAgICAgaWYgWyAtbiAiJEdJVEhVQl9UT0tFTiIgXTsgdGhlbgogICAgICAgICAgICBlY2hvICIkR0lUSFVCX1RPS0VOIiB8IGdoIGF1dGggbG9naW4gLS13aXRoLXRva2VuCiAgICAgICAgZmkKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKdjCBnaCBDTEkgaXMgbm90IGF2YWlsYWJsZSIKZmkKCiMgQ3JlYXRlIFBSIGZyb20gZmVhdHVyZSBicmFuY2ggdG8gbWFpbgppZiBjb21tYW5kIC12IGdoID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgIyBHZW5lcmF0ZSBtb3JlIGRlc2NyaXB0aXZlIFBSIHRpdGxlCiAgICBpZiBbIC1mICIkUFJfREVTQ19GSUxFIiBdOyB0aGVuCiAgICAgICAgQ0xBVURFX1RJVExFX1NVTU1BUlk9JChoZWFkIC1uIDEgIiRQUl9ERVNDX0ZJTEUiIHwgY3V0IC1jMS02MCkKICAgICAgICBpZiBbIC1uICIkQ0xBVURFX1RJVExFX1NVTU1BUlkiIF0gJiYgWyAkeyNDTEFVREVfVElUTEVfU1VNTUFSWX0gLWd0IDE1IF07IHRoZW4KICAgICAgICAgICAgUFJfVElUTEU9ImZlYXQ6ICRDTEFVREVfVElUTEVfU1VNTUFSWSIKICAgICAgICBlbHNlCiAgICAgICAgICAgIFBSX1RJVExFPSJmZWF0KHt7c2VydmljZV9uYW1lfX0pOiBpbXBsZW1lbnQgdGFzayB7e3Rhc2tfaWR9fSAtIHt7dGFza190aXRsZX19IgogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgUFJfVElUTEU9ImZlYXQoe3tzZXJ2aWNlX25hbWV9fSk6IGltcGxlbWVudCB0YXNrIHt7dGFza19pZH19IC0ge3t0YXNrX3RpdGxlfX0iCiAgICBmaQoKICAgICMgQnVpbGQgY29tcHJlaGVuc2l2ZSBQUiBib2R5CiAgICBpZiBbIC1uICIkQ0xBVURFX1BSX0RFU0MiIF07IHRoZW4KICAgICAgICBQUl9CT0RZPSIkQ0xBVURFX1BSX0RFU0MKCi0tLQoKIyMg8J+TiyBJbXBsZW1lbnRhdGlvbiBEZXRhaWxzCgoqKlRhc2s6Kioge3t0YXNrX2lkfX0ge3sjaWYgdGFza190aXRsZX19LSB7e3Rhc2tfdGl0bGV9fXt7L2lmfX0KKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0KKipJbXBsZW1lbnRhdGlvbjoqKiBDbGF1ZGUgQ29kZSBBZ2VudCB2aWEgb3JjaGVzdHJhdG9yCgojIyMg8J+UhCBXb3JrZmxvdyBTdW1tYXJ5Ci0g4pyFICoqUmVxdWlyZW1lbnRzIEFuYWx5c2lzKio6IFRhc2sgc3BlY2lmaWNhdGlvbnMgcmV2aWV3ZWQgYW5kIHVuZGVyc3Rvb2QKLSDinIUgKipJbXBsZW1lbnRhdGlvbioqOiBDb2RlIGdlbmVyYXRlZCBmb2xsb3dpbmcgcHJvamVjdCBzdGFuZGFyZHMKLSDinIUgKipWYWxpZGF0aW9uKio6IEFjY2VwdGFuY2UgY3JpdGVyaWEgYWRkcmVzc2VkCi0g4pyFICoqUmV2aWV3Kio6IFJlYWR5IGZvciBodW1hbiByZXZpZXcgYW5kIHRlc3RpbmcKCiMjIyDwn5OKIEZpbGVzIE1vZGlmaWVkL0NyZWF0ZWQKJChnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIEhFQUR+MSB8IHNlZCAncy9eLy0gLycpCgojIyMg8J+Pt++4jyBNZXRhZGF0YQotICoqR2VuZXJhdGVkIGJ5OioqIENsYXVkZSBDb2RlIEFnZW50Ci0gKipQUiBDcmVhdGVkIGJ5OioqIE9yY2hlc3RyYXRvciBIb29rCi0gKipCcmFuY2g6KiogXGAkQ1VSUkVOVF9CUkFOQ0hcYCDihpIgXGBtYWluXGAKLSAqKlRpbWVzdGFtcDoqKiAkKGRhdGUgLXUgK1wiJVktJW0tJWQgJUg6JU06JVMgVVRDXCIpCi0gKipUYXNrIElEOioqIHt7dGFza19pZH19Ci0gKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0KCiMjIyDinIUgUmVhZHkgZm9yIFJldmlldwpUaGlzIFBSIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgb3JjaGVzdHJhdG9yIGltcGxlbWVudGF0aW9uIHdvcmtmbG93LgpUaGUgQ2xhdWRlIGFnZW50IGhhcyBjb21wbGV0ZWQgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBhZGRyZXNzZWQgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEuCgrwn6SWICoqQXV0by1nZW5lcmF0ZWQgYnkgb3JjaGVzdHJhdG9yKiogLSBSZXZpZXcsIHRlc3QsIGFuZCBtZXJnZSB3aGVuIHJlYWR5IgogICAgZWxzZQogICAgICAgICMgRmFsbGJhY2sgdG8gdGVtcGxhdGUgaWYgbm8gQ2xhdWRlIGRlc2NyaXB0aW9uCiAgICAgICAgUFJfQk9EWT0iIyMg8J+agCBJbXBsZW1lbnRhdGlvbiBDb21wbGV0ZQoKKipUYXNrIElEOioqIHt7dGFza19pZH19e3sjaWYgdGFza190aXRsZX19CioqVGFzayBUaXRsZToqKiB7e3Rhc2tfdGl0bGV9fXt7L2lmfX0KKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0KKipJbXBsZW1lbnRhdGlvbiBBZ2VudDoqKiBDbGF1ZGUgQ29kZSBBZ2VudAoqKldvcmtmbG93OioqIE9yY2hlc3RyYXRvciBJbXBsZW1lbnRhdGlvbiBQaXBlbGluZQoqKlRpbWVzdGFtcDoqKiAkKGRhdGUgLXUgK1wiJVktJW0tJWQgJUg6JU06JVMgVVRDXCIpCgotLS0KCiMjIPCfk4sgSW1wbGVtZW50YXRpb24gU3VtbWFyeQoKIyMjIOKchSBDb21wbGV0ZWQgV29yawotICoqUmVxdWlyZW1lbnRzIEFuYWx5c2lzKio6IFRhc2sgc3BlY2lmaWNhdGlvbnMgcmV2aWV3ZWQgYW5kIHVuZGVyc3Rvb2QKLSAqKkNvZGUgSW1wbGVtZW50YXRpb24qKjogQ29yZSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGFzIHNwZWNpZmllZAotICoqRGVwZW5kZW5jaWVzKio6IEFsbCBuZWNlc3NhcnkgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uIGFkZGVkCi0gKipQcm9qZWN0IFN0cnVjdHVyZSoqOiBQcm9wZXIgc3RydWN0dXJlIGNyZWF0ZWQgYW5kIHZhbGlkYXRlZAotICoqUXVhbGl0eSBBc3N1cmFuY2UqKjogQ29kZSBmb2xsb3dzIHByb2plY3Qgc3RhbmRhcmRzIGFuZCBjb252ZW50aW9ucwoKIyMjIPCflIQgV29ya2Zsb3cgRGV0YWlscwotICoqU291cmNlIEJyYW5jaCoqOiBcYCRDVVJSRU5UX0JSQU5DSFxgCi0gKipUYXJnZXQgQnJhbmNoKio6IFxgbWFpblxgCi0gKipXb3JraW5nIERpcmVjdG9yeSoqOiB7eyNpZiB3b3JraW5nX2RpcmVjdG9yeX19XGB7e3dvcmtpbmdfZGlyZWN0b3J5fX1cYHt7ZWxzZX19XGB7e3NlcnZpY2VfbmFtZX19XGB7ey9pZn19CgojIyMg8J+TiiBGaWxlcyBDaGFuZ2VkCiQoZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyBIRUFEfjEgfCBzZWQgJ3MvXi8tIC8nIHwgaGVhZCAtMjApCgokKGlmIFsgJChnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIEhFQUR+MSB8IHdjIC1sKSAtZ3QgMjAgXTsgdGhlbgogICAgZWNobyAiLi4uIGFuZCAkKCgkKGdpdCBkaWZmIC0tbmFtZS1zdGF0dXMgSEVBRH4xIHwgd2MgLWwpIC0gMjApKSBtb3JlIGZpbGVzIgpmaSkKCiMjIyDwn4+377iPIE1ldGFkYXRhCi0gKipHZW5lcmF0ZWQgYnk6KiogQ2xhdWRlIENvZGUgQWdlbnQKLSAqKlBSIENyZWF0ZWQgYnk6KiogT3JjaGVzdHJhdG9yIEhvb2sKLSAqKkJyYW5jaDoqKiBcYCRDVVJSRU5UX0JSQU5DSFxgIOKGkiBcYG1haW5cYAotICoqVGltZXN0YW1wOioqICQoZGF0ZSAtdSArXCIlWS0lbS0lZCAlSDolTTolUyBVVENcIikKLSAqKlRhc2sgSUQ6Kioge3t0YXNrX2lkfX0KLSAqKlNlcnZpY2U6Kioge3tzZXJ2aWNlX25hbWV9fQoKIyMjIOKchSBSZWFkeSBmb3IgUmV2aWV3ClRoaXMgUFIgd2FzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgb3JjaGVzdHJhdG9yIGltcGxlbWVudGF0aW9uIHdvcmtmbG93LgpUaGUgQ2xhdWRlIGFnZW50IGhhcyBjb21wbGV0ZWQgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBhZGRyZXNzZWQgYWxsIGFjY2VwdGFuY2UgY3JpdGVyaWEuCgrwn6SWICoqQXV0by1nZW5lcmF0ZWQgYnkgb3JjaGVzdHJhdG9yKiogLSBSZXZpZXcsIHRlc3QsIGFuZCBtZXJnZSB3aGVuIHJlYWR5IgogICAgZmkKCiAgICBlY2hvICI9PT0gQ3JlYXRpbmcgUHVsbCBSZXF1ZXN0ID09PSIKICAgIGVjaG8gIlRpdGxlOiAkUFJfVElUTEUiCiAgICBlY2hvICJCYXNlOiBtYWluIgogICAgZWNobyAiSGVhZDogJENVUlJFTlRfQlJBTkNIIgoKICAgIGlmIGdoIHByIGNyZWF0ZSBcCiAgICAgICAgLS10aXRsZSAiJFBSX1RJVExFIiBcCiAgICAgICAgLS1ib2R5ICIkUFJfQk9EWSIgXAogICAgICAgIC0tYmFzZSAibWFpbiIgXAogICAgICAgIC0taGVhZCAiJENVUlJFTlRfQlJBTkNIIiAyPiYxOyB0aGVuCiAgICAgICAgZWNobyAi4pyFIFB1bGwgcmVxdWVzdCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSIKICAgICAgICBlY2hvICLwn5OdIFBSOiAkUFJfVElUTEUiCiAgICAgICAgZWNobyAi8J+UlyBGcm9tOiAkQ1VSUkVOVF9CUkFOQ0gg4oaSIG1haW4iCgogICAgICAgICMgU2F2ZSBQUiBVUkwgaWYgcG9zc2libGUKICAgICAgICBQUl9VUkw9JChnaCBwciB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgICAgIGlmIFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICAgICAgICAgICAgZWNobyAi8J+UlyBQUiBVUkw6ICRQUl9VUkwiCiAgICAgICAgICAgIGVjaG8gIiRQUl9VUkwiID4gLnByLXVybAogICAgICAgIGZpCiAgICBlbHNlCiAgICAgICAgZWNobyAi4p2MIFBSIGNyZWF0aW9uIGZhaWxlZCIKICAgICAgICBlY2hvICJQb3NzaWJsZSByZWFzb25zOiIKICAgICAgICBlY2hvICItIFBSIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGJyYW5jaCIKICAgICAgICBlY2hvICItIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaXNzdWUiCiAgICAgICAgZWNobyAiLSBOZXR3b3JrIGNvbm5lY3Rpdml0eSBpc3N1ZSIKICAgICAgICBlY2hvICItIFJlcG9zaXRvcnkgcGVybWlzc2lvbnMgaXNzdWUiCiAgICBmaQoKICAgICMgQXR0ZW1wdCB0byBhZGQgY29ycmVsYXRpb24gbGFiZWxzICh0YXNrL3J1bi9zZXJ2aWNlKSBldmVuIGlmIFBSIGFscmVhZHkgZXhpc3RlZAogICAgZWNobyAiPT09IEVuc3VyaW5nIGNvcnJlbGF0aW9uIGxhYmVscyBvbiBQUiA9PT0iCiAgICAjIERlcml2ZSByZXBvc2l0b3J5IHNsdWcgZnJvbSBvcmlnaW4gcmVtb3RlCiAgICBSRVBPX1NMVUc9IiIKICAgIGlmIE9SSUdJTl9VUkw9JChnaXQgLUMgLiByZW1vdGUgZ2V0LXVybCBvcmlnaW4gMj4vZGV2L251bGwpOyB0aGVuCiAgICAgIGlmIGVjaG8gIiRPUklHSU5fVVJMIiB8IGdyZXAgLXFFICdeaHR0cHM6Ly9naXRodWIuY29tLyc7IHRoZW4KICAgICAgICBSRVBPX1NMVUc9JChlY2hvICIkT1JJR0lOX1VSTCIgfCBzZWQgLUUgJ3N8aHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgICAgIGVsaWYgZWNobyAiJE9SSUdJTl9VUkwiIHwgZ3JlcCAtcUUgJ15naXRAZ2l0aHViLmNvbTonOyB0aGVuCiAgICAgICAgUkVQT19TTFVHPSQoZWNobyAiJE9SSUdJTl9VUkwiIHwgc2VkIC1FICdzfGdpdEBnaXRodWIuY29tOihbXi9dKy9bXi9dKykoXFwuZ2l0KT98XFwxfCcpCiAgICAgIGZpCiAgICBmaQoKICAgICMgUmVzb2x2ZSBQUiBudW1iZXIgYnkgaGVhZCBicmFuY2ggaWYgbmVlZGVkCiAgICBpZiBbIC16ICIkUFJfVVJMIiBdOyB0aGVuCiAgICAgIFBSX1VSTD0kKGdoIHByIHZpZXcgLVIgIiRSRVBPX1NMVUciIC0tanNvbiB1cmwgLXEgLnVybCAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgZmkKICAgIFBSX05VTUJFUj0iIgogICAgUFJfTlVNQkVSPSQoZ2ggcHIgbGlzdCAtUiAiJFJFUE9fU0xVRyIgLS1oZWFkICIkQ1VSUkVOVF9CUkFOQ0giIC0tanNvbiBudW1iZXIgLS1qcSAnLlswXS5udW1iZXInIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBbIC16ICIkUFJfTlVNQkVSIiBdICYmIFsgLW4gIiRQUl9VUkwiIF07IHRoZW4KICAgICAgUFJfTlVNQkVSPSQoZ2ggcHIgdmlldyAiJFBSX1VSTCIgLS1qc29uIG51bWJlciAtcSAubnVtYmVyIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBmaQoKICAgIGlmIFsgLW4gIiRQUl9OVU1CRVIiIF07IHRoZW4KICAgICAgIyBCdWlsZCBsYWJlbHMgZnJvbSBlbnZpcm9ubWVudCB3aGVuIGF2YWlsYWJsZTsgZmFsbCBiYWNrIHRvIG1pbmltYWwKICAgICAgVEFTS19MQUJFTD0idGFzay0ke1RBU0tfSUQ6LXt7dGFza19pZH19fSIKICAgICAgUlVOX0xBQkVMPSJydW4tJHtXT1JLRkxPV19OQU1FOi0ke1JVTl9OQU1FOi11bmtub3dufX0iCiAgICAgIFNFUlZJQ0VfTEFCRUw9InNlcnZpY2UtJHtTRVJWSUNFX05BTUU6LXt7c2VydmljZX19fSIKCiAgICAgIGVjaG8gIvCfj7fvuI8gQWRkaW5nIGxhYmVscyB0byBQUiAjJFBSX05VTUJFUiBvbiAkUkVQT19TTFVHOiAkVEFTS19MQUJFTCwgJFJVTl9MQUJFTCwgJFNFUlZJQ0VfTEFCRUwiCiAgICAgIExBQkVMX0VSUk9SPSQoZ2ggcHIgZWRpdCAiJFBSX05VTUJFUiIgLVIgIiRSRVBPX1NMVUciIC0tYWRkLWxhYmVsICIkVEFTS19MQUJFTCwkUlVOX0xBQkVMLCRTRVJWSUNFX0xBQkVMIiAyPiYxKQogICAgICBpZiBbICQ/IC1uZSAwIF07IHRoZW4KICAgICAgICBlY2hvICLimqDvuI8gRmFpbGVkIHRvIGFkZCBsYWJlbHMgaW4gb25lIHNob3Q6ICRMQUJFTF9FUlJPUiIKICAgICAgICAjIEVuc3VyZSBsYWJlbHMgZXhpc3QsIHRoZW4gYWRkIGluZGl2aWR1YWxseQogICAgICAgIGZvciBsYWJlbCBpbiAiJFRBU0tfTEFCRUwiICIkUlVOX0xBQkVMIiAiJFNFUlZJQ0VfTEFCRUwiOyBkbwogICAgICAgICAgaWYgISBnaCBsYWJlbCBsaXN0IC1SICIkUkVQT19TTFVHIiAtLXNlYXJjaCAiJGxhYmVsIiB8IGdyZXAgLXEgIl4kbGFiZWwiOyB0aGVuCiAgICAgICAgICAgIGNhc2UgIiRsYWJlbCIgaW4KICAgICAgICAgICAgICB0YXNrLSopIENPTE9SPSJmMjk1MTMiOyBERVNDPSJUYXNrIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAgIHJ1bi0qKSBDT0xPUj0iMDM2NmQ2IjsgREVTQz0iV29ya2Zsb3cgcnVuIGNvcnJlbGF0aW9uIiA7OwogICAgICAgICAgICAgIHNlcnZpY2UtKikgQ09MT1I9IjBlOGExNiI7IERFU0M9IlNlcnZpY2UgY29ycmVsYXRpb24iIDs7CiAgICAgICAgICAgICAgKikgQ09MT1I9ImVkZWRlZCI7IERFU0M9IkNvcnJlbGF0aW9uIGxhYmVsIiA7OwogICAgICAgICAgICBlc2FjCiAgICAgICAgICAgIGdoIGxhYmVsIGNyZWF0ZSAiJGxhYmVsIiAtUiAiJFJFUE9fU0xVRyIgLS1jb2xvciAiJENPTE9SIiAtLWRlc2NyaXB0aW9uICIkREVTQyIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICAgICAgZmkKICAgICAgICAgIGdoIHByIGVkaXQgIiRQUl9OVU1CRVIiIC1SICIkUkVQT19TTFVHIiAtLWFkZC1sYWJlbCAiJGxhYmVsIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgICAgZG9uZQogICAgICBlbHNlCiAgICAgICAgZWNobyAi4pyFIENvcnJlbGF0aW9uIGxhYmVscyBlbnN1cmVkIG9uIFBSIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvICLimqDvuI8gQ291bGQgbm90IHJlc29sdmUgUFIgbnVtYmVyIGZvciBsYWJlbGluZyIKICAgIGZpCmVsc2UKICAgIGVjaG8gIuKdjCBHaXRIdWIgQ0xJIG5vdCBhdmFpbGFibGUgLSBQUiBtdXN0IGJlIGNyZWF0ZWQgbWFudWFsbHkiCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5OLIE1hbnVhbCBQUiBDcmVhdGlvbiBEZXRhaWxzOiIKICAgIGVjaG8gIuKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIvCfj7fvuI8gIFRJVExFOiAkUFJfVElUTEUiCiAgICBlY2hvICIiCiAgICBlY2hvICLwn5ONIEJSQU5DSCBJTkZPOiIKICAgIGVjaG8gIiAgIOKAoiBGcm9tOiAkQ1VSUkVOVF9CUkFOQ0giCiAgICBlY2hvICIgICDigKIgVG86IG1haW4iCiAgICBlY2hvICIgICDigKIgVHlwZTogRmVhdHVyZSBpbXBsZW1lbnRhdGlvbiIKCiAgICBpZiBbIC1uICIkQ0xBVURFX1BSX0RFU0MiIF07IHRoZW4KICAgICAgICBlY2hvICIiCiAgICAgICAgZWNobyAi8J+TnSBDTEFVREUtR0VORVJBVEVEIERFU0NSSVBUSU9OOiIKICAgICAgICBlY2hvICLilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAiCiAgICAgICAgZWNobyAiJENMQVVERV9QUl9ERVNDIgogICAgICAgIGVjaG8gIuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCIKICAgIGZpCgogICAgZWNobyAiIgogICAgZWNobyAi8J+ThCBGVUxMIFBSIERFU0NSSVBUSU9OIChjb3B5LXBhc3RlIHJlYWR5KToiCiAgICBlY2hvICLilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAiCiAgICBpZiBbIC1uICIkQ0xBVURFX1BSX0RFU0MiIF07IHRoZW4KICAgICAgICBlY2hvICIkQ0xBVURFX1BSX0RFU0MiCiAgICAgICAgZWNobyAiIgogICAgICAgIGVjaG8gIi0tLSIKICAgICAgICBlY2hvICIiCiAgICBmaQogICAgZWNobyAiIyMg8J+agCBJbXBsZW1lbnRhdGlvbiBDb21wbGV0ZSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIioqVGFzayBJRDoqKiB7e3Rhc2tfaWR9fSIKICAgIHt7I2lmIHRhc2tfdGl0bGV9fQogICAgZWNobyAiKipUYXNrIFRpdGxlOioqIHt7dGFza190aXRsZX19IgogICAge3svaWZ9fQogICAgZWNobyAiKipTZXJ2aWNlOioqIHt7c2VydmljZV9uYW1lfX0iCiAgICBlY2hvICIqKkltcGxlbWVudGF0aW9uIEFnZW50OioqIENsYXVkZSBDb2RlIEFnZW50IgogICAgZWNobyAiKipXb3JrZmxvdzoqKiBPcmNoZXN0cmF0b3IgSW1wbGVtZW50YXRpb24gUGlwZWxpbmUiCiAgICBlY2hvICIqKlRpbWVzdGFtcDoqKiAkKGRhdGUgLXUgKyIlWS0lbS0lZCAlSDolTTolUyBVVEMiKSIKICAgIGVjaG8gIiIKICAgIGVjaG8gIiMjIyDwn5OKIEZpbGVzIENoYW5nZWQiCiAgICBnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIEhFQUR+MSB8IHNlZCAncy9eLy0gLycKICAgIGVjaG8gIiIKICAgIGVjaG8gIiMjIyDwn4+377iPIE1ldGFkYXRhIgogICAgZWNobyAiLSAqKkdlbmVyYXRlZCBieToqKiBDbGF1ZGUgQ29kZSBBZ2VudCIKICAgIGVjaG8gIi0gKipQUiBDcmVhdGVkIGJ5OioqIE1hbnVhbCBjcmVhdGlvbiAoR2l0SHViIENMSSB1bmF2YWlsYWJsZSkiCiAgICBlY2hvICItICoqQnJhbmNoOioqIFxgJENVUlJFTlRfQlJBTkNIXGAg4oaSIFxgbWFpblxgIgogICAgZWNobyAiLSAqKlRhc2sgSUQ6Kioge3t0YXNrX2lkfX0iCiAgICBlY2hvICItICoqU2VydmljZToqKiB7e3NlcnZpY2VfbmFtZX19IgogICAgZWNobyAiIgogICAgZWNobyAiIyMjIOKchSBSZWFkeSBmb3IgUmV2aWV3IgogICAgZWNobyAiVGhpcyBQUiBjb250YWlucyBpbXBsZW1lbnRhdGlvbiB3b3JrIGNvbXBsZXRlZCBieSB0aGUgQ2xhdWRlIENvZGUgQWdlbnQuIgogICAgZWNobyAiIgogICAgZWNobyAi8J+kliAqKlJlYWR5IGZvciByZXZpZXcgYW5kIG1lcmdlKioiCiAgICBlY2hvICLilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIEiCmZpCgplY2hvICLwn46JIENvZGUgaW1wbGVtZW50YXRpb24gc3RvcCBob29rIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIgo=